BibTeX

BibTeX 是管理参考文献的经典方式:把每篇文献在 .bib 数据库中记录一次,然后自动生成参考文献列表。在正文中只需用 \cite 调用键。更换样式文件(.bst)后,同一份数据就能改排成不同期刊的格式。本页介绍如何编写 .bib 文件,\bibliographystyle\bibliography 的作用,以及独特的“latex → bibtex → latex → latex”构建顺序。

什么是 BibTeX

也可以在文档末尾手工列参考文献(thebibliography 环境),但随着数量增加,或同一文献要在多篇论文中重复使用,这种方式很快会崩溃。BibTeX 是 Oren Patashnik 在 1985 年左右编写的独立程序,它与 TeX/LaTeX 本体并行运行但相互分离。它的工作是从文献数据库中取出“实际被引用的文献”,按指定样式格式化,并写成文档可以插入的形式。

这个机制分为三部分:.bib 文件(原始文献数据)、正文中的 \cite 调用以及两个命令(\bibliographystyle\bibliography),还有决定外观的 .bst 文件(样式)。由于数据和外观分离,投稿地点变化时完全不用改数据,只需改一个样式词。这正是贯穿 LaTeX 的“结构与外观分离”思想。

编写 .bib 数据库

.bib 文件是一组条目。每个条目先声明一种类型,如 @article,然后在花括号中给出引用键字段。引用键是你自己决定的标识符(例如 knuth1984),必须与文档中的 \cite{...} 完全一致。字段写成 fieldname = {value},用逗号分隔。

references.bib
@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 = {Bell System Technical Journal},
  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}
}

学会常用类型及其必需字段很有用。@article 是期刊论文(authortitlejournalyear);@book 是书籍(authoreditortitlepublisheryear);@inproceedings 是会议论文(authortitlebooktitleyear)。其他还包括学位论文的 @phdthesis/@mastersthesis,书中章节的 @incollection,以及网页等杂项用的 @misc。每种类型哪些字段必需由样式决定。

值外面的花括号有实际意义。像 title = {The {TeX}book} 这样在内部再嵌套一层花括号,会保护那一段不被样式改变大小写(避免 TeX 变成 Tex)。多个作者用 and 分隔,如 author = {A. Smith and B. Jones},姓名顺序和缩写交给 BibTeX 与样式处理。

文档中的两个命令

在文档中,把两个命令放在参考文献应出现的位置(通常在正文末尾)。\bibliographystyle{plain} 选择样式,也就是使用哪个 .bst\bibliography{references} 同时告诉 BibTeX 读取哪个数据库在该位置输出参考文献列表。注意后者不写 .bib 扩展名:即使文件叫 references.bib,这里也写 references

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

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

\bibliographystyle{plain}
\bibliography{references}

\end{document}

正文中的 \cite{knuth1984} 指向 .bib 中的引用键 knuth1984如果键不一致,文献不会出现(会得到未定义引用警告)。只有被引用的文献会出现在列表中;即使 .bib 中有,未引用的也会被忽略(要全部输出可用 \nocite{*})。\cite 本身的变体,如多重引用、页码定位、cite 宏包等,会在“引用基础”页面介绍。

构建顺序(四次运行)

BibTeX 最容易让人一开始困惑的地方就在这里。要正确生成列表,经典做法按 latex → bibtex → latex → latex 的顺序运行四次。为什么要多次?因为 BibTeX 是独立于 LaTeX 本体的程序,二者通过辅助文件.aux.bbl)交换信息。

  • 第 1 次 latex — 处理正文,并把被引用的键以及 \bibliographystyle/\bibliography 的设置写入 .aux 文件。此时参考文献列表仍为空。
  • bibtex — 读取 .aux,知道“哪些键被引用、使用哪个样式、哪个 .bib”,从 .bib 中取出相应条目,按 .bst 的规则格式化,并写入 .bbl 文件
  • 第 2 次 latex — 读入 .bbl 并排出参考文献列表,但每条文献的编号等交叉引用还未完全解析。
  • 第 3 次 latex — 编号和 \cite 标记确定,正文引用与参考文献列表完全一致。
terminal
$ latex document.tex     # writes document.aux (cite keys)
$ bibtex document        # reads .aux + .bib + .bst, writes .bbl
$ latex document.tex     # pulls in .bbl
$ latex document.tex     # resolves all references

注意,传给 bibtex 的不是 .tex,而是辅助文件名(无扩展名的作业名)。使用 pdflatex 时步骤相同,只需把 latex 换成 pdflatex。每次手动输入四条命令很麻烦,实际工作中通常交给 latexmklatexmk 会查看 .aux 的内容,自动判断是否需要运行 BibTeX 以及需要多少次反复,通常一次启动就够了。

terminal
$ latexmk -pdf document.tex   # runs latex/bibtex/latex as many times as needed

标准样式(.bst)

样式决定文献的排序顺序标签(编号或缩写),以及作者名和期刊名如何缩写。BibTeX 标准附带四种样式,记住它们就足以应付许多用途。只需把名称传给 \bibliographystyle{...} 即可切换。

样式顺序标签 / 特点
plain按作者字母顺序编号 [1];最常用的默认样式
unsrt按首次引用顺序编号 [1](格式与 plain 相同)
alpha按标签顺序(大致为作者、年份)像 [Knu84] 这样的字母数字标签
abbrv按作者字母顺序缩写名(first names)和期刊名

此外,BibTeX 还标准附带一些分领域常用样式:工程领域广泛使用的 ieeetr(IEEE Transactions 风格,按引用顺序编号)、计算机科学的 acm(ACM 风格)、应用数学的 siam(SIAM 风格)等。学会和出版社也会发布自己的 .bst 文件,按投稿要求替换即可。BibTeX 的好处是,改变样式完全不需要改 .bib 或正文中的 \cite

日文:pbibtex / upbibtex

原始 bibtex 面向西文文本,不能很好地排序或处理包含日文作者名、书名的字段。因此 pLaTeX/upLaTeX 提供了日文感知命令。pbibtex 用于 pLaTeX,按 EUC-JP 码位排序。upbibtex 用于 upLaTeX,按 Unicode 码位排序。二者都继承自 JBibTeX(由 Shouichi Matsui 开发),并扩展了内置函数,使日文字段不会在字符中间被切断。

用法与西文相同:在构建顺序中只需把 latex 换成 platex(或 uplatex),把 bibtex 换成 pbibtex(或 upbibtex。样式也有日文版本,如对应 plainjplain、对应 unsrtjunsrt、对应 alphajalpha,以及像“[Kin80] Kinoshita: …”那样把姓放在开头的 jname(也有 jipsj 等学会样式)。

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

由于 upLaTeX 经过 DVI,最后要用 dvipdfmx 转成 PDF(这一流程在日文和 DVI 转换器页面有详细说明)。latexmk 可以配置为调用 pbibtex/upbibtex,因此日文环境中的四次手动运行也能自动化。

BibTeX 的限制,以及 biber/biblatex

BibTeX 成熟且广泛使用,但设计较旧,带有一些限制:它假定8 位编码,不能干净地处理 Unicode(多语言作者名和重音符号会很别扭),排序不够灵活,而制作复杂格式需要编写 .bst 这种独特的、面向栈的小语言。

为了解决这些限制,出现了 biblatex(LaTeX 宏包)及其默认后端 biber。它们原生处理 Unicode,允许在 LaTeX 侧通过选项细致控制排序和格式,并免去了编写 .bst。对于新项目,biblatex/biber 是很有力的选择,单独页面会详细介绍。