BibTeX

BibTeX のバージョン番号は、いまも 0.99d です。TeX Live 2024 に同梱されているのがこの番号で、公式文書 btxdoc.tex は 1988 年 2 月 8 日の日付のまま「BibTeX 1.00 が出たらこの文書を拡張する」と書いてあります。1.00 は、まだ出ていません。それでも BibTeX は、LaTeX で参考文献を扱うときの基準点であり続けています。理由は単純で、文献が何であるか.bib データベース)と それをどう印刷するか.bst スタイル)を最初から切り離したからです。このページでは .bib の書き方、\cite\bibliographystyle\bibliography の役割、latex → bibtex → latex → latex という 4 回のビルド、そして LaTeX Warning: Citation ... undefined が消えないときの原因を順に見ていきます。

BibTeX が LaTeX とは別のプログラムである理由

BibTeX は LaTeX の一部ではなく、独立した実行ファイルです。しかも .tex ファイルを一度も読みません。読むのは LaTeX が吐き出した .aux だけで、そこから「どの鍵が引用されたか」「どのスタイルか」「どの .bib か」の三点を拾い、結果を .bbl に書き戻します。この徹底した分業が、後で出てくる 4 回のビルドの理由そのものになります。標準スタイルのファイル先頭に残る著作権表示は「Copyright (C) 1984, 1985, 1988 Howard Trickey and Oren Patashnik」——LaTeX 自体がまだ形になりつつあった時期です。BibTeX は LaTeX の後付けの拡張ではなく、ほぼ同い年の相棒として設計されました。

仕組みは三つの部品に分かれます。文献の生データを持つ .bib ファイル、本文に置く \cite と二つの命令(\bibliographystyle\bibliography)、そして体裁を決める .bst ファイル。文献リストを本文末に手で並べる thebibliography 環境でも小さな文書なら足りますが、同じ文献を複数の論文で使い回し始めた瞬間に、どの版が正しいか分からなくなります。BibTeX が解いたのはその問題で、データを一箇所に集めておけば、投稿先が変わってもスタイル名を一語差し替えるだけで済みます。LaTeX 全体を貫く「構造と見た目を分ける」という発想が、参考文献にもそのまま適用されているわけです。

.bib エントリの書き方——エントリ型・引用鍵・フィールド

.bib ファイルは エントリ を並べたただのテキストです。各エントリは @article のように エントリ型 を宣言し、波括弧の中の先頭に 引用鍵、続けて フィールドフィールド名 = {値} の形でカンマ区切りに書きます。引用鍵は本文の \cite{...} と一字一句そろえる必要がある識別子で、命名は自由です。慣例としては knuth1984 のように「著者姓+年」で作ると衝突しにくく、共著論文でも記憶に残ります。フィールドの順序は結果に影響しません——並べ替えも成形もスタイルの仕事だからです。

references.bib
@string{bstj = "Bell System Technical Journal"}

@book{knuth1984,
  author    = {Donald E. Knuth},
  title     = {The {TeX}book},
  publisher = {Addison-Wesley},
  year      = {1984}
}

@article{shannon1948,
  author  = {Claude E. Shannon},
  title   = {A Mathematical Theory of Communication},
  journal = bstj,          % @string abbreviation, no braces
  volume  = {27},
  number  = {3},
  pages   = {379--423},
  year    = {1948}
}

@inproceedings{lamport1987,
  author    = {Leslie Lamport},
  title     = {Document Production: Visual or Logical?},
  booktitle = {Proceedings of TUG},
  year      = {1987},
  pages     = {19--24}
}

必須フィールドを決めているのは BibTeX 本体ではなく スタイル です。標準の plain を使うと、足りないフィールドは Warning--empty journal in shannon1948 のような警告で名指しされます。エラーではないので処理は止まりませんが、出力からその情報が黙って落ちるだけなので、警告は必ず読んでください。@string{bstj = "..."} で誌名などに略称を定義しておけば、値を波括弧なしの裸の名前で参照できます。また crossref フィールドを使うと、論文集の一章から親の @proceedings エントリを継承でき、会議名や出版社を何度も書かずに済みます。

エントリ型対象plain での必須フィールド
@article学術誌に載った論文author, title, journal, year
@book出版社から出た書籍author または editor, title, publisher, year
@inproceedings会議録に収録された発表author, title, booktitle, year
@incollection独立した題名を持つ書籍の一章author, title, booktitle, publisher, year
@phdthesis博士論文(修士は @mastersthesisauthor, title, school, year
@techreport研究機関が出した報告書author, title, institution, year
@unpublished未刊行の草稿・私信author, title, note
@miscどれにも当てはまらないもの(Web ページなど)必須なし。howpublishednote が便利

タイトルの TeXtex になる——波括弧で大文字を守る

plainabbrv は、論文の題名を 文頭だけ大文字にして残りを小文字化 します。ですから title = {A Note on TeX and NASA Systems} と書いた @article は、出力では「A note on tex and nasa systems」になります。固有名詞も略語も容赦なく潰されます。防ぐ方法はひとつ、守りたい部分を波括弧でもう一段くくる ことです。{TeX}{NASA} と書けばその範囲は変換の対象外になります。なおこの小文字化がかかるのは論文題名(title)で、書籍の題名や booktitle は対象外です。つまり @book{TeX} と書いても実害はないが効果もない、という点は覚えておくと混乱が減ります。

references.bib
% unprotected: plain.bst prints "A note on tex and nasa systems"
@article{bad,
  author  = {A. One},
  title   = {A Note on TeX and NASA Systems},
  journal = {J. Test},
  year    = {2000}
}

% protected: prints "A note on {TeX} and {NASA} systems"
@article{good,
  author  = {B. Two},
  title   = {A Note on {TeX} and {NASA} Systems},
  journal = {J. Test},
  year    = {2000}
}

% names: separate with "and"; brace a corporate author whole
@misc{org,
  author = {{World Health Organization}},
  title  = {Annual Report},
  year   = {2024}
}

著者名も同じ発想で扱われます。複数人は and で区切りauthor = {A. Smith and B. Jones})、, は姓と名の区切りとして予約されているので author = {Smith, Alice} は「姓 Smith・名 Alice」の意味になります。最後を and others にすると、スタイル側が「et al.」に置き換えます。厄介なのは団体名で、{World Health Organization} のように 全体をもう一段の波括弧で包まないと「Organization, W. H. World」のように姓名分解されてしまいます。BibTeX は名前を構文として読むので、構文から外したいときは波括弧で黙らせる——ここでも道具はひとつです。

\bibliographystyle\bibliography は何をするか

二つの命令は、どちらも「印刷する」というより .aux に伝言を残す ための命令です。\bibliographystyle{plain}.aux\bibstyle{plain} を、\bibliography{references}\bibdata{references} を書き込み、BibTeX はそれを読んで動きます。加えて \bibliography にはもう一つ役目があり、その置いた位置に文献リストを出力 します。だから普通は本文の最後、\end{document} の直前に並べます。引数に拡張子は付けず、ファイルが references.bib でも references と書くのが慣例です。.bib を複数使うときはカンマ区切りで \bibliography{books,papers} とします。

document.tex
\documentclass{article}
\begin{document}

TeX was created by Knuth~\cite{knuth1984}, building on
Shannon's information theory~\cite{shannon1948,lamport1987}.

% \nocite{*}            % force every entry of the database into the list
\bibliographystyle{plain}
\bibliography{references}

\end{document}

本文の \cite{knuth1984} は、.bib の引用鍵をそのまま指しています。リストに載るのは引用された文献だけ で、.bib に入っていても一度も \cite しなかったエントリは無視されます。逆に全件を出したいときは \nocite{*} を置きます(\nocite は本文に印を出さずに「引用した」と登録するだけの命令です)。鍵をカンマで並べれば \cite{shannon1948,lamport1987} のように一度にまとめられます。角括弧でページを添える \cite[p.~42]{knuth1984}、著者・年式にする natbib\citet\citep など、\cite 側の使い分けは引用のページで扱います。

latex → bibtex → latex → latex——なぜ 4 回まわすのか

4 回必要なのは、情報が一方向にしか流れないから です。BibTeX は .aux がなければ何を引用したか分からず、LaTeX は .bbl がなければ何を印刷すべきか分からない。そして「[1]」「[2]」という番号は文献リストを組んでみて初めて確定するので、本文中の \cite にその番号を反映させるにはもう一周が要ります。BibTeX 公式文書の btxdoc.tex 自身がこの手順を明記していて、しかも「ごくまれに BibTeX と LaTeX をもう一度ずつ走らせる必要がある」とまで書き添えてあります。

  • 1 回目の latex — 本文を処理し、引用された鍵を \citation{...} として、スタイルとデータベースの指定を \bibstyle{...}\bibdata{...} として .aux に書き出します。この時点で文献リストはまだ存在しません。
  • bibtex.aux だけを読み、どの鍵・どのスタイル・どの .bib かを知ります。.bib から該当エントリを取り出し、.bst の規則で整形し、thebibliography 環境まるごとの形で .bbl ファイル に書き出します。
  • 2 回目の latex.bbl を読み込んで文献リストを組みます。しかし本文の \cite はまだ古い .aux の情報を見ているため、Citation ... undefined の警告はこの回でも消えません。
  • 3 回目の latex — 番号が確定し、本文の引用と文献リストがようやく一致します。ここでもう警告は出ません。
terminal
$ pdflatex document.tex   # writes document.aux (\citation, \bibstyle, \bibdata)
$ bibtex   document       # note: job name, not document.tex -> writes .bbl and .blg
$ pdflatex document.tex   # pulls in .bbl; citations still undefined here
$ pdflatex document.tex   # numbers settle; warnings clear

コマンドの綴りで唯一の落とし穴は、bibtex に渡すのが .tex ではなく ジョブ名(拡張子なし) だという点です。bibtex document.tex と打つと document.tex.aux を探して失敗します。BibTeX は結果とは別に .blg というログを書くので、警告の全文を後から読み返したいときはここを開きます。そして実務では、この 4 回を手で打つ必要はありません。latexmk.aux の中身を見て BibTeX の実行要否と必要な反復回数を判断してくれるので、latexmk -pdf document.tex の一行で足ります。

LaTeX Warning: Citation ... undefined と参考文献が空になるとき

LaTeX Warning: Citation ... undefinedLaTeX Warning: There were undefined references. が出て、本文の引用が [?] になり、参考文献の見出しごと消えている——この組み合わせの原因は、9 割方 走らせた回数が足りない ことです。.bbl がまだ無ければ、LaTeX は文献リストを一行も出しません。見出しすら出ないのは、thebibliography 環境そのものが .bbl の中に書かれているからです。まずは落ち着いて latex → bibtex → latex → latex を最後まで通してください。それでも消えないときは、BibTeX 側の出力に別のメッセージが出ているはずです。

メッセージ出る場所原因と対処
Citation ... undefinedLaTeX.bbl がまだ無いか古い。latex → bibtex → latex → latex を通す
There were undefined references.LaTeX未解決の \cite または \ref が残っている。もう一度 latex を走らせる
I found no \citation commandsBibTeX\cite\nocite も無い。引用を書くか \nocite{*} を置く
I found no \bibstyle commandBibTeX\bibliographystyle{...} を書き忘れている
I found no database filesBibTeX\bibliography{...} が無いか、指定した .bib が見つからない
I found no style fileBibTeXその名前の .bst が無い。綴りを確認するか投稿先の .bst を配置する
Warning--I didn't find a database entryBibTeX\cite した鍵が .bib に無い。綴り違いか、追加し忘れ

それでも直らないときに疑うべきは、古くなった補助ファイル です。鍵の名前を変えた、.bib を別のディレクトリへ動かした、スタイルを差し替えた——こうした変更のあとは、.aux.bbl.blg に前回の情報が残ったままになることがあります。latexmk -C を実行すれば生成物をまとめて消してくれるので、そのうえで一からビルドし直すのが最短です。なお \cite の鍵は大文字小文字も区別されるので、Knuth1984knuth1984 は別物として扱われます。

plainunsrtalphaabbrv の違い

四つの標準スタイルが決めるのは、並び順ラベルの形名前と誌名をどこまで略すか の三点だけで、収録するフィールドはどれも同じです。それもそのはずで、plain.bstunsrt.bstalpha.bstabbrv.bst一つのファイルから作られていますbtxbst.doc というテンプレートを C プリプロセッサに -DPLAIN-DUNSRT-DALPHA-DABBRV と渡し分けて生成する、と当のファイルの冒頭に書いてあります。四つが微妙に違って見えるのは、同じ本文の条件コンパイルの結果というわけです。

スタイル並び順ラベルと特徴
plain著者名のアルファベット順[1] の連番。もっとも無難な既定値
unsrt本文で最初に引用した順[1] の連番。書式は plain と同一
alphaラベル順(実質は著者・年)[Knu84] のような英数字ラベル。数式の多い分野で読みやすい
abbrv著者名のアルファベット順plain と同じ番号だが、名・月・誌名を略記して行数を詰める

BibTeX 本体の配布物には、これとは別に「準標準」と呼ばれる四つのスタイルも入っています。acm(ACM Transactions 風)、apalike(APA 風の著者・年式。apalike.sty と組で使う)、ieeetr(IEEE Transactions 風、引用順の番号)、siam(SIAM 風)。工学なら ieeetr、計算機科学なら acm、心理学や社会科学系で著者・年式が要るなら apalike から始めるのが手堅い選択です。さらに学会や出版社は投稿規定に合わせた .bst を配布しているので、投稿先が決まっているならまずそれを探してください。どのスタイルに移っても、.bib と本文の \cite は一行も書き換えずに済みます。

.bst を手で書かない理由——makebstcustom-bib

.bst が敬遠されるのは、それが 後置記法のスタック言語 で書かれているからです。スタイル作者向けの公式文書 btxhak.tex(Oren Patashnik、1988 年 2 月 8 日)は冒頭でこう言い切ります——文献スタイルは後置スタック言語で書く、そしてそれは「名前のない言語で書かれたプログラム」である、と。言語の名前すら付いていません。命令は十個しかない代わりに、値はすべてスタックに積んで取り出す形で扱うので、author を整形するだけでも逆ポーランド記法の断片が延々と続きます。既存の .bst を読んで真似るのは可能ですが、ゼロから設計するのは割に合いません。

terminal
$ latex makebst      # answer the questions; choose "merlin" as the master file
                     # -> writes a .dbj batch job
$ latex mystyle.dbj  # runs docstrip -> mystyle.bst

そこで実際に使われているのが custom-bib パッケージで、その入口が makebst です。latex makebst と打つと対話形式の質問が始まり、著者名は姓が先か、年は括弧に入れるか、題名はイタリックか、といった選択に答えていくだけで .bst が生成されます。作者は Patrick W. Daly ——著者・年式の引用を LaTeX 側に持ち込んだ natbib と同じ人物で、makebst が吐く .bstnatbib と組み合わせて使うことも前提にされています。投稿規定が微妙に既存スタイルと合わないときの、もっとも現実的な逃げ道です。

日本語の文献を扱う——pbibtexupbibtex

素の bibtex は欧文を前提としているので、日本語の著者名や書名を含む .bib では並べ替えも文字列処理も崩れます。TeX Live には代わりに pbibtex(pLaTeX 用、EUC-JP のコードポイント順に並べ替え)と upbibtex(upLaTeX 用、Unicode のコードポイント順)が入っています。単なる文字コード対応ではなく、スタイル言語そのものが拡張されている点が重要で、たとえば文字列が非 ASCII を含むかを判定する is.kanji.str$ という組み込み関数が追加され、substring$ は多バイト文字の途中で切らないよう、add.period$ は「。」「?」の後ろに「.」を足さないよう手が入っています。系譜としては松井正一氏の JBibTeX から分かれたもので、公式文書もその歴史をそのまま同梱しています。

terminal
$ uplatex   document.tex   # 1st pass: writes .aux
$ upbibtex  document       # Japanese-aware: writes .bbl
$ uplatex   document.tex   # pulls in .bbl
$ uplatex   document.tex   # resolves references
$ dvipdfmx  document.dvi   # DVI -> PDF

スタイルも日本語版が同梱されています。plain に対応する jplainunsrtjunsrtalphajalphaabbrvjabbrv、そして姓を見出しに立てる jname。学会向けには jipsj(情報処理学会)、tipsjtieice(電子情報通信学会)、jorsj が用意されています——そしてこれらもまた jbtxbst.doc という一つのテンプレートから C プリプロセッサで切り出されており、英文側とまったく同じ作り方です。ビルドは latexplatexuplatex に、bibtexpbibtexupbibtex に置き換えるだけ。DVI を経由するので最後に dvipdfmx で PDF に変換します。latexmk は設定ファイルでこれらを呼ぶよう指定できるので、日本語でも自動化できます。

BibTeX を使い続けるか、biblatex/biber に移るか

判断の目安ははっきりしています。投稿先が .bst を指定してくるなら BibTeX自分で体裁を決められるなら biblatex/biber です。BibTeX の設計は 8 bit 文字コードを前提としているため、多言語混在の著者名やアクセント記号で手当てが要り、並べ替えの規則にも手が届きません。体裁を細かく変えたければ結局 .bst を触ることになり、それが前節で見た名前のないスタック言語です。要するに、BibTeX の弱点はすべて「1988 年に凍結された設計」という一点に由来します。

その先にあるのが biblatex(LaTeX パッケージ)と、その既定のバックエンド biber です。Unicode をそのまま扱い、並べ替えも体裁も LaTeX 側のオプションで指定でき、.bst を一行も書かずに済みます。命令も \cite から \autocite\printbibliography へ変わり、ビルドは bibtex の代わりに biber を呼びます。とはいえ .bib ファイルそのものは両者で共通なので、乗り換えのコストは思ったより小さい——40 年前に「文献が何であるか」と「どう印刷するか」を切り離しておいた設計が、いちばん効いてくるのがここです。