bibtex style

数年前からBibtexを使用しているのですが、最近になってWeb of ScienceやScitationから書誌をbibtex形式で出力するのが特に簡単になり、ほぼ週ごとにデータベースが増大しています。これを論文や報告書を書くときに使用しています。

bibtexで準備しているスタイルunsrt.bstを使うと、論文の場合我々が普段見慣れたものとは異なって、

著者1の名 著者1の姓, 著者2の名 著者2の姓,…., and 著者Nの名 著者Nの姓. 題目. 雑誌名, 巻(号):頁, 月 年.

の出力を得ます。bibファイルにすべての情報が保存されていると(Web of Scieneceからの出力は大抵そうなっている)、すべての項目が省略形でなく(例えば、Physical Review Letters)出力され、業績リストだとしても大変長ったらしくなり、論文や報告書、申請書に用いるには不適切です。Physical Revewが提供するスタイルファイルREVTEXでは題目は出力されませんが、すべての著者と雑誌名が省略無しで出力されます。

そこで、最も良くある著者が3名以上の論文の時、

著者1の名イニシャル. 著者1の姓, et al., 省略された雑誌名, (年) 頁.

つまり私の最近の論文だと、

I. Kakeya et al., Phys. Rev. B 79 (2009) 212503.

となるようにbstファイルをカスタマイズしました。

やることは以下の通り

  1. 著者が3名以上の時、著者1 et al., とする
  2. 表示させる項目の並び替え
  3. 雑誌名の対応

もとにしたbstファイルはエルゼビアが供給するelsart-num.bstです。このbstファイルはunsrt.bstをもとにしていると思われ、初心者にとっていじりやすいです。apsrev.bstは独自の関数を数多く含んでおり、手に負えません。

1. 著者が3名以上の時、”著者1の名イニシャル. 著者1の姓, et al.,” とするために、FUNCTION {format.names}の中身を書き換える

FUNCTION {format.names}
{ 's :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
  numnames #3 >
  {
  #2 'namesleft :=
    { namesleft #0 > }
    { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=
      nameptr #1 >
          { namesleft #1 >
            { ", " * t * }
            { " {\it et~al}." * }
          if$
        }
        't  
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
  }
  {
    { namesleft #0 > }
    { s nameptr "{f.~}{vv~}{ll}{, 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$
}

2. 表示させる項目を”著者, 省略された雑誌名, 巻 (年) 頁.”とするために、FUNCTION {format.vol.num.pages}を変更

FUNCTION {format.vol.num.pages}
{ 
%SP 2001/01/23
% Add the leading space only if there is a volume
  % volume field.or.null
  " "
  volume empty$
    { pop$ "" }
    { volume bold * }
  if$
  number empty$
    'skip$
    {
%      "~(" number * ")" * *
      volume empty$
        { "there's a number but no volume in " cite$ * warning$ }
        'skip$
      if$
    }
  if$
}

3. 雑誌名を省略形で表示させるために、string_abbrv.bibを作製し、他の文献データベースの入ったbibファイルと共に\bibliography{}の引数にする。文献データベースの雑誌名は最短の省略形で入力。

@string{PRL="Phys. Rev. Lett."}
@string{PRB="Phys. Rev. B"}
@string{APL="Appl. Phys. Lett."}
@string{JAP="J. Appl. Phys."}
@string{JPSJ="J. Phys. Soc. Jpn."}
@string{RSI="Rev. Sci. Instr."}
@string{SUST="Supercond. Sci. Technol."}
@string{PhysC="Physica C"}

雑誌の省略形については、bstファイルの末尾に含まれている場合もあり、その場合はstring_abbrv.bibは必要ない。