本课展示了引用数据库的基础知识。将学习如何构建自己的数据库以及如何通过两种主流的工具流将其应用于自己的文档中。
对于文献引用来说,虽然你可以直接引用当前文档中的内容,但是大部分情况下,你可能会从一个或多个外部文件得到文献信息。这种文件就是文献数据库,以一种便于处理的格式存储。使用一个或多个文献数据库可以让你复用一些信息并避免手动设定格式。
引用数据库引用数据库一般被称作「BibTeX 文件」,并带有文件扩展名 .bib。它们包含一条或多条记录,每条记录对应一个引用,每条记录中都会有一系列的域(field)。让我们看一个例子:
@article{Thomas2008, author = {Thomas, Christine M. and Liu, Tianbiao and Hall, Michael B. and Darensbourg, Marcetta Y.}, title= {Series of Mixed Valent {Fe(II)Fe(I)} Complexes That Model the {H(OX)} State of [{FeFe}]Hydrogenase: Redox Properties, Density-Functional Theory Investigation, and Reactivity with Extrinsic {CO}}, journal = {Inorg. Chem.}, year= {2008}, volume = {47}, number = {15}, pages= {7009-7024}, doi = {10.1021/ic800654a},}@book{Graham1995, author= {Ronald L. Graham and Donald E. Knuth and Oren Patashnik}, title = {Concrete Mathematics}, publisher = {Addison-Wesley}, year = {1995},}这两条中一条是文章,另一条是书籍——这些是目前最常见的类型。正如上面所示,每个记录都以 @ 开头,之后所有的信息都会被一对大括号包裹起来。
我们需要的大部分域虽然都以键值对的格式给出,但是与「主键」(key)相区别:「主键」是引用名。你可以使用任意一个名字,毕竟它只是一个标签。而在上面的例子中我们选择使用「作者名+年份」的格式(通常都是这么做的)。
虽然对于需要确切提供什么域,取决于记录类型的选择,但是大部分的域都是顾名思义的。你可能注意到了,在 author 域,每一个作者都以 and 分开。这很重要:输出格式需要了解哪一块是这个作者。你可能还注意到了,在文章标题中,有些部分还会被大括号包裹——以避免被作用任何大小写更正规则。
因为手动编写 .bib 可太枯燥了,所以大部分人都会选择一个专用编辑器。JabRef 跨平台并被广泛使用,当然也有很多其他可用软件。 如果引用有 DOI(数字对象唯一标识符,Digital Object Identifier),你可能想要尝试 doi2bib 来方便地得到 BibTeX 记录(译者注:JabRef 也已内置)。但一定要检查记录是不是正确的那个!
这里我们将使用上面的小数据库来做下面的演示——我们已经将其保存为 learnlatex.bib。
从数据库转化信息将信息插入你的文档分三步走。第一步,使用 LaTeX 编译你的文档,这将会产生包含文档引用列表的文件。第二步,运行一个从引用数据库获取信息的程序,检索出你使用的引用条目,然后按照顺序将它们排列起来。第三步,再次编译你的文档,这样 LaTeX 就可以使用这些信息来解析你的引用信息。通常这需要至少两次的编译来解析所有的引用。
对于第二步而言,现在有两种广泛使用的系统:BibTeX 和 Biber。Biber 仅供 LaTeX 中一个叫 biblatex 的宏包使用,而 BibTeX 可以不搭配宏包使用或者搭配 natbib 使用。
LaTeX 与这两者在不同编辑器上运行需要使用不同的方式处理。我们的在线示例有一些后台脚本来一键完成所有的事宜。你的编辑器可能也有「一键完成」按钮,不然的话,你可能需要在不同的 LaTeX 文档编译中手动选择 BibTeX 或 Biber。
引用(citation)和参考(reference)的格式是独立于 BibTeX 数据库的,并且被一种名为 style(样式)的东西所设定。我们将会看到这些东西在 BibTeX 和 biblatex 工作流中有些许差异,但整体思想是一致的:我们可以选择引用显示的方式。
配合 natbib 的 BibTeX 工作流虽然可以在不加载任何宏包的情况下向 LaTeX 文档插入引用,但这还是比较局限的。与之相对的,我们将使用 natbib 宏包,允许我们创建不同类型的引用,并且可以使用许多类型的样式。
我们输入的基本结构如这个例子所示:
\documentclass{article}\usepackage[T1]{fontenc}\usepackage{natbib}\begin{document}The mathematics showcase is from \citet{Graham1995}, whereasthere is some chemistry in \citet{Thomas2008}.Some parenthetical citations: \citep{Graham1995}and then \citep[p.~56]{Thomas2008}.\citep[See][pp.~45--48]{Graham1995}Together \citep{Graham1995,Thomas2008}\bibliographystyle{plainnat}\bibliography{learnlatex}\end{document}你可以看到我们通过对应的键名引用了数据库里不同的记录。natbib 宏包提供了文本和括号的引用样式:分别是 \citet 和 \citep。参考文献样式是通过 \bibliographystyle 这一行选择的:这里我们使用了 plainnat 样式。参考文献实际上是通过 \bibliography 这一行插入的,同时也选择了使用的数据库(多个数据库采用逗号分隔数据库名)。
页码引用可以通过一个可选参数添加。如果提供了两个可选参数,那么第一个可选参数就被当作引用前的小标记,第二个可选参数就被当作引用标签后的页码引用。
上述设定使用了作者—年份(author-year)样式。但是我们也可以采用数字编码的引用方式。这可以通过向 natbib 行添加 numbers 选项来实现。
biblatex 工作流biblatex 宏包和 natbib 运作方式稍有不同,主要体现在导言区内选择数据库和文档正文内的排印上。它会有一些新的命令。
\documentclass{article}\usepackage[T1]{fontenc}\usepackage[style=authoryear]{biblatex}\addbibresource{learnlatex.bib} % 引用文件\begin{document}The mathematics showcase is from \autocite{Graham1995}.Some more complex citations: \parencite{Graham1995} or\textcite{Thomas2008} or possibly \citetitle{Graham1995}.\autocite[56]{Thomas2008}\autocite[See][45-48]{Graham1995}Together \autocite{Thomas2008,Graham1995}\printbibliography\end{document}注意到 \addbibresource 需要数据库文件名的全称,而不是我们对于 natbib 下的 \bibliography 中省略 .bib 的情形。虽然 biblatex 使用了相对更长的引用命令,但是这些基本上都是顾名思义的。
再次地,引用前后的文字可以通过可选参数插入。注意,这里的页码不需要添加 p.~ 或者 pp.~ 前缀,biblatex 可以自动添加合适的前缀。
在 biblatex 里,加载宏包时文献样式就被选择了。这里,我们使用了 authoryear,当然也可以用 numeric 数字编码和其他许多样式。
在 BibTeX 工作流和 biblatex 中选择纵使 BibTeX 工作流和 biblatex 都需要 BibTeX 文件作为输入,并在文档中产生类似结构的输出,但是他们产生这样的结果使用了截然不同的方法。这就意味着两种方法之间存在一些差异,通过这些差异可以帮助你选择最适合的方式。
在 BibTeX 工作流中,文献样式最终会被一个由 \bibliographystyle 命令选择的 .bst 文件决定。biblatex 不使用 .bst 文件而是使用了不同的系统。如果你使用的模板附带了 .bst 文件或者你的项目被要求使用特定的 .bst 文件,你必须选择 BibTeX 工作流而不可以使用 biblatex。
biblatex 采取了不同方式,这就意味着,你可以通过在文档导言区使用基于 LaTeX 的命令,直接修改参考文献和引用的输出格式。而修改 BibTeX 的 .bst 样式通常需要考察这些外部文件并学习 BibTeX 编程语言的相关知识。一般来讲,biblatex 被称为是比 BibTeX 工作流更容易定制化的一种方案。
在 biblatex 中,通过更广泛的引用命令通常可以更加容易地实现许多精心设计的引用样式。这也提供了