LaTeX 参考文献笔记
整理一下LaTeX中关于参考文献的内容。
原始方式
LaTeX提供的对参考文献的底层支持是thebibliography
环境,相当于一个特殊的列表。在使用的地方立刻生成参考文献列表,每一项以\bibterm
开始,使用示例如下
1 | \documentclass{article} |
注意:
- 需要指定一个最大数目例如99,用于限制编号的最大宽度
- 每一个条目后的参数是条目标识,在正文中引用时使用,例如
\cite{knuth1984}
,可以多个同时引用,例如\cite{einstein1905,knuth1984}
- 原始方式仅了解一下,通常不会使用,主要使用的是下面这些更高级的工具
Bibtex
Bibtex引擎使用如下的格式来记录参考文件数据,通常也称为Bibtex格式,从Google
Scholar或期刊/数据库的网站上都能够导出 Bibtex 文献条目。
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}
}
其中最开始的名称(即einstein1905
)为条目的唯一标识,在正文中可以通过\cite
命令引用,如果唯一标识重复,就会导致对应关系错误并触发编译警告。
通常将所有的参考文献汇总到一个文本文件中,记作reference.bib。注意并不是.bib文件的所有条目都会被打印在参考文献列表中,只会打印前文提到的部分。
在使用Bibtex时,需要如下几个必要环节:
在导言区使用
\bibliographystyle
设置参考文献的呈现样式:作者,名称,年份的顺序,大小写等细节。可以直接使用内置的几种样式,也可以使用期刊自定义的文献显示样式(需要提供.bst文件)1
2
3
4
5
6
7
8
9
10
11
12
13
14\bibliographystyle{<bst-name>}
% 基础样式,使用数字编号,按字母顺序排列,比较次序为作者的姓和名、年度和标题
% 下面几个样式都是基于plain进行的修改
\bibliographystyle{plain}
% 尽量使用缩写使信息更紧凑
\bibliographystyle{abbrv}
% 用作者名首字母+年份后两位作为编号,而非默认的数字编号,例如 [ABCD13]
\bibliographystyle{alpha}
% 直接按照引用的先后顺序,而非默认的字母顺序
\bibliographystyle{unsrt}在正文中同样使用
\cite{name}
或者\cite{name1,name2}
等引用文献在正文最后使用
\bibliography
加载.bib文件,并立刻打印参考文献列表1
2
3
4
5\bibliography{<bib-name>}
\bibliography{reference} % reference.bib
\bibliography{reference,BigBib} % reference.bib and BigBib.bib在多次编译中,使用bibtex命令参与编译,例如
1
2
3
4xelatex demo.tex
bibtex demo.aux
xelatex demo.tex
xelatex demo.tex
完整示例如下 1
2
3
4
5
6
7
8
9
10
11
12
13
14\documentclass{article}
\bibliographystyle{plain}
\begin{document}
According to Einstein's theory of relativity \cite{einstein1905}...
\medskip
Another great reference on LaTeX is the book by Leslie Lamport \cite{lamport1994}.
\bibliography{reference} % reference.bib
\end{document}
注意:默认不会打印.bib文件的所有条目,而是只会筛选出\cite{}
提到的条目,如果需要强制在参考文献列表中呈现未提及的项,可以使用\nocite{}
命令指定添加某些条目,例如\nocite{*}
将添加.bib文件中的所有条目,需要用于打印参考文献列表之前(下面的biblatex同样支持)
1
2\nocite{*}
\bibliography{reference} % reference.bib
Biblatex
Bibtex是传统的参考文献处理方案,而Biblatex是更现代的方案,或者说提供了一个兼容Bibtex的前端,它提供了更多的自定义选项和灵活性,可以轻松地定制引用和参考文献列表的显示样式,并且对于UTF-8编码和多语言的支持更好。
Biblatex 可以使用Biber(默认)或者Bibtex作为后端处理工具,而传统的Bibtex只能使用Bibtex本身,无论哪一种方案都需要提供.bib数据文件。
严格来说,Bibtex 和 Biblatex 所使用的 .bib 数据文件的格式是不一样的,Biblatex 格式的 .bib 文件允许包含更丰富的字段信息。Zotero 等文献管理工具支持分别导出这两种格式,谷歌学术默认导出的是 Bibtex 格式。 由于 Biblatex 基本保持了对 Bibtex 的兼容,无论实际使用 Biblatex 还是 Bibtex 进行编译,在导出 .bib 文件时使用 Bibtex 格式都是不错的选择。如果对于参考文献的排版细节要求较高,可以考虑使用 Biblatex 格式。
基本使用
Biblatex的基本使用与Bibtex有所不同,包括如下步骤:
在导言区导入biblatex宏包,在导入宏包时可以指定后端为biber(默认)或bibtex,还可以自定义参考文献列表的显示样式(提供.bbx和.cbx文件)
1
2
3
4
5
6
7\usepackage[<options>]{biblatex}
\usepackage[backend=biber]{biblatex}
\usepackage[backend=bibtex]{biblatex}
\usepackage[backend=biber,citestyle=xxx,bibstyle=xxx]{biblatex}在导言区使用
\addbibresource
加载.bib文件,其中location=local
指定查找位置,通常是不需要的1
\addbibresource[location=local]{reference.bib} % reference.bib 完整文件名
在正文中同样使用
\cite{name}
或者\cite{name1,name2}
等引用文献,还支持\footcite
等不同效果的引用命令在正文最后使用如下命令打印参考文献列表,可以加入一些参数来设置细节
1
2
3
4
5\printbibliography
\printbibliography[heading=bibintoc] % 将参考文献列表作为一个章节加入目录
\printbibliography[title={References}] % 指定参考文献列表的标题为References在多次编译中,如果指定biber为后端,就需要使用biber命令参与编译,例如
1
2
3
4xelatex demo.tex
biber demo.aux
xelatex demo.tex
xelatex demo.tex
完整示例如下 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15\documentclass{article}
\usepackage[style=authoryear]{biblatex}
\addbibresource{reference.bib} % reference.bib
\begin{document}
According to Einstein's theory of relativity \parencite{einstein1905}...
\medskip
Another great reference on LaTeX is the book by Leslie Lamport \cite{lamport1994}.
\printbibliography
\end{document}
如果reference.bib文件不存在,上述命令会报错,我们可以先判断文件是否存在,在存在时将其添加,例如
1
2\usepackage[style=numeric]{biblatex}
\IfFileExists{reference.bib}{\addbibresource{reference.bib}}{}
更多细节
Biblatex支持的参考文献样式拆分为两部分:在正文中的引用样式(citation
style,即xxx.cbx
),
在参考文献列表中的著录样式(bibliography
style,即xxx.bbx
)。 在调用宏包时可以使用 style
选项同时指定样式(此时使用同名的引用样式和著录样式),或者使用bibstyle
或 citestyle 分别指定样式。
常见的默认样式包括
- numeric
数字样式:
style=numeric
,数字引用样式,引用标记通常以数字形式出现,例如 [1]。 - authoryear
作者年份样式:
style=authoryear
,作者年份引用样式,引用标记通常包括作者和年份,例如 (Smith, 2010)。 - authortitle
作者标题样式:
style=authortitle
,引用标记包括作者和标题,例如 (Smith, The Title)。 - verbose
详细样式:
style=verbose
,提供详细的引用信息。
在正文中引用时,支持下面的个性化引用命令:
\cite{}
:这是最基本的引用命令,用于在文中引用文献条目。格式由biblatex的样式定义。\parencite{}
:与\cite{}
类似,但它将引用放在括号中。通常用于在文本中使用圆括号括起引用。\textcite{}
:这个命令用于在文本中引用文献,同时在括号中给出作者名和年份。适用于在正文中直接提及作者。\supercite{}
:与\parencite{}
相似,但产生上标引用。通常用于脚注或类似的环境中。\autocite{}
:这是一个更灵活的命令,它会根据上下文自动选择合适的引用样式,可以根据需要生成内文引用、上标引用或其他引用样式。
注:除此之外,natbib宏包也经常用于参考文献的管理之中,这里略去。关于参考文献的具体格式(bib文件中的条目格式,在pdf中显示的格式),也是非常繁琐的,配合使用Zotero导出文献时也存在复杂的格式问题,这里暂不讨论。
补充
谷歌学术 bibtex 导出
在谷歌学术上获取文献的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]
参数强制重写文件,但是重写一样会发出警告)