読者です 読者をやめる 読者になる 読者になる

けつあご日記

こんちは.菊地です.なんか浅ーいことをいろいろ書きます

【まとめ】LaTeXで参考文献の形式を変更する方法(bstファイルの編集)

LaTeX


f:id:kichiku_kikuchi:20151127210344j:plain

BibTeXとbstとbib

bstファイル

LaTeXではBibTeXという環境により,半自動的に参考文献を付けることができます.
その形式はbstファイルというもので決められていて,プリインストールされるもののほか,web上にはいろいろなbstファイルが転がっています.
でも結構やりたい形式のものがなかったりするんです.ちんこ.
自分好みの形式に編集した手順をまとめておきます.
以下,各リンクのサイトのほか奥村晴彦先生の著書を参考にしています.
名著です.

[改訂第6版] LaTeX2ε美文書作成入門

[改訂第6版] LaTeX2ε美文書作成入門

[改訂第5版] LaTeX2e 美文書作成入門

[改訂第5版] LaTeX2e 美文書作成入門


プリインストールのbstファイルは,例えば

  • C:\w32tex\share\texmf-dist\bibtex\bst\base
  • C:\w32tex\share\texmf-dist\pbibtex\bst

とかにあります.僕の場合はOSがWindows7でインストーラ(20分でできる簡単TeXインストールWindows編(WinShell版))を使ってインストールさせてもらってます.
それ以外の場合も似たようなところにあるはずです.

bibtexとpbibtexというディレクトリが別々にあります.pbibtexというのはbibtexを日本語対応にしたみたいな感じだと思います.

bibファイル

形式はbstファイルで決まりますが,内容はbibファイルという別のファイルによって決まります.現在,Mendeleyなどの文献管理ソフトやGoogleScholarなどのwebサイトがbibファイル出力に対応しており,自分で編集することはそこまでありません.ここらへん(LaTeX(文献の参照BibTeXの書き方))を見るとなんとなくの書き方が分かると思います.

Mendeleyの利用

僕はMendeleyから自動的にbibファイルがつくられるようにしています.この方法についてはまた今度書きます.ちんちん.追記を参照.

※追記 20160112
今のところこちらを参考に環境をつくっています.
pioneerboy.hatenablog.com
また,Mendeleyは基本的に英語論文用なので(?),ジャーナルによってはうまく表示されないことがあります.日本語の論文や博士論文などもMendeley向きではないですよね.そんな文献を引用したいときは,上のサイトのようにして生成されたbibファイルのほかに,自分でbibファイルを作成しておきます.Mendeleyが自動生成したbibファイルの形式と,こちらなどhttp://www.cas-ub.com/info/writingguide/201306231806.htmlを参考にしながら,カチャカチャ打ち込むしかないって感じですね.

では,とりあえずbibファイルが用意できたとしましょう.

基本的な使い方

とりあえずbstファイルは C:\w32tex\share\texmf-dist\pbibtex\bst にあるjplain.bstを使います.

1. bibファイルをカレントディレクトリに置く

カレントディレクトリはtexファイルがあるディレクトリという意味で使っています.カレントディレクトリ以外に置くときは,Windows7では環境変数をいじる必要があります.こちら(初心者がutf8でLaTeXとBibTeXを使うための一通りの準備(Windows編) - 503 Service Unavailable)の下の方に書いてあります.フルパスを書くなどでもうまくいくのかしら.

2. texファイル内でbstファイルとbibファイルを指定する
\bibliographystyle{jplain}
\bibliography{bibファイル名(拡張子なし)}

と書きます.

3. bblファイルをコンパイルする.

このままタイプセットしても参考文献は付きません.bstとbibを使ってbblファイルというものをつくる必要があります.ターミナルからカレントディレクトリに移動し,以下のコマンドを実行します.

pbibtex texファイル名(拡張子なし)

すると,カレントディレクトリにbblという拡張子のファイルが生成されると思います.エディタで開いてみると,自分でthebibliography環境をつくったときと同じような感じになっています.

4. 2回タイプセットする

これでやっと参考文献が付くはずです.


自力で形式を変更する

※非常に疲れる作業です.bstファイルの文法は一般的ではありませんので,かなり試行錯誤が必要になると思います.エラーもモリモリ出てきます.やりたくない人は下の方に書いたjecon.bstやmakebstを利用してください.(makebstはもしかするともっと疲れるかもしれません.おぺにす.)

もしくは,通常の方法で文献参照が済んで,bibtexの使用を終えた場合なら,直接bblファイルをエディタで書き換えても良いと思います.ただ,文献数が多いと大変なのでbstファイルを書き換えた方がいいはずです.

それでもやりたい人はこちら(Document of BibTeX)やこちら(bst ファイルのカスタマイズ - Okomeda Net)や当ブログを見ながら頑張りましょう,


上で述べたような通常のやり方(plain.bst使用)では

George M Sheldrick. A short history of SHELX. Acta Crystallographica Section A Foundations of Crystallography, 64:112–22, January 2008.

のようになります.つまり,

ファーストネーム ミドルネームの頭文字 ファミリーネーム.タイトル. 出版物名,
巻数:ページ, 出版月 出版年.

のような感じです.これで問題なければいいのですが,ジャーナルに投稿するにはそのジャーナルの形式に合わせる必要があります.
僕の場合は卒論なので特にこれで問題ないのですが,うちの研究室がよく投稿するジャーナルは

G. M. Sheldrick. Acta Crystallographica Section A Foundations of Crystallography, 2008, 64, 112–22

みたいな感じなので,これを目指してbstファイルを編集していきます.bstファイルはplain.bstをベースにしました.もとのplain.bstはバックアップしておきましょう.
新しく作ったbstファイルは元のファイルがあったディレクトリに置きましょう.こういうディレクトリをいじったときは,そうmktexlsrですね.多分必要です.
ターミナルから

mktexlsr

と打ってください.
ls-Rは早く追い出さなくては,と思いながらまだ使っています.ごめんなさい.皆さんはこちら(http://0xcc.net/misc/mktexlsr.html)に従って速やかに消してください.
※追記(2015/3/17)追い出しました.しぎぃぃぃぃぃぃぃい!!
LaTeX:ls-Rの追い出し - けつあご日記


変更点をまとめると,以下のようになります.

① 著者名を”ファーストネームの頭文字.ミドルネームの頭文字.ファミリーネーム.”にする.
② タイトルを出力しないようにする.
③ 出版年,巻数,ページ数を並べ替える.
④ 出版年を太字にする.
⑤ 出版月を出力しないようにする.
⑥ ページ数の前のコロンをカンマにする.

① 著者名を”ファーストネームの頭文字.ミドルネームの頭文字.ファミリーネーム.”にする

先ほどのリンク(bst ファイルのカスタマイズ - Okomeda Net)を参考にしました.こちらのサイト,bstファイルの編集のしかたがまとまっており,わかりやすいです.つまり当ブログの存在価値はありません.おちんちん.

著者名の形式を定義しているのは"FUNCTION {format.names}"という関数です.

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$
}

今回は,ファーストネームを頭文字にしてピリオドを付けるだけなので,赤にハイライトした部分だけいじればおっけーだおだおだお.
さっきのサイトに従って,

{f.~}{v.~}{ll}{, jj}

のように変更.その他の変更がしたい場合もさっきのサイトを参照すれば十分だと思います.

② タイトルを出力しないようにする

通常の論文の形式は"FUNCTION{article}"で定義されています.書籍や博士論文などの形式を変えたければ,他の関数をいじる必要がありますが,基本的な作業は同じです.

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
}

まずは,この部分をいじって何が変わるかを見てみるとよいかもしれません.ある行をコメントアウト(%)してみたりすると,出力が変わります.あるいはターミナルからbibtex(pbibtex)したときにエラーが出たりします.例えば

format.authors "author" output.check

をコメントアウトしてみると,著者名が消えると思います.
つまり,タイトルを消したければ,

format.title "title" output.check
new.block

をコメントアウトすればオーケーだと思います."new.block"もいらないのでコメントアウトしましょう.

③ 出版年,巻数,ページ数を並べ替える

journal emphasize "journal" output.check
format.vol.num.pages output
format.date "year" output.check

を並べ替えるとできました.2行目と3行目を逆にしました.

④ 出版年を太字にする

たぶんですが,plain.bstでは太字にするコマンドが定義されていません.

FUNCTION {bold}
{ duplicate$ empty$
    { pop$ "" }
    { "{\bfseries " swap$ * "}" * }
  if$
}

をどこかに書いてください.わかりやすいように"FUNCTION {emphasize}"の下にでも置いてください.

FUNCTION {emphasize}
{ duplicate$ empty$
    { pop$ "" }
    { "{\em " swap$ * "}" * }
  if$
}

これはイタリック体を定義する関数で,これを参考にして"FUNCTION {bold}"をつくりました.\bfseriesというのがbstファイルにおける太字のコマンドらしいです.

これで"bold"というコマンドが使えます.もう一度"FUNCTION{article}"のところに戻り,これを使いましょう.

format.date "year" output.check

format.date bold "year" output.check

とすると,出版年が太字になると思います.

⑤ 出版月を出力しないようにする

出版月を明記するジャーナルはまれなんじゃないでしょうか?消してしまいましょう.
"FUNCTION {format.date}"をいじります.

FUNCTION {format.date}
{ year empty$
    { month empty$
	{ "" }
	{ "there's a month but no year in " cite$ * warning$
	  month
	}
      if$
    }
    { month empty$
	'year
	{ month " " * year * }
      if$
    }
  if$
}

のうち

{ month " " * year * }

{ year }

にします.一度,{ * year * }にして使っていたのですが(pbibtexでずっとエラーは出ていた),なぜかbibファイルに"month"の項目がある文献の出版物名だけが表示されないというよくわからない事態になりました.これは"*"コマンドを理解していなかったからです.
※このように,自分で書き換えていると思わぬところで影響が出ます.bibtex(pbibtex)でコンパイルしたときのエラーメッセージをwebで検索するなどして,頑張って解決するしかないと思います.

⑥ ページ数の前のコロンをカンマにする

"FUNCTION {format.vol.num.pages}"をいじります.

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 }
	{ ":" * pages n.dashify * }
      if$
    }
  if$
}

ハイライトしたところのコロンをカンマに変えればいいだけです.あいやぁぁぁぁぁ

これで目的は達成できました.(何か忘れてるかも?)

jecon.bstを利用する

自分で編集するのはかなりしんどいことが分かったと思います.こんなことをしなくてもいいように,jecon.bstというものがあります.僕は以上の作業を自分でやった後に知りました.おろかな男.
このjecon.bst,すごいです.jecon.bst: 経済学用BibTeXスタイルファイル
経済学用に作られたようですが,分野を問わず使えます.
使い方はリンクとjecon.bst自体を見るとわかると思います.自由度は高く,基本的にフラグ立てだけで編集できます.すばらしい.

makebstを利用する

makebstというのもあるらしいです.僕はやったことがないので分かりませんが,鬼キツイらしいです.こちら(飯島の雑記帳 - 研究ソフト/LaTeX)を読んでください.

まとめ

  • 特に理由のない限りjecon.bstを使いましょう.
  • それでも足りない場合は自分で頑張りましょう.
  • それでもまだ足りない場合 or 何かに憑りつかれた人はmakebst.
  • Wordは滅びよ.