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 のように「著者姓+年」で作ると衝突しにくく、共著論文でも記憶に残ります。フィールドの順序は結果に影響しません——並べ替えも成形もスタイルの仕事だからです。
@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 | 博士論文(修士は @mastersthesis) | author, title, school, year |
@techreport | 研究機関が出した報告書 | author, title, institution, year |
@unpublished | 未刊行の草稿・私信 | author, title, note |
@misc | どれにも当てはまらないもの(Web ページなど) | 必須なし。howpublished と note が便利 |
タイトルの TeX が tex になる——波括弧で大文字を守る
plain や abbrv は、論文の題名を 文頭だけ大文字にして残りを小文字化 します。ですから title = {A Note on TeX and NASA Systems} と書いた @article は、出力では「A note on tex and nasa systems」になります。固有名詞も略語も容赦なく潰されます。防ぐ方法はひとつ、守りたい部分を波括弧でもう一段くくる ことです。{TeX}、{NASA} と書けばその範囲は変換の対象外になります。なおこの小文字化がかかるのは論文題名(title)で、書籍の題名や booktitle は対象外です。つまり @book に {TeX} と書いても実害はないが効果もない、という点は覚えておくと混乱が減ります。
% 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} とします。
\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 — 番号が確定し、本文の引用と文献リストがようやく一致します。ここでもう警告は出ません。
$ 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 ... undefined と LaTeX Warning: There were undefined references. が出て、本文の引用が [?] になり、参考文献の見出しごと消えている——この組み合わせの原因は、9 割方 走らせた回数が足りない ことです。.bbl がまだ無ければ、LaTeX は文献リストを一行も出しません。見出しすら出ないのは、thebibliography 環境そのものが .bbl の中に書かれているからです。まずは落ち着いて latex → bibtex → latex → latex を最後まで通してください。それでも消えないときは、BibTeX 側の出力に別のメッセージが出ているはずです。
| メッセージ | 出る場所 | 原因と対処 |
|---|---|---|
Citation ... undefined | LaTeX | .bbl がまだ無いか古い。latex → bibtex → latex → latex を通す |
There were undefined references. | LaTeX | 未解決の \cite または \ref が残っている。もう一度 latex を走らせる |
I found no \citation commands | BibTeX | \cite も \nocite も無い。引用を書くか \nocite{*} を置く |
I found no \bibstyle command | BibTeX | \bibliographystyle{...} を書き忘れている |
I found no database files | BibTeX | \bibliography{...} が無いか、指定した .bib が見つからない |
I found no style file | BibTeX | その名前の .bst が無い。綴りを確認するか投稿先の .bst を配置する |
Warning--I didn't find a database entry | BibTeX | \cite した鍵が .bib に無い。綴り違いか、追加し忘れ |
それでも直らないときに疑うべきは、古くなった補助ファイル です。鍵の名前を変えた、.bib を別のディレクトリへ動かした、スタイルを差し替えた——こうした変更のあとは、.aux・.bbl・.blg に前回の情報が残ったままになることがあります。latexmk -C を実行すれば生成物をまとめて消してくれるので、そのうえで一からビルドし直すのが最短です。なお \cite の鍵は大文字小文字も区別されるので、Knuth1984 と knuth1984 は別物として扱われます。
plain・unsrt・alpha・abbrv の違い
四つの標準スタイルが決めるのは、並び順・ラベルの形・名前と誌名をどこまで略すか の三点だけで、収録するフィールドはどれも同じです。それもそのはずで、plain.bst・unsrt.bst・alpha.bst・abbrv.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 を手で書かない理由——makebst と custom-bib
.bst が敬遠されるのは、それが 後置記法のスタック言語 で書かれているからです。スタイル作者向けの公式文書 btxhak.tex(Oren Patashnik、1988 年 2 月 8 日)は冒頭でこう言い切ります——文献スタイルは後置スタック言語で書く、そしてそれは「名前のない言語で書かれたプログラム」である、と。言語の名前すら付いていません。命令は十個しかない代わりに、値はすべてスタックに積んで取り出す形で扱うので、author を整形するだけでも逆ポーランド記法の断片が延々と続きます。既存の .bst を読んで真似るのは可能ですが、ゼロから設計するのは割に合いません。
$ 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 が吐く .bst は natbib と組み合わせて使うことも前提にされています。投稿規定が微妙に既存スタイルと合わないときの、もっとも現実的な逃げ道です。
日本語の文献を扱う——pbibtex と upbibtex
素の bibtex は欧文を前提としているので、日本語の著者名や書名を含む .bib では並べ替えも文字列処理も崩れます。TeX Live には代わりに pbibtex(pLaTeX 用、EUC-JP のコードポイント順に並べ替え)と upbibtex(upLaTeX 用、Unicode のコードポイント順)が入っています。単なる文字コード対応ではなく、スタイル言語そのものが拡張されている点が重要で、たとえば文字列が非 ASCII を含むかを判定する is.kanji.str$ という組み込み関数が追加され、substring$ は多バイト文字の途中で切らないよう、add.period$ は「。」「?」の後ろに「.」を足さないよう手が入っています。系譜としては松井正一氏の JBibTeX から分かれたもので、公式文書もその歴史をそのまま同梱しています。
$ 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 に対応する jplain、unsrt の junsrt、alpha の jalpha、abbrv の jabbrv、そして姓を見出しに立てる jname。学会向けには jipsj(情報処理学会)、tipsj、tieice(電子情報通信学会)、jorsj が用意されています——そしてこれらもまた jbtxbst.doc という一つのテンプレートから C プリプロセッサで切り出されており、英文側とまったく同じ作り方です。ビルドは latex を platex/uplatex に、bibtex を pbibtex/upbibtex に置き換えるだけ。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 年前に「文献が何であるか」と「どう印刷するか」を切り離しておいた設計が、いちばん効いてくるのがここです。