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

原始方式

LaTeX提供的对参考文献的底层支持是thebibliography环境,相当于一个特殊的列表。在使用的地方立刻生成参考文献列表,每一项以\bibterm开始,使用示例如下

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}

注意:

  • 需要指定一个最大数目例如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时,需要如下几个必要环节:

  1. 在导言区使用\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}

  2. 在正文中同样使用\cite{name}或者\cite{name1,name2}等引用文献

  3. 在正文最后使用\bibliography加载.bib文件,并立刻打印参考文献列表

    1
    2
    3
    4
    5
    \bibliography{<bib-name>}

    \bibliography{reference} % reference.bib

    \bibliography{reference,BigBib} % reference.bib and BigBib.bib

  4. 在多次编译中,使用bibtex命令参与编译,例如

    1
    2
    3
    4
    xelatex 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有所不同,包括如下步骤:

  1. 在导言区导入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}

  2. 在导言区使用\addbibresource加载.bib文件,其中location=local指定查找位置,通常是不需要的

    1
    \addbibresource[location=local]{reference.bib} % reference.bib 完整文件名

  3. 在正文中同样使用\cite{name}或者\cite{name1,name2}等引用文献,还支持\footcite等不同效果的引用命令

  4. 在正文最后使用如下命令打印参考文献列表,可以加入一些参数来设置细节

    1
    2
    3
    4
    5
    \printbibliography

    \printbibliography[heading=bibintoc] % 将参考文献列表作为一个章节加入目录

    \printbibliography[title={References}] % 指定参考文献列表的标题为References

  5. 在多次编译中,如果指定biber为后端,就需要使用biber命令参与编译,例如

    1
    2
    3
    4
    xelatex 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 分别指定样式。

常见的默认样式包括

  1. numeric 数字样式:style=numeric,数字引用样式,引用标记通常以数字形式出现,例如 [1]。
  2. authoryear 作者年份样式:style=authoryear,作者年份引用样式,引用标记通常包括作者和年份,例如 (Smith, 2010)。
  3. authortitle 作者标题样式:style=authortitle,引用标记包括作者和标题,例如 (Smith, The Title)。
  4. verbose 详细样式:style=verbose,提供详细的引用信息。

在正文中引用时,支持下面的个性化引用命令:

  1. \cite{}:这是最基本的引用命令,用于在文中引用文献条目。格式由biblatex的样式定义。
  2. \parencite{}:与\cite{}类似,但它将引用放在括号中。通常用于在文本中使用圆括号括起引用。
  3. \textcite{}:这个命令用于在文本中引用文献,同时在括号中给出作者名和年份。适用于在正文中直接提及作者。
  4. \supercite{}:与\parencite{}相似,但产生上标引用。通常用于脚注或类似的环境中。
  5. \autocite{}:这是一个更灵活的命令,它会根据上下文自动选择合适的引用样式,可以根据需要生成内文引用、上标引用或其他引用样式。

注:除此之外,natbib宏包也经常用于参考文献的管理之中,这里略去。关于参考文献的具体格式(bib文件中的条目格式,在pdf中显示的格式),也是非常繁琐的,配合使用Zotero导出文献时也存在复杂的格式问题,这里暂不讨论。

补充

谷歌学术 bibtex 导出

在谷歌学术上获取文献的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]参数强制重写文件,但是重写一样会发出警告)