对于任何学术或研究写作,引用文献是一个重要的任务。幸运的是,LaTeX 提供了多种功能,使得处理引用变得更加简单,包括内置的引用支持。然而,借助一个名为 BibTeX 的辅助工具,可以实现更强大和灵活的解决方案(它与 LaTeX 一起捆绑提供)。最近,许多用户已经转向了 BibLaTeX,这是一种可以在 LaTeX 语法内配置的工具。

BibTeX 提供了一种将所有引用存储在一个带有 .bib 扩展名的文献数据库文件中的方式。这种数据库可以在任何 LaTeX 文档中引用,引用文件中的任何记录。这通常比将它们嵌入到每个文档的结尾更为方便;一个集中管理的文献源可以与任意多个文档链接(一次编写,多次引用!)。当然,文献列表可以拆分成多个文件,比如一个包含与主题 A 相关的源文件(a.bib),另一个包含与主题 B 相关的源文件(b.bib)。在撰写有关主题 AB 的文档时,可以将这两个文件都链接到文档中(也许还会有一个专门针对 AB 主题的源文件 ab.bib)。

嵌入式系统

如果你只写一两个文档,并且不打算长时间再写与同一主题相关的内容,那么你可能不希望浪费时间创建一个永远不会用到的引用数据库。在这种情况下,你应该考虑使用 LaTeX 中内置的简单文献支持。

LaTeX 提供了一个名为 thebibliography 的环境,你需要在文档的适当位置使用它;通常是在文档的最后,在 \end{document} 命令之前。下面是一个实际的例子:

\begin{thebibliography}{9}

\bibitem{lamport94}
  Leslie Lamport,
  \textit{\LaTeX: a document preparation system},
  Addison Wesley, Massachusetts,
  2nd edition,
  1994.

\end{thebibliography}

这里发生了什么?

首先要注意的是,创建了一个 thebibliography 环境。thebibliography 是一个关键字,告诉 LaTeX 将开始和结束标签之间的内容作为文献数据进行处理。参数是我在 \begin{thebibliography} 后提供的,它告诉 LaTeX 打印文献条目的标签时应该有多宽。注意,数字本身不是参数,而是数字的位数。因此,我实际上是在告诉 LaTeX 我只需要一个字符长的引用标签,这意味着文献总数不超过九条。如果你需要超过九条引用,可以输入任意两位数,例如 '56',这将允许最多 99 条文献。

接下来是实际的参考文献条目。它以 \bibitem{cite_key} 命令作为前缀。cite_key 应该是该参考文献的唯一标识符,通常由字母、数字和标点符号组成(但不能包含逗号)。我常常使用作者姓氏,后跟年份的最后两位数字(例如 lamport94)。如果该作者在同一年有多个引用,那么我会在后面加上字母 'a'、'b' 等。但你可以根据自己的需要进行设置。

引用

引用给定文献非常简单。在你希望引用出现的地方,使用以下命令:\cite{cite_key},其中 cite_key 是你希望引用的 \bibitem 的标识符。当 LaTeX 处理文档时,引用将与 \bibitem 中的条目进行交叉引用,并用适当的编号替换。再次强调,LaTeX 为你处理了编号。如果完全是手动的话,添加或删除引用将是非常麻烦的,因为你必须手动重新编号所有引用。

例如:

Instead of WYSIWYG editors, typesetting systems like \TeX{} or \LaTeX{} \cite{lamport94} can be used.

更具体的引用

如果你想引用某本教科书中的特定页码、图表或定理,可以使用 \cite 命令的参数:

\cite[p.~215]{citation01}

这将引用 citation01 文献的第 215 页。

“p. 215” 参数将出现在相同的括号内。请注意 [p.215] 中的波浪符,它将句子末尾的间距替换为不可断开的单词间空格。插入这个不可断开的空格是因为句末空格通常过宽,而 "p." 不应与页码分开。代码 \cite[215]{citation01} 会产生相同的结果——在这种情况下,页码前面的 "p." 将自动添加;但对于 \cite[Cor.~2.5]{citation01} 则不会添加。

多重引用

当需要多条引用时,应该使用一个 \cite{} 命令。引用之间通过逗号分隔。下面是一个例子:

\cite{citation01,citation02,citation03}

结果将根据引用风格显示在同一对括号内。

文献格式

有几种不同的方式来格式化文献引用和在文本中对它们的引用。这些被称为引用风格,包含两部分:简短引用的格式(即插入文本中标识参考文献条目的标记)和对应参考文献列表中的条目格式,包括完整的文献息。

简短引用可以有两种主要类型:数字型或文本型。数字型引用(也称为温哥华引用系统)按出现顺序依次编号,包含圆括号中的阿拉伯数字(1)、方括号[1]、上标1,或其组合[1]。文本型引用(也称为哈佛引用系统)使用作者的姓氏和(通常)年份作为简短引用的形式,通常完全(Smith 2015)或部分地放入括号内,例如 Smith(2015)。后者形式允许引用与它所支持的句子融合。

下面是 LaTeX 可用的三种风格:

  • plain

  • abbrv

  • alpha

这里是一些常用风格:

风格名称 作者名称格式 引用格式 排序方式
plain Homer Jay Simpson #ID# 按作者排序
unsrt Homer Jay Simpson #ID# 按引用顺序
abbrv H. J. Simpson #ID# 按作者排序
alpha Homer Jay Simpson Sim95 按作者排序
abstract Homer Jay Simpson Simpson-1995a
acm Simpson, H. J. #ID#
authordate1 Simpson, Homer Jay Simpson, 1995
apacite Simpson, H. J. (1995) Simpson1995
named Homer Jay Simpson Simpson 1995

然而,请记住,使用这些大多数风格时,您需要使用 natbib 包。

不引用

如果您只希望参考文献出现在文献列表中,而不在主文中引用它,则可以使用 \nocite{} 命令,例如:

Lamport showed in 1995 something...  \nocite{lamport95}.

命令的特殊版本 \nocite{*} 会包括数据库中的所有条目,无论它们是否在文档中被引用。

Natbib

Natbib 的文本和括号命令:

引用命令 输出
\citet{goossens93} Goossens et al. (1993)
\citep{goossens93} (Goossens et al., 1993)
\citet*{goossens93} Goossens, Mittlebach, and Samarin (1993)
\citep*{goossens93} (Goossens, Mittlebach, and Samarin, 1993)
\citeauthor{goossens93} Goossens et al.
\citeauthor*{goossens93} Goossens, Mittlebach, and Samarin
\citeyear{goossens93} 1993
\citeyearpar{goossens93} (1993)
\citealt{goossens93} Goossens et al. 1993
\citealp{goossens93} Goossens et al., 1993
\citetext{priv.\ comm.} (priv. comm.)

使用标准的 LaTeX 文献支持时,每条引用都会被编号,每个引用都对应一个编号。数字型引用在科学写作中非常常见。在其他学科中,作者-年份的引用风格,例如(Roberts, 2003),如哈佛引用系统,通常更为流行。natbib 包是实现这种输出的一种可能方式。实际上,它可以替代 LaTeX 自身的引用命令,因为 Natbib 允许用户轻松地在哈佛或数字引用之间切换。

配置 Natbib 包

首先,您需要在前言中添加以下内容,以便 LaTeX 使用 Natbib 包:

\usepackage[options]{natbib}

一个有用的选项示例是:

\usepackage[square,sort,comma,numbers]{natbib}

此外,您还需要更改要使用的文献样式文件,因此编辑文件底部的相应行,使其变为:

\bibliographystyle{plainnat}

完成后,基本的工作就是修改现有的 \cite 命令,以显示您想要的引用类型。

与 Natbib 兼容的引用风格

风格 来源 描述
plainnat 提供 与 plain 兼容的 natbib 版本
abbrvnat 提供 与 abbrv 兼容的 natbib 版本
unsrtnat 提供 与 unsrt 兼容的 natbib 版本
apsrev REVTeX 4 官网 物理评论期刊的 natbib 兼容样式
rmpaps REVTeX 4 官网 现代物理评论期刊的 natbib 兼容样式
IEEEtranN TeX 目录条目 IEEE 期刊的 natbib 兼容样式
achemso TeX 目录条目 美国化学学会期刊的 natbib 兼容样式
rsc TeX 目录条目 皇家化学学会期刊的 natbib 兼容样式

自定义 Natbib

Natbib 的自定义选项:

选项 说明
round : square : curly : angle 括号类型(默认圆括号)
colon : comma 多个引用使用分号(默认)或逗号分隔
authoryear : numbers : super 作者年份风格(默认),数字引用或上标数字引用
sort : sort&compress 按引用顺序排序或压缩多个数字引用
longnamesfirst 首次引用使用完整作者列表,后续引用使用缩写 et al.
sectionbib 与 chapterbib 包一起使用,重新定义 \thebibliography 使用 \section* 代替 \chapter*
nonamebreak 保证作者姓名在引用中保持在一行内,解决一些 hyperref 问题

通过添加星号(*),你可以覆盖此默认设置,并列出与该引用相关的所有作者。Natbib 还支持一些其他专门的命令,具体内容可以在此处的表格中查看。请记住,例如 abbrvnat 不支持 \citet*,并且会自动在所有作者和“et al.”之间进行选择。

我希望讲解的最后一个关于 Natbib 的主题是如何定制其引用样式。你可以使用一个名为 \bibpunct 的命令来覆盖默认设置并更改某些配置。例如,在前言中,我添加了以下内容:

\bibpunct{(}{)}{;}{a}{,}{,}

这个命令需要六个必填参数:

  1. 开括号的符号。

  2. 闭括号的符号。

  3. 在多个引用之间出现的符号。

  4. 这个参数接受一个字母:

    • n - 数字样式。

    • s - 数字上标样式。

    • 其他字母 - 作者-年份样式。

  5. 在作者和年份之间出现的标点符号(仅限圆括号情况)。

  6. 在多个引用中,当有共同作者时,年份之间使用的标点符号。例如:(Chomsky 1956, 1957)。如果你想要额外的空格,可以使用 {,~}

\bibpunct 控制的某些选项也可以通过加载时传递选项给 natbib 包来访问。这些选项还允许你控制文献的一些其他方面,详情见右侧表格

正如你所看到的,这个包非常灵活,尤其是你只需要通过更改一个参数,就可以轻松切换不同的引用样式。强烈建议你查看 Natbib 手册,它是一个简短的文档,你可以学到更多如何使用它的技巧。

BibTeX

我之前已经介绍了将文献引用嵌入文档末尾,并使用 \cite 命令在正文中引用它们的方法。在本教程中,我想介绍一种比这种方法更好的方法,因为它没有那么灵活。我将重点介绍使用 BibTeX。

BibTeX 数据库存储为 .bib 文件。它是一个纯文本文件,因此可以很容易地查看和编辑。文件的结构也非常简单。以下是一个 BibTeX 条目的例子:

@article{greenwade93,
    author  = "George D. Greenwade",
    title   = "The {C}omprehensive {T}ex {A}rchive {N}etwork ({CTAN})",
    year    = "1993",
    journal = "TUGBoat",
    volume  = "14",
    number  = "3",
    pages   = "342--351"
}

每个条目以声明引用类型开始,形式为 @type。BibTeX 知道几乎所有你能想到的类型,常见的有:book、article,对于会议论文,有 inproceedings。在这个例子中,我引用了一个期刊文章。

在类型之后,你必须使用左大括号 { 来表示引用属性的开始。第一个属性紧随其后,即引用键或 BibTeX 键。这个键必须是你文献中所有条目中唯一的标识符。你将在文档中使用这个标识符来交叉引用此条目。你可以根据自己的需要给每个引用命名,但有一个松散的标准:使用作者的姓氏,后跟出版年份。这是我在本教程中使用的方案。

接下来应该很清楚,后面是该特定引用的相关字段和数据。字段名称是 BibTeX 关键字。它们后面跟着一个等号 =,然后是该字段的值。BibTeX 希望你明确标记每个值的开始和结束。我个人使用引号("),但你也可以选择使用大括号({})。但正如你很快会看到的,大括号在属性中有其他作用,因此我更喜欢不在这个任务中使用它们,以免引起混淆。一个显著的例外是当你想使用带有变音符号的字符(如 ü、ö 等)时,因为它们的标记格式是 \"{o},而引号会关闭打开字段,导致引用解析错误。使用 \usepackage[utf8]{inputenc}.tex 源文件的前言中可以解决这个问题,因为带有变音符号的字符可以直接存储在 .bib 文件中,无需特殊标记。这确保了整个 .bib 文件的一致格式,避免了在考虑变音符号时需要使用大括号。

记住,每个属性后面必须加上逗号来区分它们。你不需要为最后一个属性添加逗号,因为闭大括号会告诉 BibTeX 该条目没有更多的属性,虽然如果加上逗号也不会报错。

学习参考类型以及每种类型可用的字段(以及哪些是必需的,哪些是可选的)可能需要一些时间。因此,查看此条目类型参考以及此字段参考来了解所有字段的描述可能是一个好主意。当你需要时,可以方便地使用这些页面。为了你的方便,下表中重复了其中的大部分息。

标准 BibTeX 条目和字段类型

类型 必填字段 可选字段
article author, title, year journal, volume, number, pages
book author, title, year publisher, address, edition
inproceedings author, title, year booktitle, pages, publisher

作者

BibTeX 在处理作者姓名时相当智能。它可以接受姓名格式为 "名字 姓" 或 "姓, 名"。我个人使用前者,但请记住,输入的顺序(或条目中的任何数据)是可定制的,因此你可以让 BibTeX 操控输入并以你喜欢的方式输出。如果你使用的是 "名字 姓" 格式,你必须小心处理一些特殊的名字,比如复姓,例如 "John von Neumann"。在这种格式下,BibTeX 假设最后一个词是姓氏,之前的部分是名字和任何中间名。因此,你必须手动告诉 BibTeX 将 "von" 和 "Neumann" 放在一起。这个方法很简单,只需使用大括号,最终结果就是 "John {von Neumann}"。对于姓氏和名字格式来说,这种情况很容易避免,因为你可以使用逗号将姓和名分开。

其次,如何告诉 BibTeX 当一个参考文献有多个作者时呢?这非常简单,只需在每个作者之间添加关键词 and。正如另一个例子所示:

@book{goossens93,
    author    = "Michel Goossens and Frank Mittelbach and Alexander Samarin",
    title     = "The LaTeX Companion",
    year      = "1993",
    publisher = "Addison-Wesley",
    address   = "Reading, Massachusetts"
}

这本书有三位作者,每个作者之间都如上所述使用了 and。当然,当 BibTeX 处理并输出时,最终只会在倒数第二个和最后一个作者之间加上 and,但在 .bib 文件中,它需要这些 and 以便跟踪每个作者。

标准模板

标准模板可以直接复制并填写。可选项在核心中标记为 ? 前缀。注意,LaTeX 中用于注释行的 % 符号在 BibTeX 中不起作用,并会创建无效的字段名。在 BibTeX 中,有效但未知的字段名和条目外的名称会被忽略,这就导致了常用的注释方法。<--注意,如果你复制以下模板,% 符号在 BibTeX 文件中不能用作注释行。如果你想注释一行,必须将它放在条目外部。-->

@article

来自杂志或期刊的文章。 必填字段:author, title, journal, year。 可选字段:volume, number, pages, month, note。

@article{Xarticle,
    author    = "",
    title     = "",
    journal   = "",
    ?_volume  = "",
    ?_number  = "",
    ?_pages   = "",
    year      = "XXXX",
    ?_month   = "",
    ?_note    = "",
}

@book

已出版的书籍。 必填字段:author/editor, title, publisher, year。 可选字段:volume/number, series, address, edition, month, note。

@book{Xbook,
    author    = "",
    title     = "",
    publisher = "",
    ?_volume  = "",
    ?_number  = "",
    ?_series  = "",
    ?_address = "",
    ?_edition = "",
    year      = "XXXX",
    ?_month   = "",
    ?_note    = "",
}

@booklet

没有命名出版商或赞助商的装订作品。 必填字段:title。 可选字段:author, howpublished, address, month, year, note。

@booklet{Xbooklet,
    ?_author      = "",
    title         = "",
    ?_howpublished = "",
    ?_address     = "",
    ?_year        = "XXXX",
    ?_month       = "",
    ?_note        = "",
}

@conference

等同于 inproceedings。 必填字段:author, title, booktitle, year。 可选字段:editor, volume/number, series, pages, address, month, organization, publisher, note。

@conference{Xconference,
    author    = "",
    title     = "",
    booktitle = "",
    ?_editor  = "",
    ?_volume  = "",
    ?_number  = "",
    ?_series  = "",
    ?_pages   = "",
    ?_address = "",
    year      = "XXXX",
    ?_month   = "",
    ?_publisher= "",
    ?_note    = "",
}

@inbook

书中的一个章节没有自己的标题。 必填字段:author/editor, title, chapter 和/或 pages, publisher, year。 可选字段:volume/number, series, type, address, edition, month, note。

@inbook{Xinbook,
    author    = "",
    editor    = "",
    title     = "",
    chapter   = "",
    pages     = "",
    publisher = "",
    ?_volume  = "",
    ?_number  = "",
    ?_series  = "",
    ?_type    = "",
    ?_address = "",
    ?_edition = "",
    year      = "",
    ?_month   = "",
    ?_note    = "",
}

@incollection

书中的一个有自己标题的章节。 必填字段:author, title, booktitle, publisher, year。 可选字段:editor, volume/number, series, type, chapter, pages, address, edition, month, note。

@incollection{Xincollection,
    author    = "",
    title     = "",
    booktitle = "",
    publisher = "",
    ?_editor  = "",
    ?_volume  = "",
    ?_number  = "",
    ?_series  = "",
    ?_type    = "",
    ?_chapter = "",
    ?_pages   = "",
    ?_address = "",
    ?_edition = "",
    year      = "",
    ?_month   = "",
    ?_note    = "",
}

@inproceedings

在会议论文集中发表的文章。 必填字段:author, title, booktitle, year。 可选字段:editor, volume/number, series, pages, address, month, organization, publisher, note。

@inproceedings{Xinproceedings,
    author      = "",
    title       = "",
    booktitle   = "",
    ?_editor    = "",
    ?_volume    = "",
    ?_number    = "",
    ?_series    = "",
    ?_pages     = "",
    ?_address   = "",
    ?_organization = "",
    ?_publisher = "",
    year        = "",
    ?_month     = "",
    ?_note      = "",
}

@manual

技术手册 必填字段:title。 可选字段:author, organization, address, edition, month, year, note。

@manual{Xmanual,
    title       = "",
    ?_author    = "",
    ?_organization = "",
    ?_address   = "",
    ?_edition   = "",
    year        = "",
    ?_month     = "",
    ?_note      = "",
}

@mastersthesis

硕士论文 必填字段:author, title, school, year。 可选字段:type(如“diploma thesis”),address, month, note。

@mastersthesis{Xthesis,
    author      = "",
    title       = "",
    school      = "",
    ?_type      = "diploma thesis",
    ?_address   = "",
    year        = "XXXX",
    ?_month     = "",
    ?_note      = "",
}

@misc

用于其他类型出版物的模板 必填字段:无 可选字段:author, title, howpublished, month, year, note。

@misc{Xmisc,
    ?_author    = "",
    ?_title     = "",
    ?_howpublished = "",
    ?_year      = "XXXX",
    ?_month     = "",
    ?_note      = "",
}

@phdthesis

博士论文 必填字段:author, title, year, school。 可选字段:address, month, keywords, note。

@phdthesis{Xphdthesis,
    author      = "",
    title       = "",
    school      = "",
    ?_address   = "",
    year        = "",
    ?_month     = "",
    ?_keywords  = "",
    ?_note      = "",
}

@proceedings

会议论文集。 必填字段:title, year。 可选字段:editor, volume/number, series, address, month, organization, publisher, note。

@proceedings{Xproceedings,
    title       = "",
    ?_editor    = "",
    ?_volume    = "",
    ?_number    = "",
    ?_series    = "",
    ?_address   = "",
    ?_organization = "",
    ?_publisher = "",
    year        = "",
    ?_month     = "",
    ?_note      = "",
}

@techreport

教育、商业或标准化机构的技术报告。 必填字段:author, title, institution, year。 可选字段:type, number, address, month, note。

@techreport{Xtreport,
    author      = "",
    title       = "",
    institution = "",
    ?_type      = "", 
    ?_number    = "",
    ?_address   = "",
    year        = "XXXX",
    ?_month     = "",
    ?_note      = "",
}

@unpublished

未发表的文章、书籍、论文等。 必填字段:author, title, note。 可选字段:month, year。

@unpublished{Xunpublished,
    author      = "",
    title       = "",
    ?_year      = "",
    ?_month     = "",
    note        = "",
}

非标准模板

@patent

可以从 Google Patents 导出 BibTeX 条目。 (参见“使用 BibTeX 引用专利”作为替代方案)

@collection

@electronic

@Unpublished

用于在 REVTEX 风格文章中引用 arXiv.org 论文。 (参见 REVTEX 作者指南)

保留字母的大小写

如果 BibTeX 设置的样式不保留标题中的所有大写字母时,可能会出现问题,尤其是当你引用专有名词或缩略词时。要告诉 BibTeX 保留这些字母的大小写,可以使用花括号包围该字母(如果是缩略词,则包围多个字母),这样就能解决问题!例如,如果化学公式在某种样式中被设置为全大写或小型大写时,或者“pH”在某种样式中需要大写字母,也可以通过这种方式保留小写字母:

title = "The {LaTeX} Companion",

然而,避免将整个标题放入花括号中,因为如果使用了不同的大小写格式,可能会显得不合适:

title = "{The LaTeX Companion}",

为了方便,许多人直接使用双层花括号,这在写科学文章时很有用,尤其是当不同期刊或会议使用不同的 BibTeX 样式时,它们有时会保留字母的大写形式,有时又不会:

title = {{The LaTeX Companion}},

作为替代,可以尝试其他 BibTeX 样式或修改现有样式。如果使用由出版商控制的模板(例如期刊投稿),最可行的方法是将相关文本放入花括号中。尽量避免将单个字母放入花括号中,因为这样可能会破坏字距,尤其是使用 biblatex 时[1],因此一般来说,首选是将单个词语放入花括号中。

其他一些例子

以下是一些文献条目的示例。第一个示例演示了多位作者的姓、名格式,第二个示例则演示了 incollection 条目的用法。

@article{AbedonHymanThomas2003,
  author = "Abedon, S. T. and Hyman, P. and Thomas, C.",
  year = "2003",
  title = "Experimental examination of bacteriophage latent-period evolution as a response to bacterial availability",
  journal = "Applied and Environmental Microbiology",
  volume = "69",
  pages = "7499--7506"
}
@incollection{Abedon1994,
  author = "Abedon, S. T.",
  title = "Lysis and the interaction between free phages and infected cells",
  pages = "397--405",
  booktitle = "Molecular biology of bacteriophage T4",
  editor = "Karam, Jim D. Karam and Drake, John W. and Kreuzer, Kenneth N. and Mosig, Gisela and Hall, Dwight and Eiserling, Frederick A. and Black, Lindsay W. and Kutter, Elizabeth and Carlson, Karin and Miller, Eric S. and Spicer, Eleanor",
  publisher = "ASM Press, Washington DC",
  year = "1994"
}

如果你需要引用一个网站,可以使用 @misc 类型,例如:

@misc{website:fermentas-lambda,
  author = "Fermentas Inc.",
  title = "Phage Lambda: description \& restriction map",
  month = "November",
  year = "2008",
  url = "http://www.fermentas.com/techinfo/nucleicacids/maplambda.htm"
}

如果需要添加没有结构化息的备注字段(例如说明期刊的对应期次尚未发布),可以使用 note 字段:

@article{blackholes,
  author = "Rabbert Klein",
  title = "Black Holes and Their Relation to Hiding Eggs",
  journal = "Theoretical Easter Physics",
  publisher = "Eggs Ltd.",
  year = "2010",
  note = "(to appear)"
}

在当前的 LaTeX 文档中使用 .bib 文件

在 LaTeX 文件的末尾(即内容之后,但在 \end{document} 命令之前),需要插入以下命令:

\bibliographystyle{plain}
\bibliography{sample1,sample2,...,samplen} 

请注意,在文件名和下一个 .bib 文件之间没有空格。

文献样式是由 BibTeX 识别的文件,告诉它在处理 .bib 文件时如何格式化息。上述的第一个命令声明了要使用的样式文件。在此示例中,样式文件是 plain.bst(该文件默认包含在 BibTeX 中)。使用此命令时无需添加 .bst 扩展名,系统会自动识别。尽管样式名称为 plain,但它在实际使用中仍然表现得相当不错(可以查看本教程中的输出示例)。

第二个命令实际上指定了你希望使用的 .bib 文件。这个教程中我创建的文件名为 sample1.bibsample2.bib 等,但同样,不需要包括文件扩展名。此时,.bib 文件与 LaTeX 文档在同一目录下。如果 .bib 文件存储在其他位置(如果你打算维护一个集中式的引用数据库),则需要指定文件路径,例如 \bibliography{/some/where/sample}\bibliography{../sample1}(如果 .bib 文件位于 .tex 文件的上级目录中)。

现在,LaTeX 和 BibTeX 知道在哪里查找相应的文件,实际引用文献就非常简单。使用命令 \cite{ref_key},确保 ref_key.bib 文件中的条目完全匹配。如果你希望同时引用多个文献,可以按如下方式使用:

\cite{ref_key1, ref_key2, ..., ref_keyN}

为什么 LaTeX 不会生成任何输出?

使用 BibTeX 会增加源文件处理输出时的复杂性。尽管这种复杂性对用户来说大多是隐藏的,但由于引用源文件中的文献条目与其他文件中的数据库条目之间存在复杂的关联,实际上需要进行多次运行才能完成任务。这意味着你需要多次运行 LaTeX。每次运行会执行特定的任务,直到它成功地解析所有引用的文献。以下是你需要在命令行中输入的内容:

latex latex_source_code.tex
bibtex latex_source_code.aux
latex latex_source_code.tex
latex latex_source_code.tex

(扩展名是可选的,如果你添加它们,注意 bibtex 命令会以 AUX 文件作为输入。)

在第一次运行 LaTeX 后,你将看到如下错误息:

LaTeX Warning: Citation `lamport94' on page 1 undefined on input line 21.
...
LaTeX Warning: There were undefined references.

接下来是运行 bibtex,这个命令需要在 LaTeX 源文件上执行(准确地说是在相应的 AUX 文件上,而不是 .bib 文件上),以便在文档中定义所有引用。你会看到如下输出:

This is BibTeX, Version 0.99c (Web2C 7.3.1)
The top-level auxiliary file: latex_source_code.aux
The style file: plain.bst
Database file #1: sample.bib

第三步,即第二次运行 LaTeX 时,会出现更多的警告息,比如:

LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.

不要惊慌,这是正常的,接着只需要按照提示操作,再次运行 LaTeX,文档就会如预期一样输出,没有其他问题。

如果你想要生成 PDF 输出而不是 DVI 输出,可以使用 pdflatex 替代 latex

pdflatex latex_source_code.tex
bibtex latex_source_code.aux
pdflatex latex_source_code.tex
pdflatex latex_source_code.tex

(同样,扩展名是可选的,如果你添加它们,注意 bibtex 命令会以 AUX 文件作为输入。)

如果你在使用 vim 编辑源文件,并尝试通过命令模式和当前文件快捷键(%)来处理文档,可能会遇到如下错误:

I couldn't open file name 'current_file.tex.aux'

这似乎是因为在执行当前文件命令(%)时,默认会包括文件扩展名。要从 vim 内部处理文档,你必须明确指定文件名,而不带扩展名,这样 bibtex 才能正常工作,具体操作如下:

:! pdflatex %
:! bibtex %:r  (没有文件扩展名,它会寻找 AUX 文件,如前所述)
:! pdflatex %
:! pdflatex %

如果你正在使用 Unix/Linux 或其他有 make 工具的平台,你可以创建一个 Makefile 并使用 vim 的 make 命令,或者在 shell 中使用 make。Makefile 可能如下所示:

latex_source_code.pdf: latex_source_code.tex latex_source_code.bib
	pdflatex latex_source_code.tex
	bibtex latex_source_code.aux
	pdflatex latex_source_code.tex
	pdflatex latex_source_code.tex

常见错误

  1. BibTeX 对文件名中的空格感到困扰:BibTeX 不允许文件名中包含空格,文件名中空格的存在会导致问题,解决方法是将 .bib 文件复制到没有空格的文件夹,或重命名文件夹。

  2. 空的参考书目:你是否在文档中引用了某个文献(搜索 \cite 或类似的命令)?如果没有引用,LaTeX 就不会在 PDF 中生成参考书目。解决方法:使用 \nocite{*} 列出所有条目,而不管它们是否被引用,或者仅仅引用某些文献。

  3. BibTeX 报告带有引号的条目问题,尽管语法看起来正确:可能是引号的字符类似但不同(例如," 和 '')。解决方法:尝试交换引号字符,确保它们是正确的。

在文献中包含 URL

如你所见,BibTeX 中没有字段用于 URL。一个方法是将网址放在 @mischowpublished 字段中,或者放在 @techreport, @article, @book 等的 note 字段中:

howpublished = "\url{http://www.example.com}"

请注意使用 \url 命令来确保 URL 的正确显示。

另一种方法是使用 url 字段,并使参考文献样式识别该字段:

url = "http://www.example.com"

你需要在前者使用 \usepackage{url},或者在后者使用 \usepackage{hyperref}

自定义参考文献样式

BibTeX 的主要优势之一,尤其是对那些写很多研究论文的人来说,是能够根据给定出版物的要求自定义参考文献。你会发现不同的出版物通常有自己的文献格式,作者必须遵守这些格式才能让他们的手稿发表。实际上,很多期刊和会议组织已经为 BibTeX 用户创建了自己专用的参考文献样式(.bst 文件),从而帮助作者自动完成这项繁琐的工作。

这是因为 .bib 数据库的结构化特性,所有文献息都以结构化的格式存储,而与样式无关。这是 LaTeX 中的常见主题,尽可能地将内容和展示分开。

一个文献样式文件(.bst)告诉 LaTeX 如何格式化每个属性,如何排序,如何在特定属性之间使用标点符号等。遗憾的是,手动创建这样的样式并不简单。这就是我们需要的工具——Makebst(也叫做 custom-bib)。

Makebst 可以根据你的需求自动生成一个 .bst 文件。它非常简单,实际上会问你一系列问题,了解你的偏好。完成后,它将输出适合你的样式文件。

它应该与 LaTeX 发行版一起安装(如果没有,可以下载)。启动方法也很简单。在命令行输入:

latex makebst

LaTeX 会找到相关文件,接下来是问答过程。你需要回答许多问题(虽然默认答案很合理),因此在本教程中不便逐一示例。然而,它是相当直观的。如果需要更多帮助,文档中有详细的手册。建议你试着使用它,看看在 LaTeX 文档中应用时的效果。

如果你使用的是自定义构建的 .bst 文件,确保 LaTeX 能找到它!所以,请确保它和 LaTeX 源文件位于同一目录,除非你使用的是 LaTeX 自带的标准样式文件(例如 plainplainnat,这些样式文件会自动在已安装的目录中找到)。同时,确保你在 \bibliographystyle{style} 命令中正确反映了你要使用的 .bst 文件的名称(不要包括 .bst 扩展名)。

本地化参考文献的显示

在用非英语语言写文档时,可能需要根据文档语言调整参考文献的显示方式。这涉及到诸如“编辑”、“和”等词语,以及合适的排版格式。可以使用 babelbib 包来实现这一功能。例如,要将参考文献排版为德语格式,可以在文档头部添加以下内容:

\usepackage[fixlanguage]{babelbib}
\selectbiblanguage{german}

另外,你还可以根据引用的文献语言来布局每个参考文献条目:

\usepackage{babelbib}

在 BibTeX 条目中,可以通过额外的字段指定条目的语言:

@article{mueller08,
  % ...
  language = {german}
}

为了使 babelbib 生效,必须使用其支持的参考文献样式之一——例如 babplain, babplai3, babalpha, babunsrt, bababbrv, 和 bababbr3

\bibliographystyle{babplain}
\bibliography{sample}

显示未引用的条目

通常情况下,LaTeX 只会显示使用了 \cite 命令引用的条目。如果想要显示未引用的条目,可以使用以下命令:

\nocite{Name89}  % 显示 Name89 的参考文献条目
\nocite{*}  % 显示所有的 BibTeX 条目

获取文献

许多在线数据库提供 BibTeX 格式的文献数据,使得构建自己的文献数据库变得更加容易。例如,Google 学术提供了格式化输出的选项,可以在设置页面中开启。

需要注意的是,文献数据库通常是自动处理多代结果的产物,因此生成的 BibTeX 代码可能会有一些小错误,特别是老旧条目中的错误。

有用的工具

  • Literatur-Generator

  • JabRef

  • BibDesk:Mac OS X 上的文献管理工具,提供智能文件夹等功能。

  • BibSonomy:基于 BibTeX 的免费的社会书签和出版管理系统。

  • BibTeXSearch:一个可以搜索的 BibTeX 数据库,包含数百万的学术记录。

  • Bibtex Editor:一个在线 BibTeX 条目生成器和参考文献管理系统。

  • Bibwiki:一个用于管理 BibTeX 参考文献的 MediaWiki 特殊页面。

  • cb2Bib:从电子邮件提醒、期刊网页和 PDF 文件中快速提取未格式化或不标准的文献引用工具。

  • Citavi:一个商业软件(具有大小限制的免费演示版),可以在图书馆中搜索引用并将所有知识保存在数据库中。

  • DokuWiki:DokuWiki 的一个 BibTeX 插件,允许在页面中包括 BibTeX 格式的引用,并以 APA 格式显示。

  • Ebib:一个用于 Emacs 的 BibTeX 数据库管理器。

  • KBib:另一个 BibTeX 编辑器,支持从 PDF 文件、纯文本、DOI、arXiv 和 PubMed ID 生成 BibTeX 引用。

综述

虽然熟悉 BibTeX 可能需要一些时间,但从长远来看,它是一种高效的文献管理方式。在网站上,我们经常可以找到别人编制的 .bib 文件,它们是个人出版物的列表,或是特定主题的相关文献的调查。在线的文献数据库中,许多出版物提供了 BibTeX 格式的引用,用户只需要快速复制粘贴到自己的 .bib 文件中,避免了繁琐的手动处理。

将所有文献集中在一个地方是一个巨大的优势。将它们存储在结构化的格式中,并允许定制化输出也是一个很大的优点。现有的多种免费工具可以帮助你加载 .bib 文件,便于查看、排序和检查错误。

参考文献在目录中的显示

如果你正在写一本书或报告,通常会使用以下代码插入参考文献:

\begin{thebibliography}{99}
\bibitem{bib:one_book} some information
\bibitem{bib:one_article} other information
\end{thebibliography}

或者,如果你使用 BibTeX,参考文献将保存在 .bib 文件中,你的 TeX 文档将通过以下命令引用该文献:

\bibliographystyle{plain}
\bibliography{mybibtexfile}

这两种方法都会创建类似章节(或类似节)的输出,显示所有参考文献。尽管最终生成的“参考文献”看起来像一个章节或节,但它不会像章节或节那样出现在目录中。

使用 tocbibind

将参考文献添加到目录中最方便的方式是使用专门的 tocbibind 包,该包与许多标准文档类兼容。只需在文档的前言中包含以下代码:

\usepackage[nottoc]{tocbibind}

这将把参考文献添加到目录中,且不会编号。如果你希望进行适当的编号,可以在前言中添加以下代码:

\usepackage[nottoc,numbib]{tocbibind}

tocbibind 包还可以处理将图表清单、表格清单和目录本身添加到目录中的任务。它提供了许多用于编号、文档结构等方面的选项,几乎适用于任何场景。请参阅 tocbibind 的 CTAN 页面以获取详细文档。

其他方法

作为未编号项

如果你希望参考文献出现在目录中,只需在 thebibliography 环境前添加以下两行代码:

\clearpage% 或 \cleardoublepage
\addcontentsline{toc}{chapter}{Bibliography}

(如果你正在写文章,使用 \addcontentsline{toc}{section}{Bibliography}

第一行仅结束当前段落和页面。如果你在写书,使用 \cleardoublepage 来匹配使用的样式。第二行将会在目录中添加一行(第一个选项,toc),这行会像章节那样创建(第二个选项,chapter),并且第三个参数将被打印在目录中的相应位置;这里选择了 "Bibliography",因为它是 thebibliography 环境在自动调用时会写入的相同文本,但你可以自由地写任何你想要的内容。如果你使用了一个独立的 .bib 文件,将这些行添加在 \bibliographystyle\bibliography 之间。

如果你使用了 hyperref 包,还应使用 \phantomsection 命令来启用从目录到参考文献的超链接

\clearpage% 或 \cleardoublepage
\phantomsection
\addcontentsline{toc}{chapter}{Bibliography}

这种技巧特别有用,当你需要将参考文献插入到目录中时,但它也适用于其他情况。当 LaTeX 发现上述代码时,它会记录相关息以及当前的页面编号,并在目录页插入一行。

作为编号项

如果你希望参考文献作为编号章节或节出现,你可以使用以下方法:

\cleardoublepage % 如果使用书籍类,这是必要的,用来将锚点放在正确的页面,
                 % 因为参考文献会开始于自己的页面。
                 % 如果文档类使用了 "oneside" 参数,则使用 \clearpage
\renewcommand*{\refname}{} % 这将把参考文献的标题定义为空,因此你可以...
\section{Bibliography}     % ...在参考文献条目之前放置一个普通的节标题。

\begin{thebibliography}{99}
...
\end{thebibliography}

Another even easier solution is to use \section inside of the \renewcommand block:

\renewcommand{\refname}{\section{Sources}} % Using "Sources" as the title of the section
\begin{thebibliography}{99}
...
\end{thebibliography}

You may wish to use \renewcommand*{\refname}{\vspace*{-1em}} followed by \vspace*{-1em} to counteract the extra space the blank \refname inserts.

If you are using BibTeX, the \bibliography command, and the book or report class, you will need to redefine \bibname instead of \refname like so.

\renewcommand{\bibname}{\section{Sources}} % Redefine bibname
\bibliographystyle{IEEEtran}               % Set any options you want
\bibliography{your_bib_file_names}         % Build the bibliography

biblatex

[edit | edit source]

As we said before, biblatex is widely considered the successor of BibTeX. Intended as a full replacement for BibTeX, it is more configurable in its output and provides a multitude of new styles (for output) and fields (for the database) that can be used in a document. For now, refer to its comprehensive documentation on CTAN.

Entry and field types in .bib files

[edit | edit source]

The following table shows most field types. Some field types are lists, either lists of person names, others are literal lists. A date can either be given in parts or full, some keys are necessary, page references are provided as ranges and certain special fields contain verbatim code. There are many kinds of titles.

Hierarchic entry types
Base type Multi-volume Standalone part thereof Supplemental material therein
@book @mvbook @inbook@bookinbook @suppbook
@periodical @article @suppperiodical
@collection @mvcollection @incollection @suppcollection
@reference @mvreference @inreference
@proceedings @mvproceedings @inproceedings@conference
Entry types in .bib files known by biblatex and field types supported,
either required +, alternatively required ±, optional ^, not supported (empty) or forbidden ;
some types have been shortened: dot ‘.’ truncates entry and tilde ‘~’ repeats last full entry
article
book
mv~
in~
~let
collect.
mv~
in~
manual
misc
online
patent
period.
proceed.
mv~
in~
report
thesis
unpub.
authorauthortype + + + + ± + ± ± ± + + + + +
editoreditortype ^ ^ ^ ^ ± + + + ± ± ± + + + +
editorXeditorXtype ^ ^ ^ ^ ^ ^ ^ ^
holder ^
bookauthor ^
annotatorcommentator ^ ^ ^ ^ ^ ^ ^
translatororiglanguage ^ ^ ^ ^ ^ ^ ^
afterwordforewordintroduction ^ ^ ^ ^ ^ ^
title + + + + + + + + + + + + + + + + + + +
titleaddonsubtitle ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ˇ ^ ^ ^ ^ ^ ^
maintitlemainsubtitlemaintitleaddon ^ ^ ^ ^ ^ ^
booktitle + + +
booksubtitlebooktitleaddon ^ ^ ^
journalsubtitle ^
journaltitle +
eventdateeventtitleeventtitleaddonvenue ^ ^ ^
dateyear ± ± ± ± ± ± ± ± ± ± ± ± ± ± ± ± ± ± ±
month ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
edition ^ ^ ^ ^ ^ ^
issueissuetitleissuesubtitle ^ ^
number ^ ^ ^ ^ ^ ^ ^ + ^ ^ ^ ^ ^
series ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
chapter ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
part ^ ^ ^ ^ ^ ^
volume ^ ^ ^ ^ ^ ^ ^ ^
volumes ^ ^ ^ ^ ^ ^ ^ ^ ^
version ^ ^ ^ ^ ^ ^
doieprinteprintclasseprinttype ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
eid ^
isbn ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
isrn ^
issn ^ ^
isanismniswc
url ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ + ^ ^ ^ ^ ^ ^ ^ ^
urldate ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
location ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
publisher ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
organization ^ ^ ^ ^ ^ ^
institution + +
type ^ ^ ^ ^ + +
howpublished ^ ^ ^
pages ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
pagetotal ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

条目类型和标准样式

有些条目类型很难区分,并且在标准样式中会被视为相同处理:

  • @article 等同于假设的 @inperiodical,因此包含现有的 @suppperiodical

  • @inbook = @bookinbook = @suppbook

  • @collection = @reference

  • @mvcollection = @mvreference

  • @incollection = @suppcollection = @inreference

  • @online = @electronic = @www

  • @report = @techreport

  • @thesis = @mastersthesis = @phdthesis

有些字段类型已经定义,但文档中未说明它们可以与哪些条目类型一起使用。原因可能是它们依赖于其他字段才能有效,或者它们总是可以以用户自定义的方式使用,但在标准样式中永远不会使用:

  • abstract, annotation

  • entrysubtype

  • file

  • label

  • library

  • nameaddon

  • origdate, origlocation, origpublisher

  • origtitle, reprinttitle, indextitle

  • pagination, bookpagination

  • shortauthor, shorteditor, shorthand, shorthandintro, shortjournal, shortseries, shorttitle

必须字段

唯一始终必须的字段是 title。所有条目类型还需要 dateyear,并且它们指定期望使用 authoreditor,或者是否可以同时使用这两者。

可选字段

一些字段类型可以与任何条目类型一起使用:

  • addendum, note

  • language

  • pubstate

  • urldate

物理(印刷)条目类型的其他可选字段:

  • url, doi

  • eprint, eprintclass, eprinttype

多媒体条目类型

  • @artwork

  • @audio

  • @image

  • @movie

  • @music

  • @performance

  • @video

  • @software

法律条目类型

  • @commentary

  • @jurisdiction

  • @legislation

  • @legal

  • @letter

  • @review

  • @standard

这些类型已定义,但目前支持不完善。

打印参考文献

假设我们已经在一个名为 references.bib 的文件中定义了我们的参考文献,可以通过以下命令在 biblatex 中使用它:

\addbibresource{references.bib}

要打印参考文献,可以使用以下宏(通常放在文档的末尾):

\printbibliography

打印单独的参考文献

如果你想将参考文献分成书籍、文章和其他类型,可以使用如下命令:

\printbibliography[title={Book references},type=book]
\printbibliography[title={Article references},type=article]
\printbibliography[title={Other references}, nottype=article, nottype=book]

如果参考文献位于多个文件中,可以像这样添加:

\addbibresource{references.bib}
\addbibresource{other.bib}

我们还可以根据其他字段进行过滤,例如 entrysubtype。例如,定义我们的在线资源如下:

@misc{some-resource,
   ...
   entrysubtype = {inet},
}

然后使用以下命令过滤:

\printbibliography[title={Online resources}, subtype=inet]

带有前缀键、子标题和目录的示例

由于参考文献的编号是独立的,因此将参考文献分隔开,并使用如 a、b 和 c 等前缀数字也很有用。此外,我们还可以为参考文献添加主标题并将其添加到目录中。

为了让超链接指向正确的参考文献部分,我们还在打印每个参考文献之前加入 \phantomsection

\printbibheading[
heading=bibintoc, % bibintoc将参考文献添加到目录
title={Resources} % 如果我们想覆盖默认的 "Bibliography" 标题
]
\phantomsection % 需要hyperref包
\printbibliography[title={Printed sources}, heading=subbibliography, prefixnumbers={a}, type=book, type=article]
\phantomsection
\printbibliography[title={Online resources}, heading=subbibliography, prefixnumbers={c}, subtype=inet]
\phantomsection
\printbibliography[title={Other}, heading=subbibliography, prefixnumbers={c}, nottype=article, nottype=book, notsubtype=inet]

要将每个参考文献添加到目录中作为主参考文献的子部分,请将 heading=subbibliography 替换为 heading=subbibintoc

多个参考文献

使用 multibib 包 该包适用于为工作中的不同部分生成多个参考文献。例如,你可以为每个章节生成一个参考文献。有关该包的更多息,请参见 CTAN[2]。

使用 bibtopicbibtopic 包[3] 用于将引用分配到多个文件中,这样你可以将参考文献分成更多部分。它为每个参考文献部分生成一个单独的 AUX 文件,因此你需要对每个文件运行 BibTeX(请参阅包的文档以了解更多详细息)。

\documentclass[11pt]{article}
\usepackage{bibtopic}
\begin{document}

\bibliographystyle{alpha}
\section{Testing}
Let’s cite all the books: \cite{ColBenh:93} and
\cite{Munt:93}; and an article: \cite{RouxSmart:95}.

File books.bib is used for this listing:
\begin{btSect}{books}
 \section{References from books}
 \btPrintCited
\end{btSect}
Here, the articles.bib is used, and the listing is in plain-format instead of the standard alpha.
\begin{btSect}[plain]{articles}
 \section{References from articles}
 \btPrintCited
 \section{Articles not cited}
 \btPrintNotCited
\end{btSect}
Just print all entries here with \btPrintAll
\begin{btSect}[plain]{internet}
 \section{References from the internet}
 \btPrintAll
\end{btSect}
\end{document}

注释和参考

这篇文章使用了 Andy Roberts 的《Getting to grips with LaTeX》中的一些内容,已获得作者许可。


Last modified: Tuesday, 22 April 2025, 11:52 AM