個人的なまとめ。

てきとーに何か書きます。

bstファイルをちょっとカスタマイズする

Texで参考文献を書く時に、Texファイル内のthebibliography環境を作ってやるのも別に悪いとは言いませんが、個人的には.bibファイルを作って参考文献を書いた方が楽だと思ってます。

で、そんな.bibファイルを読み込む際に使う.bstファイルは各学会がテンプレートを用意してると思うのでそれに従えば良いと思ってます。

が!時にはちょっとした事情でbstファイルを書き換えたい時が来ると思います。

今回はデフォルトで入っているunsrt.bstをベースにちょこちょこっと改良しました。

タイトルにダブルクォーテーションを付ける


FUNCTION {quote}
{ duplicate$ empty$
	{ pop$ """}
	{"``" swap$ * "''" *}
	if$
}

FUNCTION {format.title}
{ title quote
}

まず、quoteという関数を作って、format.title内で呼び出します。
例えば、

Deep learning

というタイトルがあった場合は、

``Deep learning''

という風に変換され、

“Deep learning”

と、表示されます。
ちなみに、元々のunsrtではformat.titleにはchange.case$が入ってますが、それを通さずに純粋にtitleのみを出力させる事で、.bibファイルの中のtitleタグに記載されている通りに表示されます。
つまり、titleの中で大文字になっている所はそのまま大文字が出るようになります。
こうする事で、頭文字だけが大文字だったのが改善されます。
\usepackage{titlecaps}を使用することでタイトルの単語の頭だけを大文字に変えるというやり方もありますが、この場合だとofやonなどの接続詞までも大文字になってしまうので面倒です。

著者の表示を変える


FUNCTION {format.names}
{ 'bibinfo :=
  duplicate$ empty$ 'skip$ {
  's :=
  "" 't :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr
      "{vv~}{ll}{,jj}{ ff}"
      format.name$
      bibinfo bibinfo.check
      't :=
      nameptr #1 >
        {
          namesleft #1 >
            { ", " * t * }
            {
              s nameptr "{ll}" format.name$ duplicate$ "others" =
                { 't := }
                { pop$ }
              if$
              "," *
              t "others" =
                {
                  " " * bbl.etal *
                }
                { " " * t * }
              if$
            }
          if$
        }
        't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
  } if$
}

unsrtのformat.namesを上記のように変えました。
ここで表示名を変える場合は、

 "{vv~}{ll}{,jj}{ ff}"

を変える事で表示の仕方が変わります。
例えば、Hogehoge Kosukeさんの場合、

"{vv~}{ll}{,jj}{ ff}" ---> Hogehoge Kosuke

と、名字(Last name) 名前(First name)の順番でフルネームで出力されます。
これを次のように変えると、

"{vv~}{f{.}.}{,jj}{ ll}" ---> K. Hogehoge

という風に、名前だけ頭文字1文字になってピリオドが入り、名字はフルで出力されるようになります。

詳しくはこのサイトを参考にすると良いかと思います。
may46onez.hatenablog.com

著者やタイトルの終わりをピリオドからカンマに変える


FUNCTION {bbl.comma}
{ "," }

まず、カンマ用の関数を作成します。(多分カンマだけを表示する関数は用意されていると思うけど、どうしても見つけられず...)

FUNCTION {output.nonnull}
{ 's :=
  output.state mid.sentence =
    { ", " * write$ }
    { output.state after.block =
        { bbl.comma * write$
          newline$
          "\newblock " write$
        }
        { output.state before.all =
            'write$
            { bbl.comma * " " * write$ }
          if$
        }
      if$
      mid.sentence 'output.state :=
    }
  if$
  s
}

format.nonnull内を上記のように変更しました。

変更した箇所としては、unsrtのformat.nonnull内の

add.period$ write$
........
{ add.period$ " " * write$}
.....

となっている、add.period$の場所を

bbl.comma * write$
........
{ bbl.comma * " " * write$}
.....

という風に変更します。
この際、bbl.commaの後にアスタリスクが必要です。
そうする事でエラー無く出力されます。

出力結果としては、

K. Hogehoge, "Deep learning", ~~~~~, 2018.

といった感じになります。
最後だけはピリオドにしています。
もし仮に最後のピリオドもカンマに変えたい場合は、

FUNCTION {fin.entry}
{ bbl.comma
  %add.period$
  write$
  newline$
}

fin.entryをこのように変更すれば可能です。(滅多にしないと思いますが)

ページ数の頭にpp.を付ける


FUNCTION {bbl.pages}
{ "pp. " }

pp.を表示するための関数を作成します。この時pp.の後に半角のスペースを入れても良いですし、入れなくても良いです。

FUNCTION {format.pages}
{ pages duplicate$ empty$ 'skip$
    { duplicate$ multi.page.check
        {
          bbl.pages swap$
          n.dashify
        }
        {
          bbl.page swap$
        }
      if$
      tie.or.space.prefix
      "" bibinfo.check
      * *
    }
  if$
}

次に、format.pagesの中身を上記のように変更します。

元々は、

FUNCTION {format.pages}
{ pages empty$
    { "" }
    { pages multi.page.check
        { "pages" pages n.dashify tie.or.space.connect }
        { "page" pages tie.or.space.connect }
      if$
    }
  if$
}

こうなってます。なので、コピペして貰うと速いと思います。

次に、

FUNCTION {format.vol.num.pages}
{ volume field.or.null
  number empty$
    'skip$
    { "(" number * ")" * *
      volume empty$
        { "there's a number but no volume in " cite$ * warning$ }
        'skip$
      if$
    }
  if$
  pages empty$
    'skip$
    { duplicate$ empty$
        { pop$ format.pages }
        { "," * " pp. " * pages n.dashify * }
      if$
    }
  if$
}

次に、format.vol.num.pagesの中も少し変更します。

元々は、

{ ":" * pages n.dashify * }

このようになっているので、

{ "," * " pp. " * pages n.dashify * }

このように変更しましょう。
まずコロンをカンマに変更。
次に"pp. "*を追加しましょう。
こうすることで

(81):451-462

こんな風に表示されていたのが、

(81), pp. 451-462

という風に表示されるようになります。

やったね!



変更したunsrt.bstのファイルをgithubに上げようと思いましたが、著作権的にどうなのか不安なのでとりあえずはやめておきます。