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

基本命令和引用

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

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}

bibtex格式

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

需要注意的是,由于 bibtex 格式比较灵活自由,从不同来源获取的文献条目虽然都可以正常使用,但是它们的内容可能并不完全相同(标签的生成规则可能不同,包含的字段也可能不同)。

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

下面依次进行解释。

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

1
@article{ ... }

常见的条目类型包括:

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

每一个条目的内容都使用{}包裹,在{后需要紧接着一个标签(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样式在输出时通常会忽略原始bib文件中的大小写,自动进行某些大小写转换。 但是一些出现在标题中的专有名词是需要保持首字母大写的,我们可以通过加一层{}来抑制自动的大小写处理,例如

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

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

补充:在下面这个字段中使用了破折号,从某些途径导出的bibtex文件可能会出现--部分实际是一个非ASCII字符的Unicode字符问题,注意进行替换。

1
pages     = "891--921",

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宏包实现这种更“自然”的引用方式,这里不做讨论。

使用方法

使用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}
  3. 在正文中仍然使用 \cite 命令引用参考文献,此外还提供了更丰富的命令达到不同的引用效果,如 \citeauthor\citeyear 分别单独引用作者和年份
  4. 在正文的最后部分使用命令 \printbibliography 打印参考文献列表,无须指定.bib文件名,这个命令其实也支持一些选项,但是通常不需要使用

关于样式的选择,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

谷歌学术复制脚本

在谷歌学术上获取文献的bibtex格式信息的步骤比较麻烦,下面的油猴脚本可以做到一键复制,非常方便。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// ==UserScript==
// @name 谷歌学术直接复制bibtex
// @namespace blog.icespite.top
// @version 0.3
// @description 在学术网站上直接复制bibtex到剪贴板,免去跳转步骤,请在设置中开启“导入BibTeX”按钮。
// @author IceSpite
// @match https://scholar.google.com/scholar*
// @match https://scholar.google.com.hk/scholar*
// @require https://unpkg.com/jquery@3.7.1/dist/jquery.js
// @connect scholar.googleusercontent.com
// @grant GM_setClipboard
// @grant GM_xmlhttpRequest
// @run-at document-end
// @license MIT
// @downloadURL https://update.greasyfork.org/scripts/442869/%E8%B0%B7%E6%AD%8C%E5%AD%A6%E6%9C%AF%E7%9B%B4%E6%8E%A5%E5%A4%8D%E5%88%B6bibtex.user.js
// @updateURL https://update.greasyfork.org/scripts/442869/%E8%B0%B7%E6%AD%8C%E5%AD%A6%E6%9C%AF%E7%9B%B4%E6%8E%A5%E5%A4%8D%E5%88%B6bibtex.meta.js
// ==/UserScript==

(function() {
'use strict';
var ALERT = true;
$('a.gs_nta.gs_nph').each(function() {
if (this.classList.length==2) {
var that = this;
this.onclick = function() {
GM_xmlhttpRequest({
url: that.href,
onload: ({
responseText
}) => {
GM_setClipboard(responseText);
if (ALERT) {
alert('复制成功:\n' + responseText);
}
}
});
return false;
}
}
})
})();

filecontents宏包

有时候,我们只需要在文档中使用一两个参考文献,或者需要提供单个文件的最小工作示例,额外创建一个bib文件看起来有点麻烦, 使用filecontents环境可以进行简化,例如在.tex文件中使用下面的片段

1
2
3
4
5
6
7
8
9
10
11
12
13
\begin{filecontents}{reference.bib}
@article{eigel2023dynamical,
title = {Dynamical Low-rank Approximations of Solutions to the {{Hamilton}}--{{Jacobi}}--{{Bellman}} Equation},
author = {Eigel, Martin and Schneider, Reinhold and Sommer, David},
year = {2023},
journal = {Numerical Linear Algebra with Applications},
volume = {30},
number = {3},
pages = {e2463},
issn = {1070-5325, 1099-1506},
doi = {10.1002/nla.2463}
}
\end{filecontents}

在编译时就会自动创建对应的临时文件reference.bib并写入环境中的内容,默认还会加上一个注释头部(使用filecontents*环境则不会附带注释头部),完整内容为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
%% LaTeX2e file `./reference.bib'
%% generated by the `filecontents' environment
%% from source `main' on 2024/11/28.
%%
@article{eigel2023dynamical,
title = {Dynamical Low-rank Approximations of Solutions to the {{Hamilton}}--{{Jacobi}}--{{Bellman}} Equation},
author = {Eigel, Martin and Schneider, Reinhold and Sommer, David},
year = {2023},
journal = {Numerical Linear Algebra with Applications},
volume = {30},
number = {3},
pages = {e2463},
issn = {1070-5325, 1099-1506},
doi = {10.1002/nla.2463}
}

和其它杂项文件一样,这里的临时文件默认在aux目录中创建,但是如果文件已经存在(在aux目录或当前目录存在同名文件),则不会主动覆盖现存的文件,而是会发出警告。(虽然可以加上[overwrite]参数强制重写文件,但是重写一样会发出警告)