大阪大学大学院医学系研究科 麻酔科集中治療医学講座

  • TOP
  • 麻酔学講座
  • 関連施設
  • 研究生・学生の方へ
  • 各種マニュアル
  • リンク集
  • 各種マニュアル
    大阪大学大学院医学系研究科 麻酔集中治療医学講座 TOP各種マニュアルLaTeXの解説>2. LaTeXで論文を書こう>II.レファレンスの書式設定について
    LaTeXの解説

    II. レファレンスの書式設定について

     論文を作成する時に最も手間が掛かるのはレファレンスリストの作成でしょう. reviseなどでレファレンスの追加が必要になったりすると番号付けをやり直す必要があります.この作業はとても繁雑であり,採番ミスを起こすこともあります. 雑誌によってはxxa, xxbのようにして番号付けをやり直すなとしているものさえあるくらいです.
    LaTeXにはBibTeXという文献データベースからレファレンスリストを自動生成してくれるシステムがあります.これを用いればリファレンス番号の付け直しやスタイルの変更などが簡単に行えます.もちろんBibTeXを用いなくても手動でレファレンスリストを作成することもできますが,レファレンスが多くなって来るととても大変な作業になります.
    BibTeXを動かすにはBibTeX本体以外に文献データベースファイル(bib file)と文 献スタイルファイル(bst file)が必要になります. BibTeXはbibファイルからbblファイルというレファレンスリストを作成します. LaTeXは最終的にこれを取り込んで出力するしくみになっています.従ってどうしてもうまくいかない場合は部分的に手動でこのbblファイルに手を加えるということも可能です.
    ここではBibTeXの使用方法などについては既に知っているものとして話を進めます.

    ※ 標準の文献スタイルファイルについて

     BibTeXには標準でplain, alpha, abbrv, unsrtの4種のスタイルファイルが附属しています.jBibTeXではjplain, jalpha, jabbrv, junsrt, jipsj.bst, jorsj.bstが附属しています.
    1. plain : 最も標準的なスタイル
    2. alpha : 文献の「番号」が[Kun91]のように著者名の最初の3文字と出版年を合わせたものになっているスタイルファイル
    3. abbrv : できるだけ短くするスタイルファイル
    4. unsrt : 本文で引用した順に並べるスタイルファイル
    BibTeXの詳細なコマンドが知りたい方はbtxdoc, btxhakを日本語にした解説を参照して下さい.

    II-1. 文献データベース (bib file)について

      BibTeXを使用するためにはまず,文献データベースを作成する必要があります. list 1は文献データベースの一部です.
    list 1

    @article{Trache-D,
    title = "Tracheal intubation with a {R}obershaw tube via a
    tracheostomy",
    author = "P M Simpson",
    journal = "Br J Anaesth",
    year = 1976,
    volume = 48,
    pages = "373-375",
    }

    @article{UNIVENT,
    title = "New device for one-lung anesthesia",
    author = "H Inoue and A Shoutsu and J Ogawa and S Koike
    and S Kawada",
    journal = "J Thoracic Cardiovasc Surg.",
    year = 1982,
    volume = 83,
    pages = "940-941",
    }

    @inbook{One-indication,
    title = "Anesthesia",
    author = "J L Benumof",
    editor = "R D Miller",
    chapter = "Indication of one lung anesthesia",
    publisher = "Churchill Livingstone Inc.",
    address = "New York",
    pages = "1689-1690",
    year = 1992,
    }

    @book{TEST1,
    title = "{N}eural {B}lockade in {C}linical {A}nesthesia and
    {M}anagement of {P}ain",
    author = "M J Cousins", year = 1980, address = "Philadelphia",
    publisher = "JB Lippincott",
    pages = "525-530",
    }
     ひとつのデータベースは@article{や@book{で始まり,}までがひとまとまりになります.最初が@でないブロックは無視されますので,コメントなどを自由に書くことができます.
    titleでは先頭の文字以外は小文字になってしまいますから,大文字にしたい場合にはその文字を{}で囲って下さい.もちろんLaTeXの書式は全て使用できますので,math環境を用いて下付き小文字や上付き小文字,ラテン文字などを入れることもできます.
    データベースの詳細については「LaTeX2ε美文書作成入門」奥村 晴彦[著]などを参考にして下さい.
    医学系では文献検索システムとしてPubMedがよく用いられます.私は,この検索結果からBibTeX用のデータベースを自動作成するスクリプトを作成して使用しています.これはGNU awkで動くものです.そのまま利用される方は少ないと思いますが,download できるようにしてあります.このmkbib2を使用するにはPubMed上でMEDLINE形式 を指定し,ファイルに転送するようにして検索結果をローカルに持って来ます.後はmkbib2コマンドでこのファイルを指定して処理すればbibファイルが自動作成されます.なお,現在Mac OSXで使用しているために改行コードを変換するcr.awkを入れていますが,必要なければmkbib2のcr.awkの記述を削除して使用して下さい.また,pm2bib1.awk, pm2bib2.awkの最初に出力する改行コードをCRLFで記述していますので,ここも環境に合わせて修正して下さい.

    II-2. 文献スタイルファイル (bst file)について

     おそらくこれを目的に合うように改変するのが最もやっかいなのではないかと思います.もしかすると便利なツールがあるのかもしれませんが,不幸にして私は知りません.btxbstなどというのもありますが,ある程度の範囲内でしか操作で きないようでした.
    BibTeXには最初からいくつかのbstファイルが附属しています.plain.bst, alpha.bst, abbrv.bstなどがあります.それぞれauthorの表記法とかレファレン スのソート順などが異なっています.
    私自身は,bstファイルがどのような言語体系で書かれているかも知りませんの で,非常にゲリラ的に直観と類推でこれらのファイルを改変して使用しております.ここではmanuscript-1.94.tar.gzパッケージに同梱したbstファイル生成ツールcbstの解説を兼ねながら話を進めます.Ver1.94では後述するchicagoスタイル形式の引用文献リスト作成にも対応しております.なお,DOS/Windowsの環境の方はmanuscript-1.93win.tar.gz を使用して下さい.UNIX版と同じbstファイルが作成できます.(最初はmakebstという名前で開発しましたが,同名のソフトが既に存在していたことに気付いたため名前を変更しました.) cbstは簡単な定義ファイルを元に目的に合ったbstファイルを作成するためのツールです.cbstはarticle, bookなどの形式ごとの書式を簡単な文法で定義ファイル(defファイル)に記述しておき,これをtypeファイル(bstファイルのうちの article, bookなどの形式ごとの関数だけを記述したファイル)に変換するmktypeと,それ以外の設定を補助的に行う部分から構成されます.従って手操作でtypeファイルを作成してcbstを使用することも可能です.mktypeでサポートしていない細かな記述をしたい時にはこのようにするとよいでしょう.現在のバージョンmktype V0.99ではほぼ必要な機能を満たすものになっていると思います.少なくともplain.bstと同等のbstファイルをdefファイルから作成できる機能を持たせています.
    cbstではplain.bstベースもしくはalpha.bstベースですのものが作成できます.ソートなしの指定を行えばunsrt.bstと同等のものを作成することも可能です.
    defファイルから始める方法につきましてはmanuscript-1.94パッケージに同梱のReadme.docに記載していますのでこれについては省略します.先にReadme.docをお読み下さい.
    ここでは細かな設定を手操作で行うためのヒントについて記述します.
    なお,このパッケージを作成した当時の日本語コードはShift-JISもしくはEUCでしたが現在ではUTF8が標準になっておりますので,jcbstを使用する場合にはnkfなどで日本語コードを変換して使用して下さい.

    II-2-1. typeファイルの作成方法について

     cbstではplain.bst/alpha.bstに以下のglobal変数を追加しています. separator, pre, pre2, post, post2, str の6つです.これらはいずれも文字変数で,以下に示す関数を呼ぶ前に適切に設定しておく必要があります.なお,BibTeXではglobal変数は10個までに限定されているようです.どの関数にどの変 数が使用可能かはすべてコメントでbsoファイル(bstファイルの断片)に書いていますので参照して下さい.目的のbstをファイルを作成するのに書き方はいくつもありますが,ここではそのうちでもおそらく最も簡単であると考えられる方法を解説します.また,私自身はarticle, book, inbookしか使用していませんのでこれについてだけ解説します.
    bstファイルの詳細については後述します.ここでは単純にこのように書けばよいということだけを解説します.plain.bstではarticleを展開する関数は以下のように記述されています.よく見るとわかるようにauthorやtitleを出力するらしい関数は「(関数名) "フィールド名" output.check」もしくは「(関数名) output」の2通りの形式をしていることがわかります.これらのコマンドはコマンド行単位で入れ換えが可能です.このことを応用すればauthorとtitleの出力順を入れ換えることができます.実際にはoutputはそのitemが定義されていない場合には無視しますが,output.cehckではwarningが出されます.

    FUNCTION {article}
    { output.bibitem
     format.authors "author" output.check
     new.block
     format.title "title" output.check
     new.block
     crossref missing$
       { journal emphasize "journal" output.check
        format.vol.num.pages output
        format.date "year" output.check
       }
       { format.article.crossref output.nonnull
        format.pages output
       }
     if$
     new.block
     note output
     fin.entry
    }

    list 2


     

    plain.bstではauthor, title, journal, volume, number, page, yearをこの順で出力しています.このうちvolume, number, pageはformat.vol.num.pages関数を使用してまとめて出力するようになっていますが,これらの出力順が変わることも考えられますので,ここではすべてのitemをそれぞれ独立して出力できるように配慮しました.また個々のitemの前後に文字列を挿入できるようにしています.これによってレイアウトを自由に操作できるようになりました.これらの目的のために汎用の出力補助関数としてformat.strとformat.str2を作成しています.format.str2は目的のitemをstr変数に代入する処理を関数側で行わせるようにして\BibTeX コマンドのコンパクト化を図ったものです.また,output.pre, output.post, output.pre.postというコマンドを追加しました.これらはoutputコマンドの機能に加えて,itemの前後に種々の文字列を付け加えて出力する機能を持っています.これらの使用方法を以下に解説します.
    以下にbase.bstのarticle関数を示します.先のplain.bstのものと比較してみて下さい.

    FUNCTION {article}
    { output.bibitem
     " and " format.authors2 "author" output.check
     new.block
     format.title "title" output.check
     new.block
     crossref missing$
     {
      journal emphasize format.str2 "journal" output.check
      "(" 'pre :=
      ")" 'post :=
      ":" format.vol.num.pages2 output
      year format.str2 "year" output.check
     }
     {
      format.article.crossref output.nonnull
      format.pages2 output
     }
     if$
     new.block
     note output
     fin.entry
    }

      見ればわかると思いますが,いくつかのコマンドが置き換わっています.例えばformat.authorsはformat.authors2になっています.format.authors2は最後の著者とその前の著者の間の区切り文字が指定できるようにformat.authorsを改変したコマンドです.デフォルトに合わせるにはリストのように" and "を指定しておく必要があります.
    同様にformat.vol.num.pagesはformat.vol.num.pages2というコマンドに変更されています.このコマンドの前には"(" 'pre :=というコマンドがありますが,これは代入文ではpreという名前の変数に"("という文字列を代入することを意味します.format.vol.num.pages2ではこのようにして予めpreとpostの変数に numberの前後に付ける文字列を設定しておき,さらにpagesとの区切り文字を前置して呼ぶように書かれています.従ってnumberを[]で括りたい時にはここの設定を変更すれば目的の出力が得られます.
    この他format.str2というコマンドが見られますが,これはitemをチェックする作用を持つコマンドです.以前はformat.strというstrの内容をpre, postを前後に付ける作用を持たせた関数を使用していましたが,\BibTeX の"*"コマンドを使用すればより効率よくコマンドが組めることが判明しましたので形式を変更しました. "*"コマンドはスタック上で2つの文字列を連結させる作用を持っています.例えばyearを()で括ることを想定しましょう.この場合次ぎのように書くとうまく出力できます.

    "(" year * ")" * format.str2 "year" output.check

    yearの後ろにitalicにするためのemphasizeや太文字に変更するためのbold(私が追加しました)といったコマンドを入れて書体を変更することも可能です.
    上記の方法は必須であるitemに使用します.必須でないitemではこのようにするとitemが定義されていない場合に前後に設定された文字列だけが出力されてしまい問題が生じます.itemが必須でない場合に対応するために,base.bstではoutput.pre, output.post, output.pre.postという3つのコマンドが追加されています.これらは以下のように使用します.

    "Vol. " volume output.pre
    ")" number output.post
    "[" "]" year output.pre.post

    最初のoutput.preではitemの前に置く文字列を最初に置きます.output.postでも書式はoutput.preと同様ですが,文字列はitemの後ろに置かれます.最後の output.pre.postでは前後に置く文字列をそれぞれ前置します.このようにしますとyearが[]で括られて出力されます.yearが省略された場合には何も出力されません.
    このようにして必須のitemとオプションのitemの出力の前後に任意の文字列が配置できます.
    特殊な例ではeditorのように単数形と複数形で置かれる文字列が異なる場合があります.これに対応するためにformat.editors2ではeditorが単数の場合の前後に置く文字列をpre, postで設定し,複数の場合にはpre2, post2で設定するようにして対応しています.

    II-2-2. item間の区切り文字の変更について

     雑誌によってはauthorとtitleの区切りが": "であったり"; "であることもあります.plain.bstではnew.blockコマンドが使用された場合には". "が用いられそ れ以外のitem間は", "が入るようになっています.これを簡単に変更できるようにするためにseparatorというglobal変数を新たに導入しました.separatorに目的の変数を入れてoutput.checkやoutputを呼ぶことで区切り文字を自由に操作できるようになります.なおseparator, pre, post, pre2, post2の5つの変数はoutput.checkやoutputが呼ばれると,最後に初期化するようにプログラムしていますので特殊な用途で設定を変更してもいちいち元に戻す記述をする必要はありません.strのみはワークに使用しているので初期値はありません.これはBibTeXではひとつのFUNCTIONにあまり長い記述ができないという制限があるため効率を重視し,このような仕様としました.
    separatorへの代入は各itemの出力コマンドの間に記述するとよいようになっています.書式の例を以下に示します.
    format.author "author" output.check
    ": " 'separator :
    = format.title "title" output.check

    II-2-3. authorの書式について

     plain.bstではauthorの名前の出力はlist 3のようになっています.
    list 3

    FUNCTION {format.names}
    { 's :=
     #1 'nameptr :=
     s num.names$ 'numnames :=
     numnames 'namesleft :=
      { namesleft #0 > }
      { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=
       nameptr #1 >
        { namesleft #1 >
          { ", " * t * }
          { numnames #2 >
            { "," * }
            'skip$
          if$
          t "others" =
            { " et~al." * }
            { " and " * t * }
          if$
         }
        if$
        }
        't
       if$
       nameptr #1 + 'nameptr :=
       namesleft #1 - 'namesleft :=
      }
     while$
    }
     

    雑誌によってauthor nameの表記方法が P.M. Simonであったり,Simon PMであったりします.plain.bstそのままではlist 1に対する出力は PM Simonのようになります.これはnameptr "{ff~}{vv~}{ll}{, jj}"の部分で決定されます.ここを nameptr "{ll}{~vv}{~ff}{,jj}"のように変更すれば出力はSimon PMとなります. llはLast, ffはFirst, vvはvon, jjはjrです.ll,ffのように文字を2つ重ねた場合には文字列そのものが使用され,l,fのように1つだけの場合には頭文字だけに省略されます.省略形の場合BibTeXのデフォルトでは頭文字+'.'となりますがこれを変更したい場合には明示的に指示する必要があります.例えば頭文字だけにしたい時には{f{}}のように指示する必要があるということです.また{,jj} のように{}内に,を入れれば XXXX XX ,jrのようになります.
    {}内の~は切り離しできないスペースの意味です.つまり,この間で改行されなくなります.'~'はBiBTeXに必要ならtieを付ける指示をするものであり,常に tieでつなぐように指示するには'~~'を付けます.
    Don "Knuth"の名前(Donald Ervin Knuth)を変換するフォーマット式を以下に示します.

    Donald Ervin Knuth "{ff~}{vv~}{ll}{, jj}"
    DE Knuth "{f{}~}{v{}~}{ll}{, jj}"
    D. E Knuth "{f~}{v~}{ll}{, jj}"
    D. E. Knuth "{f.~}{v~}{ll}{, jj}"
    DE. Knuth "{f{}.~}{v{}~}{ll}{, jj}"
    D.E. Knuth "{f{.}.~}{v{}~}{ll}{, jj}"
    Knuth DE "{ll}{~f{}}{v{}}{, jj}"
    Knuth DE. "{ll}{~f{}.}{v{}}{, jj}"
    Knuth D. E. "{ll}{~f.}{v}{, jj}"
    Knuth, D. E. "{ll,}{~f.}{v}{, jj}"
    Knuth D.E. "{ll}{~f{.}.}{v{}~}{, jj}"

    また,plain.bstではレファレンスはlast nameでソートされます. ところで,雑誌によってはauthorが3人までなら3人の名前を列挙し,4人以上の場合には最初の3人だけを書きあとは'et al.'を付けなさいというように指示しているものもあります.このような場合にはlist 4のようにします.if$文を使用して,場合分けを行います. cbstではこのあたりの設定を対話的に行えるようになっています.
    list 4

    FUNCTION {format.names}
    { 's :=
      #1 'nameptr :=
      s num.names$ 'numnames :=
      numnames 'namesleft :=
      numnames #3 >
      {
     #4 'namesleft :=
       { namesleft #0 > }
       { s nameptr "{ll}{~vv}{~f{}}{,jj}" format.name$ 't :=
        nameptr #1 >
         { namesleft #1 >
           { ", " * t * }
           { ", et~al." * }
         if$
        }
        't
       if$
       nameptr #1 + 'nameptr :=
       namesleft #1 - 'namesleft :=
     }
    while$
    }
    {
      { namesleft #0 > }
      { s nameptr "{ll}{~vv}{~f{}}{,jj}" format.name$ 't :=
       nameptr #1 >
       { namesleft #1 >
         { ", " * t * }
         { numnames #1 >
          { "" * }
          'skip$
         if$
         t "others" =
          { " et~al." * }
          { ", " * t * }
         if$
         }
        if$
        }
        't
       if$
       nameptr #1 + 'nameptr :=
       namesleft #1 - 'namesleft :=
      }
     while$
     }
     if$
    }

    II-2-4. inbookでのauthor, editorの定義について

     plain.bstではinbookでauthor, editorを両方定義するとwarningが出ます.試し にlist 1のラベルを付けてBibTeXを動かすと4番目のinbookでこのwarningが出ま す.inbookの定義はlist 5のようになっております.
    list 5

    FUNCTION {inbook}
    { output.bibitem
      author empty$
        { format.editors "author and editor" output.check }
        { format.authors output.nonnull
          crossref missing$
           { "author and editor" editor either.or.check }
           'skip$
          if$
        }
      if$
      new.block
      format.btitle "title" output.check
      crossref missing$
        { format.bvolume output
         format.chapter.pages "chapter and pages" output.check
         new.block
         format.number.series output
         new.sentence
         publisher "publisher" output.check
         address output
        }
        { format.chapter.pages "chapter and pages" output.check
         new.block
         format.book.crossref output.nonnull
        }
      if$
      format.edition output
      format.date "year" output.check
      new.block
      note output
      fin.entry
    }


     "author and editor" editor either.or.checkが両方定義してある場合に warningを出すところだと推定できます.そこでこれをlist 6のように変更する とauthor, editorとも出力できます.
    list 6

    FUNCTION {inbook}
    { output.bibitem
      author empty$
       { format.editors "author and editor" output.check }
       { format.authors "author" output.check }
      if$
      format.chapter "chapter" output.check2
      editor empty$
       { "" }
       { format.editors "editor" output.check }
      if$
      " in " output2
      "" 'separator
      format.btitle "title" output.check
      new.block
      crossref missing$
       { format.bvolume output
        format.number.series output
        format.edition output
        new.sentence
        publisher "publisher" output.check
        address output
        format.date "year" output.check
        format.pages "pages" output.check
       }
       { format.chapter.pages "chapter and pages" output.check
        new.block
        format.book.crossref output.nonnull
       }
      if$
      new.block
      note output
      fin.entry
    }

    II-2-5. 出力に文字列を加える方法について

     出力に文字列を加えたいこともあると思います.cbstで作成する場合にはpre, postなどに文字列を設定することでほとんど対応できると思います.これで対応できない場合にはoutput.nonnullを使用して下さい.itemがnullでない時のみ文字列が出力されます.postを""に設定しておけばitemの前に文字列が挿入された形になりますし,separatorを""に設定しておけば前のitemに続いて文字列が出力されるようになります.スペースを入れたい場合には""の代わりに" "を指定して下さい.list 6を参照して下さい.この出力結果はlist 7のようになります.
    cbstではwrコマンドでこの指定が可能です. wr%"In "のように書きます.また,postを""にすることでカンマで区切られることを防ぎます.

    list 8

    Benumof JL: Indication of one lung anesthesia, in Miller RD (ed), Anesthesia.
    Churchill Livingstone Inc., 1992, pp 1689--1690.


    なおこの例ではformat.pagesや,format.editorなどにも少々の変更を加えています.
    "pp", "(ed.)"などの出力についての部分だけですが.

    II-2-6. sortingについて

     sortingはSORTコマンドでsort.key$をキーとして行われます.基本的には標準添付のbstファイルから目的に合ったものを選択してこれを改変して使用して下さい.
    plain.bstでのソートはauthor次いでyearをキーとして行われます.このため時として目的と異なる順にソートされてしまいます.例えばfirst authorが同じで second authorが異なる2つのレファレンスがあるとします.通常はこのような場合レファレンスの古い順にソートされるように指定されている雑誌が多いと思いますが,plain.bstではsecond authorの名前をキーとしてソートされるため順序が反対になってしまうこともあります.
    このような場合bibファイルに@PREAMBLEコマンドを利用して\noopsortというコマンドを定義しておき,\noopsortコマンドを実際に並べたい文献の中に埋めこんでおきます.例えばlist 8では\noopsortコマンドがないとsecond authorの TaubとGhazi-Saidi順にソートされるためE_phy3の方が古いにもかかわらず後に置かれてしまいます.second authorのlast nameの前に\noopsortコマンド入れて思い通りの順になるように指定してやればこの問題をクリアできます.
    list 8

    @PREAMBLE{ "\newcommand{\noopsort}[1]{} " }

    @article{E_phy3,
    author = "L. M. Kitahata and A. {\noopsort{a}}Taub and I. Sato",
    title = "Lamina-specific suppression of dorsal horn unit
    activity by nitrous oxide and by hyperventilation",
    journal = "J. Parmacol Exp. Ther.",
    volume = 176,
    year = 1971,
    pages = "101-108"
    }

    @article{E_phy4,
    author = "L. M. Kitahata and K. {\noopsort{b}}Ghazi-Saidi and M. Yamashita
    and Y. Kosaka and C. Bonikos and A. Taub",
    title = "Depressant effect of halothane and sodium thiopental on the
    spontaneous and evoked activity of dorsal horn cells: lamina
    specificity, time course and dose dependence",
    journal = "J. Parmacol Exp. Ther.",
    volume = 195,
    year = 1975,
    pages = "515-521"
    }
    @PREAMBLEコマンドはbblファイルの先頭にLaTeXのコマンドを埋め込むために用いるものです.
    bstファイルでのsortingはSORTコマンドで行われますが,実際の並べ方については以下の部分が下請けをしています.以下は jplain.bstのものですのでyomiというキーワードが存在しますが,欧文専用のplain.bstにはありませんので注意してください.この下請け部分に手を加えればsortingのruleを変更することも可能です.

    FUNCTION {sort.format.names}
    { 's :=
     yomi empty$
      'skip$
      { yomi 's := }
     if$
     #1 'nameptr :=
     ""
     s num.names$ 'numnames :=
     numnames 'namesleft :=
      { namesleft #0 > }
      { nameptr #1 >
        { ", " * }
        'skip$
       if$
       s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't :=
       nameptr numnames = t "others" = and
        { s is.kanji.str$
          {"ほか" * }
          {"et~al." *}
         if$
        }
        { t sortify * }
       if$
       nameptr #1 + 'nameptr :=
       namesleft #1 - 'namesleft :=
      }
     while$
    }

    FUNCTION {sort.format.title}
    { 't :=
     "A " #2
      "An " #3
       "The " #4 t chop.word
      chop.word
     chop.word
     sortify
     #1 global.max$ substring$
    }

    FUNCTION {author.sort}
    { author empty$
      { key empty$
        { "to sort, need author or key in " cite$ * warning$
         ""
        }
        { key sortify }
       if$
      }
      { author sort.format.names }
     if$
    }

    FUNCTION {author.editor.sort}
    { author empty$
     { editor empty$
       { key empty$
        { "to sort, need author, editor, or key in " cite$ * warning$
         ""
        }
        { key sortify }
       if$
      }
      { editor sort.format.names }
     if$
    }
    { author sort.format.names }
    if$
    }

    FUNCTION {author.organization.sort}
    { author empty$
      { organization empty$
         { key empty$
          { "to sort, need author, organization, or key in " cite$ * warning$
           ""
          }
          { key sortify }
         if$
        }
        { "The " #4 organization chop.word sortify
       }
       if$
      }
      { author sort.format.names }
     if$
    }

    FUNCTION {editor.organization.sort}
    { editor empty$
      { organization empty$
        { key empty$
         { "to sort, need editor, organization, or key in " cite$ * warning$
          ""
         }
         { key sortify }
        if$
        }
        { "The " #4 organization chop.word sortify }
       if$
      }
      { editor sort.format.names }
     if$
    }
    jplain.bstなどで欧文参考文献を和文参考文献の前に並べたい場合にはFUNCTION {sort.format.names}の最初を以下のようにすればよいでしょう.この際bibファイルのyomiにはローマ字表記で「よみ」を書いておいてください.
    FUNCTION {sort.format.names}
    { 's :=
      yomi empty$
       'skip$
       { is.kanji.entry
        { "あ" yomi * 's := }
        {yomi 's := }
        if$
       }
      if$
    ......

    II-2-7. bstファイルの種々のコマンドについて

     詳細はBibTeX のコマンド解説を参照して下さい.
    bstファイルにはif文やwhile文もあります. if文やwhile文の構造は以下のごとくなっているようです.
    (条件)
    { 条件が真の時のコマンド }
    { 条件が偽の時のコマンド }
    if$

    (条件)
    { 条件が真の時のコマンド }
    while$
    条件式としては例えばauthor empty$は,authorが空行(または未定義)ならばという意味になります.

    II-2-8. 関数への引数の渡し方

      BibTeXの関数はFUNCTION { funcname } { 関数本体 } という書式で書かれます.またBibTeXでは通常変数はスタック上で管理されるため,関数に引数を渡すにはスタック操作を行うことになります.呼出側では値をスタックに積み,関数の最初でこれをポップするようにします.以下に具体的な書き方を示します.この例ではtest2から"test1"という値を持ってtest関数をcallし,test関数ではこれを str変数に格納しています.
    なお,BibTeX ではglobal変数しかありませんのでC言語のような感覚で変数を操作するとひどい目にあいますので注意して下さい.

    FUNCTION {test}
    {
    'str :=
    .....
    }

    FUNCTION {test2}
    {
    .....
    "test1" test ...
    ....
    }

    これくらいの情報があればほぼ自由にbstファイルを操作できると思います.これら以外のコマンドについては現在のところ解析しておりません.もし解析している方がありましたら御教示下さい.
    もちろん目的どおりの出力を得る方法はひとつではありませんから,コマンドを適宜組み合わせて目的を実現して下さい.

    II-2-9. 各文献の最後のピリオドを省略するには

      雑誌によっては各文献リストの最後にピリオドが付かないスタイルを指定しているものもあります.現時点ではcbstでは対応していませんので,cbstで作成した bstファイルを手作業で修正する必要があります.修正するのは以下のfin.entry 関数です.これのadd.period$を削除すれば目的の出力が得られます.

    FUNCTION {fin.entry}
    { add.period$
       write$
       newline$
    }

    II-2-10. 問題点

     特殊な引用の書式には対応しかねるところもあります.いくらかのオプショナルなスタイルファイルが役に立つ場合もあるようですが,私にはこのあたりの知識はありません.
    あとcrossrefについても知識が乏しいため正確に対応できていません.
    cbstにはC言語のインラインアセンブラのようにBibTeXのコマンドをそのまま記述できるオプションもありますので,細かい設定はこれを用いて記述して下さい.

    III. 特殊な書式への対応のヒント

    III-1. chicagoスタイルの引用

      雑誌によっては文中の引用に番号ではなく(著者,年)といった形式で引用するように指定しているものもあります.Ver 1.94ではchicago.styにも対応した参考文献リストが出力できるbstファイルが生成できるようにしました.
    このような形式の引用を行うためにchicago.sty, chicagoa.sty, chicago.bstといったものがCTANから入手できます.chicago.bstを指定してBibTeX処理すると以下のようなbblファイルが作成されます.

    \bibitem[\protect\citeauthoryear{Antognini and Carstens}{Antognini and
     Carstens}{2002}]{Anesthesia_components_Antognini}
    Antognini, J.~F. and E.~Carstens (2002).
    \newblock {\it In vivo} characterization of clinical anaesthesia and its
     components.
    \newblock {\em Br J Anaesth\/}~{\em 89\/}(1), 156--66.

    これをよく眺めますと,\bibitemの形式が若干plain.bstによるものなどと異なっていることが判ります.chicago.bstでは bibitemのラベルの前に[]で括られて\protect\citeauthoryearというコマンドが埋め込まれ,さらにこの引数として {author-info}{abbrev. author-info}{year}の3つが付けられています.chicago.styはこの情報を文中の引用の出力に利用している訳です.
    従って引用文献リストの表記部分をcbstで作成してカスタマイズしておき,これに手を加えてchicago.styが扱うのと同様の形にbblファイルが出来上がるようにすればよい訳です.bstファイルの中で\bibitemを出力する機能を持っているのはFUNCTION {output.bibitem}です.plain.bstではこの関数は以下のようになっています.

    FUNCTION {output.bibitem}
    { newline$
     "\bibitem{" write$
     cite$ write$
     "}" write$
     newline$
     ""
     before.all 'output.state :=
    }

    chicago.bstと同等の出力ができるようにするには以下のように手を加えます.

    FUNCTION {label.out}
    {
     author empty$
      { editor empty$
        { skip$ }
        { editor #1 "{ll}" format.name$ duplicate$ "}{" * write$ "}{" * year * "}]{" * write$ }
       if$
      }
      { author #1 "{ll}" format.name$ duplicate$ "}{" * write$ "}{" * year * "}]{" * write$ }
     if$
    }

    FUNCTION {output.bibitem}
    { newline$
     "\bibitem[\protect\citeauthoryear{" write$
     label.out
     cite$ write$
     "}" write$
     newline$
     ""
     before.all 'output.state :=
    }

    cbstで作成したbstファイルのoutput.bibitemの部分を上記のようにlabel.out関数を加えて改変すれば,あとはtexソースのプレアンブルに\usepackage{chicago}とするだけでchicagoスタイルの引用形式とすることが可能です.

    IV. 参考文献

     この文章を書いた当初は知らなかったんですが,CTAN/biblio/bibtex/distribs/docに btxdoc, btxhakなどというBibTeXの参考文献を発見しました.とても参考になります.コマンド解説を日本語化しましたので参照してみて下さい.なおASCII-pTeXのパッケージ(ライブラリ)の中の $TEXMF/doc/jbibtex/doc-asciiのディレクトリにbtxdocとbtxhakの日本語版 (jBibTeXの作者である松井正一さん訳)があることを知りました.こちらを参考にされてもよいと思います.
    御意見やお問い合わせがありましたらhagihira@anes.med.osaka-u.ac.jp (萩平 哲)までメールをお願いします.
    なお,ここに書いた内容とクラスファイル作成スクリプトをまとめた manuscript-1.94.tar.gzはdownload 可能です.文書はLaTeXで書かれています.また,cbstの部分だけ必要な方はcbst-1.01.tar.gz をdownloadして下さい.

    注意!!

     jcbstで$JCBST環境変数の参照に一部不具合がありました.各 jbase.bso(jbase0.bso, jbase1.bso...)の存在チェックをしている部分やcatで書き出している部分に$JCBST/を追加して下さい.私自身がほとんどcbstしか使用していなかたために気づきませんでした.三嶋@北大歯2口外/口腔病理さんに指摘して頂きました.ありがとうございました.V1.92以降で修正しています.

    if test ! -r $JCBST/jbase0.bso
     echo "Base files not found !!"
     exit 1
    fi

    manuscript-1.92以前では,jcbstで作成したbstファイルでは英文著者名の最後の区切り文字列がstrで設定できないバグがあることが判明しました.V1.93で修正しています.jbase1.bso, jbase2.bsoの以下の部分を修正しました.

         { s is.kanji.str$
           {", " * t * }
           { numnames #2 >
             {", " * t * }
             {str * t * }
            if$
           }
          if$
         }

         { s is.kanji.str$
           {", " * t * }
           {str * t * }
          if$
         }
    最終改定 2015.01.12 (Ver1.4)