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},用逗号分隔。
@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 是期刊论文(author、title、journal、year);@book 是书籍(author 或 editor、title、publisher、year);@inproceedings 是会议论文(author、title、booktitle、year)。其他还包括学位论文的 @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。
\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标记确定,正文引用与参考文献列表完全一致。
$ 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。每次手动输入四条命令很麻烦,实际工作中通常交给 latexmk。latexmk 会查看 .aux 的内容,自动判断是否需要运行 BibTeX 以及需要多少次反复,通常一次启动就够了。
$ 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)。样式也有日文版本,如对应 plain 的 jplain、对应 unsrt 的 junsrt、对应 alpha 的 jalpha,以及像“[Kin80] Kinoshita: …”那样把姓放在开头的 jname(也有 jipsj 等学会样式)。
$ 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 是很有力的选择,单独页面会详细介绍。