LaTeX 参考文献笔记
整理一下LaTeX中关于参考文献的内容。
基本命令和引用
LaTeX提供的对参考文献的底层支持主要是thebibliography
环境,大致相当于一个特殊的列表,在使用的地方会展示参考文献列表,使用示例如下
1 | \documentclass{article} |
每一项开头为\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
,必须包含author
、title
、journal
和year
- 对于
book
,必须包含author
、title
、publisher
和year
- 对于
这里还需要专门注意的是标题和姓名等的大小写问题:
不同的bibtex样式在输出时通常会忽略原始bib文件中的大小写,自动进行某些大小写转换。
但是一些出现在标题中的专有名词是需要保持首字母大写的,我们可以通过加一层{}
来抑制自动的大小写处理,例如
1
2
3title = {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文档时需要做如下几件事:
- 在导言区使用
\bibliographystyle
命令设置使用的bibtex样式,例如\bibliographystyle{plain}
- 在正文中使用
\cite{name}
或者\cite{name1,name2}
等引用文献 - 在正文的最后部分使用
\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
4xelatex 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文档时:
- 首先需要在导言区调用 biblatex 宏包,在导入时可以指定后端引擎为
biber(默认)或 bibtex,例如
\usepackage[backend=biber]{biblatex}
- 然后在导言区使用
\addbibresource
命令引入参考文献数据库,与传统方式不同的是,这里需要填写完整的文件名,例如\addbibresource{reference.bib}
- 在正文中仍然使用
\cite
命令引用参考文献,此外还提供了更丰富的命令达到不同的引用效果,如\citeauthor
和\citeyear
分别单独引用作者和年份 - 在正文的最后部分使用命令
\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
5xelatex 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 | // ==UserScript== |
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]
参数强制重写文件,但是重写一样会发出警告)