整理一下LaTeX中关于参考文献的内容。

基本命令和引用

LaTeX提供的对参考文献的底层支持主要是thebibliography环境,大致相当于一个特殊的列表,在使用的地方会展示参考文献列表(包括标题 References参考文献),使用示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
\documentclass{article}

\begin{document}

According to Einstein's theory of relativity \cite{einstein1905}...

\begin{thebibliography}{99}
\bibitem{einstein1905} Albert Einstein. \textit{On the Electrodynamics of Moving Bodies}. Annalen der Physik, 1905.
\bibitem{knuth1984} Donald E. Knuth. \textit{The TeXbook}. Addison-Wesley, 1984.
\bibitem{lamport1994} Leslie Lamport. \textit{LaTeX: A Document Preparation System}. Addison-Wesley, 1994.
\end{thebibliography}

\end{document}

每一项开头为\bibitem{xxx},其中的xxx用于唯一标识文献的标签。

thebibliography环境中会自动对每一项使用数字进行编号,环境需要传递一个额外参数用来指定一个编号的最大数目(例如99),这个数被用于决定编号排版的最大宽度。

显然thebibliography环境的使用非常不方便,我们需要使用更专业的文献管理工具,而不是手动编辑参考文献列表的内容和样式,但是那些高级工具实际都相当于对thebibliography环境的封装。

在正文中引用文献时使用\cite命令指定文献的标签,例如\cite{knuth1984},同时引用多个文献例如\cite{einstein1905,knuth1984}

有时只需要列出一两个参考文献,就可以偷懒不使用 bib 文件,直接手动使用 thebibliography 环境,其中的条目可以复制 MLA 或 Chicago 格式,然后把书名或期刊名,或者标题加上斜体即可。

bibtex 格式

bibtex 格式是最为流行的参考文献数据组织格式之一,它的出现让我们摆脱了手写参考文献条目的麻烦。
Google Scholar、期刊/数据库的网站以及文献管理工具都支持导出 bibtex 格式的文献条目。

获取 bibtex 数据的来源通常包括:

  • 期刊官网
  • 基于 DOI 的数据库(corssref),以及基于 DOI 封装的查询网址,例如 doi2bib
  • 谷歌学术

需要注意的是,由于 bibtex 格式比较灵活自由,从不同来源获取的文献条目虽然都可以正常使用,但是它们的内容可能并不完全相同(标签的生成规则可能不同,包含的字段也可能不同),而且各种细节问题非常麻烦。谷歌学术导出的bibtex格式不能保证绝对的正确性,各种软件(例如Zotero)导出的格式同样也不能保证正确性,而且可能附带大量的额外字段,总是免不了需要手动调整。

bibtex 格式的数据库通常是以 .bib 作为扩展名的纯文本文件,内容由若干个文献条目组成,文献条目的格式如下图所示

下面依次进行解释。

每一个条目最开始的部分需要指定条目的类型,以@开头,大小写均可,例如

1
@article{ ... }

常见的条目类型包括:

  • article:期刊文章
  • book:书籍
  • inproceedings, conference:会议论文
  • mastersthesis, phdthesis:硕士/博士学位论文
  • unpublished: 未发表
  • online: 在线资源
  • misc:其他类型(包括挂在 arXiv 的文献)

每一个条目的内容都使用{}包裹,在{后需要紧接着一个标签(citekey),例如

1
@article{einstein1905, ... }

条目的标签允许由字母、数字以及字符-_:组成,大小写敏感,例如einstein1905
在正文中引用该条目时需要使用这个标签,例如\cite{einstein1905}
在编译时要求使用的所有标签都是唯一的,如果有重复的标签,编译时会报错。

标签实际上只是用来确保唯一性的标记它的生成规则并不是被标准严格确定的,习惯上由作者姓名、年份、标题中的若干部分组成,尽量使用小写字符和数字,在确保唯一性的前提下尽量简短。

除了标签,条目的其它内容由若干键值对组成,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@article{einstein1905,
author = {Albert Einstein},
title = {On the {Electrodynamics} of {Moving Bodies}},
journal = {Annalen der Physik},
volume = {17},
number = {6},
pages = {891--921},
year = {1905},
publisher = {Wiley-VCH}
}

@article{einstein1905,
author = "Albert Einstein",
title = "On the {Electrodynamics} of {Moving Bodies}",
journal = "Annalen der Physik",
volume = "17",
number = "6",
pages = "891--921",
year = "1905",
publisher = "Wiley-VCH"
}

其中:

  • 对于键值对的顺序没有要求,但是不同键值对之间需要使用,分隔,最后一个键值对之后加不加,均可;
  • 对于键,要求是字符串,不区分大小写;
  • 对于值,通常需要使用引号或{}包裹,如果值是数字则无须包裹;
  • bibtex格式规定了很多合法的键,对于指定类型的条目,某些键是必选的,其它键则是可选的
    • 对于article,必须包含authortitlejournalyear
    • 对于book,必须包含authortitlepublisheryear

BibTeX 文件可以写注释,但需要注意:BibTeX 标准语法中并没有规定 % 是行注释符。虽然在某些情况下用 % 注释 .bib 文件中的内容似乎可以工作,但这并不是可靠的 .bib 注释方式,只是利用了解析规则;在字段内部或条目内部使用 % 可能导致 BibTeX 解析错误。

Overleaf 对注释的写法问题也有讨论:I tried to use % to comment out some lines or entries in my .bib file, but I got lots of error messages instead?

如果只是想让 BibTeX 忽略某个字段,可以把字段名改成 BibTeX 不认识的名字,例如从 date 改成 IGNOREdate

1
2
3
4
5
6
7
8
9
10
11
@article{einstein1905,
author = "Albert Einstein",
title = "On the {Electrodynamics} of {Moving Bodies}",
journal = "Annalen der Physik",
volume = "17",
number = "6",
pages = "891--921",
year = "1905",
IGNOREdate = "1905-06-30",
publisher = "Wiley-VCH"
}

如果想临时注释掉整个条目,一种简单做法是移除条目前面的 @

1
2
3
4
5
6
7
8
9
10
article{einstein1905,
author = "Albert Einstein",
title = "On the {Electrodynamics} of {Moving Bodies}",
journal = "Annalen der Physik",
volume = "17",
number = "6",
pages = "891--921",
year = "1905",
publisher = "Wiley-VCH"
}

这是因为 BibTeX 只会把以 @ 开头的结构识别为条目;去掉 @ 后,这一段通常会被跳过。这个方法可用,但本质上也是利用了 BibTeX 的解析规则。

更语义化的做法是使用 @comment。例如,可以把原来的条目类型替换为 comment

1
2
3
4
5
6
7
8
9
10
@comment{einstein1905,
author = "Albert Einstein",
title = "On the {Electrodynamics} of {Moving Bodies}",
journal = "Annalen der Physik",
volume = "17",
number = "6",
pages = "891--921",
year = "1905",
publisher = "Wiley-VCH"
}

也可以把整段内容包在一个 @comment{...} 块中:

1
2
3
4
5
6
7
8
9
10
11
12
@comment{
@article{einstein1905,
author = "Albert Einstein",
title = "On the {Electrodynamics} of {Moving Bodies}",
journal = "Annalen der Physik",
volume = "17",
number = "6",
pages = "891--921",
year = "1905",
publisher = "Wiley-VCH"
}
}

bibtex 样式

除了在bibtex格式的文献数据库文件中记录了参考文献的详细信息,
实际排版中我们还需要决定参考文献列表的排版样式,包括作者,名称,年份出现的顺序,字体样式等细节。

bibtex 提供了几个预定义的样式:

  • plain: 基础样式,使用数字编号,按字母顺序排列,比较次序为作者的姓和名、年度和标题
  • abbrv: 在plain的基础上调整,尽量使用缩写使信息更紧凑
  • alpha: 在plain的基础上调整,用作者名首字母+年份后两位作为编号,而非默认的数字编号,例如 [ABCD13]
  • unsrt: 在plain的基础上调整,直接按照引用的先后顺序,而非默认的字母顺序

指定样式的方法是在导言区使用 \bibliographystyle 命令,例如

1
2
3
4
\bibliographystyle{plain}
\bibliographystyle{abbrv}
\bibliographystyle{alpha}
\bibliographystyle{unsrt}

如果使用定制的期刊模板,可能会提供自用的样式,那么在编译时还需要提供对应的样式文件(.bst 文件)。

有的期刊比较喜欢使用人名——年份的引用方式,例如Axford et al., 2013,这种方式可以将参考文献的引用直接作为语句的主语或宾语成分,可以使用natbib宏包的\citep{}命令实现,类似的命令\citet{}则会给它加上括号,此时不可作为语句的成分。

bibtex 用法

使用Bibtex时,除了需要准备bibtex格式的文献数据库文件,例如reference.bib,在编写LaTeX文档时需要做如下几件事:

  1. 在导言区使用 \bibliographystyle 命令设置使用的bibtex样式,例如 \bibliographystyle{plain}
  2. 在正文中使用\cite{name}或者\cite{name1,name2}等引用文献
  3. 在正文的最后部分使用 \bibliography 命令打印参考文献列表,需要指定.bib文件的文件名(不含扩展名),例如\bibliography{reference}

注意:

  • 如果使用多个.bib文件,可以使用多个.bib文件,将其一起导入即可,例如 \bibliography{reference,BigBib}
  • 在参考文献列表中并不会把.bib文件的所有条目都打印出来,只会展示正文中使用\cite{}提到的部分条目。如果需要强制在参考文献列表中呈现未提及的项,可以使用\nocite{}命令指定添加某些条目,例如 \nocite{*} 将添加.bib文件中的所有条目,需要用于打印参考文献列表之前。
  • 实际上 \bibliographystyle 命令并不要求在导言区,在正文中可以使用,例如放在 \bibliography 命令前一行也可以。

一个完整的示例文档如下

1
2
3
4
5
6
7
8
9
10
11
12
\documentclass{article}
\bibliographystyle{plain}

\begin{document}

According to Einstein's theory of relativity \cite{einstein1905}, ...

Another great reference on LaTeX is the book by Leslie Lamport \cite{lamport1994}.

\bibliography{reference}

\end{document}

对于涉及到bibtex的编译过程,需要使用bibtex命令参与编译,编译命令例如(可以省略扩展名)

1
2
3
4
xelatex demo.tex
bibtex demo.aux
xelatex demo.tex
xelatex demo.tex

注意:

  • 在bibtex命令之后至少还需要再编译两次,否则文献的引用可能出现错误。
  • 如果使用latexmk进行编译,就无需进行考虑这些编译命令的细节,latexmk会自动探测并执行多次编译。

biblatex 用法

基于bibtex格式以及bibtex编译命令的这一套流程是最主流的LaTeX参考文献使用方式,但是这种方式存在一些不足:对于UTF-8和中文参考文献的支持不足,对于样式的定制不够灵活等。

对于这些情况,更现代化的biblatex宏包以及biber编译命令就是一个更好的选择,biblatex宏包既支持biber编译命令也支持传统的bibtex编译命令。
基于 biblatex 宏包的方式与传统方式有很多区别,包括文档结构和命令、编译方式、样式选择等均由不同,下面简单记录一下。

仍然是基于 bibtex 格式的文献数据库文件 reference.bib,在编写LaTeX文档时:

  1. 首先需要在导言区调用 biblatex 宏包,在导入时可以指定后端引擎为 biber(默认)或 bibtex,例如 \usepackage[backend=biber]{biblatex}
  2. 然后在导言区使用 \addbibresource 命令引入参考文献数据库,与传统方式不同的是,这里需要填写完整的文件名,例如\addbibresource{reference.bib},如果使用多个 .bib 文件,不能合在一起,需要多次调用 \addbibresource 命令
  3. 在正文中仍然使用 \cite 命令引用参考文献,此外还提供了更丰富的命令达到不同的引用效果,如 \citeauthor\citeyear 分别单独引用作者和年份
  4. 在正文的最后部分使用命令 \printbibliography 打印参考文献列表,无须指定.bib文件名,这个命令支持一些选项,最常见的就是指定参考文献列表的名称。

对于article,默认显示的名称是 References,但是对于report和book,默认显示的名称是 Bibliography,可以修改回来:\printbibliography[title={References}]

关于样式的选择,Biblatex将样式的配置拆分为两部分:在正文中的引用样式(citation style,即xxx.cbx),
在参考文献列表中的著录样式(bibliography style,即xxx.bbx)。常见的默认样式(引用样式和著录样式同名)包括

  • numeric:数字引用样式,引用标记通常以数字形式出现,例如 [1]。
  • authoryear:作者年份引用样式,引用标记通常包括作者和年份,例如 (Smith, 2010)。
  • authortitle:作者标题样式,引用标记包括作者和标题,例如 (Smith, The Title)。

在调用宏包时可以使用 style 选项同时指定样式(此时使用同名的引用样式和著录样式),例如

1
\usepackage[style=authoryear]{biblatex}

或者使用bibstyle 或 citestyle 选项分别指定样式,对于自定义样式还需要分别提供.bbx和.cbx文件。

1
\usepackage[citestyle=xxx,bibstyle=xxx]{biblatex}

一个完整的示例文档如下

1
2
3
4
5
6
7
8
9
10
11
12
13
\documentclass{article}
\usepackage[style=authoryear]{biblatex}
\addbibresource{reference.bib}

\begin{document}

According to Einstein's theory of relativity \cite{einstein1905}, ...

Another great reference on LaTeX is the book by Leslie Lamport \cite{lamport1994}.

\printbibliography

\end{document}

对于涉及到biblatex宏包的编译过程,需要使用biber命令参与编译,编译命令例如(可以省略扩展名)

1
2
3
4
5
xelatex demo.tex
biber demo.aux
# or bibtex demo.aux if backend=bibtex
xelatex demo.tex
xelatex demo.tex

虽然这两种方式都是使用 .bib 数据库文件,但是严格来说,bibtex 和 biblatex 所支持的 .bib 数据库文件的格式是不一样的,biblatex(以及biber)在兼容前者的基础上,允许在 .bib 文件中使用utf8编码,允许包含更丰富的字段信息等。
Zotero 等文献管理工具支持分别导出所谓的 bibtex 格式和 biblatex 格式,由于 biblatex 基本保持了对 bibtex 的兼容,除非遇到某些特殊困难,绝大部分情况下在使用 bibtex 格式而非 biblatex 格式进行导出都是更稳妥的选择。

下图展示了在不同层面上的 bibtex 和 biblatex 的对比。

此外,还可以参考 bibtex vs. biber and biblatex vs. natbib

除了仍然支持 \nocite 打印未引用的参考文献,\printbibliography 甚至还支持移除已经引用的参考文献,例如给对应条目加上keywords = {important},然后使用 \printbibliography[keyword = important],就只会展示标记未 important 的部分参考文献,这在beamer展示时很方便,因为可以精简参考文献列表。

有时我们希望在参考文献列表中反向显示在正文中引用的位置,biblatex 提供了对应选项

1
\usepackage[backref=true]{biblatex}

对于 bibtex 则可以通过 backref 宏包实现类似效果。(biblatex 不兼容 backref 宏包)

bibtex 格式检查

大写保护

首先,需要专门注意的是标题和姓名等的大小写问题:
某些bibtex样式在输出时通常会忽略原始bib文件中的大小写,自动进行某些大小写转换,
但是一些出现在标题中的专有名词是需要保持首字母大写,我们可以通过加一层{}来抑制自动的大小写处理,例如

1
2
3
title     = {On the {Electrodynamics} of {Moving Bodies}},

title = "On the {Electrodynamics} of {Moving Bodies}",

更省事的操作是把title整个都用两层大小写框起来

1
title     = {{On the Electrodynamics of Moving Bodies}},

对于一些专有名词需要保持全大写,这也是最常见的格式细节问题

1
title     = {An {ADMM} Algorithm for Convex Problems with {GPU} Acceleration}

特殊字段

在页面范围字段通常会使用破折号,从某些途径导出的bibtex文件可能使用Unicode字符中的破折号,注意最好将其替换为 --

1
pages     = {891--921},

对于 DOI 字段,应该使用裸 DOI 形式(例如 10.1137/20M1234567),不要包含 https://doi.org/ 前缀:

1
2
3
4
5
% bad
doi = {https://doi.org/10.1137/20M1234567}

% good
doi = {10.1137/20M1234567}

注意:所有合法的 DOI 均以 10. 开头。

arXiv 预印本格式

arXiv 预印本的 bibtex 格式问题很普遍,因为 arXiv 官方导出的 bibtex 包含许多非标准字段(如 eprint, archivePrefix, primaryclass 等),这些字段在默认 bibtex 样式中经常会被忽略,在部分期刊的自定义样式中对其提供了支持。

BibTeX 格式协议具有向下兼容性:它允许用户定义任意的字段,但只有在样式文件(.bst)中显式声明过的字段才会被识别并渲染到 PDF 中,其它字段会被忽略。

例如

1
2
3
4
5
6
7
8
9
@misc{krotz2023hybridmontecarlodiscontinuous,
title={A Hybrid Monte Carlo, Discontinuous Galerkin method for linear kinetic transport equations},
author={Johannes Krotz and Cory D. Hauck and Ryan G. McClarren},
year={2023},
eprint={2312.04217},
archivePrefix={arXiv},
primaryClass={math.NA},
url={https://arxiv.org/abs/2312.04217},
}

建议参考谷歌学术导出格式的做法:

  1. 改类型 @misc@article
  2. 添加字段 journal = {arXiv preprint arXiv:2312.04217}
  3. 可以删除多余的字段,也可以保留

修改后得到

1
2
3
4
5
6
7
8
9
10
@article{krotz2023hybridmontecarlodiscontinuous,
title={A Hybrid Monte Carlo, Discontinuous Galerkin method for linear kinetic transport equations},
author={Johannes Krotz and Cory D. Hauck and Ryan G. McClarren},
year={2023},
eprint={2312.04217},
archivePrefix={arXiv},
primaryClass={math.NA},
url={https://arxiv.org/abs/2312.04217},
journal = {arXiv preprint arXiv:2312.04217},
}

或者确保使用支持 arXiv bibtex 格式的 bibtex 样式。