这一篇打算介绍一下BibTeX结合LaTeX的使用。选择这个话题是因为恰逢数模美赛期间使用到了这么一个东西,然后在网上找教程的时候,发现大多数教程都一样:存在同一个错误。所以还是觉得有必要说一下的。

什么是BibTeX

BibTex 是一个用于描述和执行引用列表的工具和文件标准。多数情况下与LaTeX文档共同使用。

在美赛期间,因为我们三个对于怎么使用论文引用方面不很明确,最终决定使用BibTeX做引用的管理。BibTeX是使用一个bib文件作为存放参考文献数据的数据库。然后论文中引用内容时,将从这个文件中查找得到相应的文献信息,然后自动进行排版。

在Windows上面进行Latex的排版的话,在CTeX套装和TeXLive中都是存在BibTeX工具的,所以直接可以使用。

BibTeX 将大部分涉及管理参考文献的工作自动化。只需按格式输入一次参考文献,它就可以通过输入它的标签被在你写的任何文件中引用。而且它能确保你所引用的每个项目都会出现在文档的参考文献列表中、列表中的每个项目都将是你引用的项目,而无需进行任何手动检查。

BibTeX数据库文件格式

BibTeX数据库是一个扩展名为bib的纯文本文件。有下面几种方法可以创建一个bib文件:

  1. 使用text2bib将文本格式的引用转换。
  2. 使用网上提供的工具转换其他格式的参考文献。
  3. 直接以纯文本文件的形式创建。
  4. 使用BibTeX管理程序(如JabRef)。

如果你需要以纯文本方式创建bib文件的话, bib文件的格式如下:

1
2
3
4
@misc{ Nobody06,
author = "Nobody Jr",
title = "My Article",
year = "2006" }

这就是一个misc类型的文献,然后这个文献的标识名为Nobody06 ,然后列出作者、标题等信息。

misc表示的是其他类型的文献。详细的各种文献类型和域的说明参见维基百科 。以及怎么在里面添加一些LaTeX的排版需求,可以参见这里

你可以将这个文件保存为mybib.bib

使用BibTeX数据库文件

然后在同一个文件夹下创建一个相应的LaTeX文件(比如说叫myarticle):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
\documentclass[11pt]{article}
\usepackage{cite}

\begin{document}

\title{My Article}
\author{Nobody Jr.}
\date{Today}
\maketitle

Blablabla said Nobody ~\cite{Nobody06}.

\bibliography{mybib}{}
\bibliographystyle{plain}
\end{document}

这段LaTeX中创建了一个标题,然后在一句话使用了一个\cite框出了所使用的引用的标识名,这将会创建一个引用。对于cite的不同格式的效果,参见这里

之后在文档中使用biliographybibliographystyle指定数据库文件为当前目录下的mybib.bib文件,指定引用的格式为plain格式。这样的指定可以在文档的任何一个位置进行。

其中plain是一个BibTeX参考文献格式,可以在这里找到更多支持的格式,并且如果还是对这些格式不满意的话,可以自己创建一个bst的格式控制文件。

你可以使用latex makebst来创建一个bst 文件。或者使用custom-bib 工具。

编译BibTeX文档

这个部分其实是比较简单的,网络的教程往往一笔带过。但是网络上的教程就有在此处出错的(应该是某一篇教程打错,然后被各种复制粘贴)。总的编译过程就是用Latex和BibTeX分别编译四次。

首先使用Latex编译我们的tex文件。

1
latex myarticle.tex

这个过程会产生一个pdf,但是其中关于引用的部分都是没有显示出来的。但是我们接下来这一步需要的并不是产生的pdf文件,而是生成的aux文件。这个文件是LaTeX 生成的主辅助文件,会记录交叉引用、目录、参考文献的引用等。

bibtex所需要的信息就是文件中所使用的文献和位置。所以接下来再使用bibtex编译的时候,应该指定的是这个aux文件

1
bibtex myarticle.aux

这个过程bibtex会从指定的数据库文件中读取相应的引用信息,并且给出一个myarticle.bbl文件作为输出的结果。(可以打开发现其中内容就是一个引用标签)。

之后再执行一次latex命令,读入文献信息,并在相应位置输出参考文献列表。

1
latex myarticle.tex

这一次latex会在最后加上新生成的参考文献列表。但是在新生成的pdf文件中,会发现引用的地方仍然显示的是一个问号。这是因为参考文献与引用相关的信息是在编译完成时候才写入aux文件的,因而这次编译依然没法填入正确的编号。

最后一次编译,继续使用同样的命令:

1
latex myarticle.tex

这一次在aux文件中已经有了需要信息,所以现在应该一切正常了。

输出到另一个文件夹

我们在美赛的时候,为了将编程的工作和论文的工作分开,选择将输出的内容放到另一叫output的文件夹中。所需要的命令如下:

1
2
3
4
pdflatex -output-directory=output myarticle.tex
bibtex output/myarticle.aux
pdflatex -output-directory=output myarticle.tex
pdflatex -output-directory=output myarticle.tex

为了避免麻烦,我们选择把这样的命令写到了一个Makefile中,用make来管理整个命令流。

结束语

这个博客写完的时候,已经是九点半了。今天是鸡年最后一天,祝各位狗年大吉,心想事成万事如意。