6. 特色工具和功能

第六章 特色工具和功能

本章介绍一些特色的 LaTeX 辅助功能。前两个功能 BIBTEX 和 makeindex 依靠一些辅助程序自动生成参考文献、索引等;之后的使用颜色、超链接等则令我们生成美观易用的电子文档

6.1 参考文献和 BIBTEX 工具

6.1.1 基本的参考文献和引用

LaTeX 提供的参考文献和引用方式比较原始,需要用户自行书写参考文献列表(包括格式),因此较难直接使用。相关的命令我们只作最简单的介绍。

LaTeX 提供了最基本的 \cite 命令用于在正文中引用参考文献:

\cite{<citation>}

< citation > 为引用的参考文献的标签,类似 \ref 里的参数;\cite 带一个可选参数,为引用的编号后加上额外的内容,如 \cite [page 22] {Paper2013} 可能得到形如 [13,page 22] 这样的引用。

参考文献由 thebibliography 环境包裹。每条参考文献由 \bibitem 开头,其后是参考文献本身的内容:

\begin{thebibligraphy}{<widest label>}
    \bibitem[<item number>]{<citation>}\end{thebibliography}

其中 < citation > 是 \cite 使用的文献标签,< item number > 自定义参考文献的序号,如果省略,则按自然排序给定序号。< widest lable > 用以限制参考文献序号的宽度,如 99 意味着不超过两位数字。通常设定为与参考文献的数目一致。

thebibliography 环境自动生成不带编号的一节(article文档类)或一章(report / book 文档类)。在 article 文档类的节标题默认为“Reference”,而在 report / book 文档类的章标题默认为 “Bibliography”。用户可通过 8.4 节给出的方法定制参考文献的标题。

以下为一个使用 thebibliography 排版参考文献的例子:

\documentclass{article}
\begin{document}
\section{Introduction}
Part1~\cite{germenTeX} has proposed that \1dots

\begin{thebibliography}{99}

\bibitem{germenTeX} H.~Part1:\emph{German \TeX},
    TUGboat Volume~9,Issue~1(1988)
\end{thebibliography}
\end{document}

6.1.2 BIBTEX 数据库

BIBTEX 是最为流行的参考文献数据组织格式之一。它的出现让我们摆脱手写参考文献条目的麻烦。我们还可以通过参考文献样式的支持,让同一份 BIBTEX 数据库生成不同样式的参考文献列表。

BIBTEX 数据库以 .bib 作为扩展名,其内容是若干个文献条目,每个条目的格式为:

@<type>{<citation>},
    <key1>={<value1>},
    <key2>={<value2>},
    …
}

其中 为文献的类别,如 article 为学术论文,book 为书籍,incollection 为论文集中的某一篇,等等。 为 \cite 命令使用的文献标签。在 之后为条目里的各个字段,以 = {} 的形式组织。

我们在此简单列举学术论文里使用较多的 BIBTEX 文献条目类别:

article 学术论文,必需字段有 author,title,journal,year;可选字段包括 volume,number,pages,doi 等;

book 书籍,必需字段有 author/editor,title,publisher,year;可选字段包括 volume/number,series,address 等;

incollection 论文集中的一篇,必需字段有 author,title,booktitle,publisher,year;可选字段包括 editor,volume/number,chapter,pages,address等;

inbook 书中的一章,必需字段有 author/editor,title,chapter/pages,publisher,year;可选字段包括 volume/number,series,address 等。

例如 article 类别的参考文献数据条目写法如下:

@article{Alice13,
    title = {Demostration of bibliography items},
    author = {Alice Axford and Bob Birkin and Charlie Copper and Danny Dannford},
    year = {2013},
    month = {Mar},
    journal = {Journal of \TeX perts},
    volume = {36},
    number = {7},
    pages = {114-120}}

所有类别的文献条目格式请参考 CTAN://biblio/bibtex/base/btxdoc.pdf

多数时候,我们无需自己手写 BIBTEX 文献条目。从 Google Scholar 或者期刊/数据库的网站上都能够导出 BIBTEX 文献条目,老牌的文献管理软件 EndNote 也支持生成 BIBTeX 格式的数据库。来源软件 JabRef 甚至支持 BiBTEX 文献条目的导入、导出和管理。

6.1.3 BIBTEX 样式

参考文献的写法在不同文献里千差万别,包括作者、标题、年份等各项的顺序和字体样式、文献在列表中的排序规则等。BIBTEX 用样式(style)来管理参考文献的写法。BIBTEX 提供了几个预定义的样式,如 plain,unsrt,alpha 等。如果使用期刊模版的话,可能会提供自用的样式。样式文件以 .bst 为扩展名。

使用样式文件的方法是在源代码内(一般在导言区)使用 \bibliographystyle 命令:

\bibliographytyle{<bst-name>}

这里 为 .bst 样式文件的名称,不要带 .bst 扩展名

我们以 6.1.2 小节给出的数据条目为例,使用 \bibliographystyle 命令选择不同的参考文献样式,效果大致如表 6.1 所示。

6.1.4 使用 BIBTEX 排版参考文献

现在我们来看如何利用 BIBTEX 数据库生成参考文献和引用。

第一步:准备一份 BIBTEX 数据库,假设数据库文件名为 books.bib,和 LaTeX 源代码一般位于同一个目录下

第二步:在源代码中添加必要的命令。假设源代码名为 dem.tex (见源代码 6.1)。

  1. 首先需要使用命令 \bibliographystyle 设定参考文献的格式。

  2. 其次,在正文中引用参考文献。BIBTEX 程序在生成参考文献列表的时候,通常只列出用了 \cite 命令引用的那些。如果需要列出未被引用的文献,则需要 \notice{} 命令;而 \nocite{*} 则让所有未被引用的文献都列出。

  3. 再次,在需要列出参考文献的位置,使用 \bibliography 命令代替 thebibliography 环境:

\bibliography{<bib-name>}

其中 是 BIBTEX 数据库的文件名,不要带 .bib 扩展名

注意:\bibliographystyle 和 \bibliography 命令缺一不可,没有这两个命令,使用 BIBTEX 生成参考文献列表的时候会报错。

第三步:写好以上两个文件之后,我们就可以开始编译了。

  1. 首先使用 pdflatex 或 xelatex 等命令编译 LaTeX 源代码 demo.tex;

  2. 接下来用 bibtex 命令处理 demo.aux 辅助文件记录的参考文献格式、引用条目等信息。bibtex 命令处理完毕后会生成 demo.bbl 文件,内容就是一个 thebibliography 环境;

  3. 再使用 pdflatex 或 xelatex 等命令把源代码 demo.tex 编译两遍,读入参考文献并正确生成引用。

整个过程使用的命令如下(可以略去扩展名):

xelatex demo bibtex demo xelatex demo xelatex demo

使用 latex + dvipdfmx 命令编译时,则 dvipdfmx 命令放在最后,相当于先后使用 bibtex,latex,latex,dvipdfmx。

时下许多学术期刊比较喜欢使用人名——年份的引用方式,形如(Axford et al.,2013)。natbib 宏包提供了对这种“自然”引用方式的处理。

除了 \cite 之外,natbib 宏包在正文中支持两种引用方式:

\citep{<citation>} \citet{<citation>}

它们分别生成形如(Axford et al., 2013)和 Axford et al.(2013)的人名——年份引用。正确排版人名——年份引用还依赖于特定的 BIBTEX 样式。natbib 提供了与 LaTeX 预定义样式相对应的几个样式,包括 plainnat、abbrvnat 和 unsrtnat。学术论文模版是否支持 natbib,需要参考其帮助文档。

natbib 宏包同样也支持数字引用,并且支持将引用的序号压缩,例如:

\usepackag[numbers,sort&compress]{natbib}

调用 natbib 宏包时指定以上选项后,连续引用多篇文献时,会生成形如(3-7)的引用而不是(3,4,5,6,7)。

natbib 宏包还有更多选项和用法,比如默认的引用时用小括号包裹的,可指定 square 选项改为中括号;再比如 \citep 命令也支持可选参数,为引用前后都添加额外内容。这里不再赘述,请参考 natbib 宏包的帮助文档。

6.1.6 biblatex 宏包

本节的末尾简单介绍一下基于 biblatex 宏包排版参考文献的方式。biblatex 宏包是一套基于 LaTeX 宏命令的参考文献解决方案,提供了便捷的格式控制和强大的排序、分类、筛选、多文献表等功能。biblatex 宏包也因其对 UTF-8 和中文参考文献的良好支持,被国内较多 LaTeX 模版采用。

基于 biblatex 宏包的方式与基于 BIBTEX 的传统方式有一定区别,下面从文档结构和命令、编译方式、样式选择等方面逐一介绍:

文档结构和 biblatex 相关命令

  1. 首先是在导言区调用 biblatex 宏包。宏包支持以 = 形式指定选项,包括参考文献样式 style、参考文献著录排序的规则 sorting 等。
  2. 接着在导言区使用 \addbibresource 命令为 biblatex 引入参考文献数据库。与基于 BIBTEX 的传统方式不同的是,这里需要写完整的文件名。
  3. 在正文中使用 \cite 命令引用参考文献。除此之外还可以使用丰富的命令达到不同的引用效果,如 \citeauthor 和 \citeyear 分别单独引用作者和年份,\textcite 和 \parencite 分别类似 natbib 宏包提供的 \citet 和 \citep 命令,以及脚注式引用 \footcite 等。
  4. 最后在需要排版参考文献的位置使用命令 \printbibliography。

编译方式

与基于 BIBTEX 的传统方式不同的是,biblatex 宏包使用 biber 程序处理参考文献。因此上述文档的编译步骤为:

xelatex demo biber demo xelatex demo xelatex demo

biblatex 样式和其他选项

biblatex 使用的参考文献样式分为著录样式(bibligraphy style)和引用样式(citation style),分别以 .bbx 和 .cbx 为扩展名。参考文献的样式在调用宏包时使用 style 选项指定,或者使用 bibstyle 或 citestyle 分别指定:

% 同时调用 gb7714-2015.bbx 和 gb7714-2015.cbx

\usepackage[style=gb7714-2015]{biblatex}

% 著录样式调用 gb7714-2015.bbx,引用样式调用 biblatex 宏包自带的 authoryear

\usepackage[bibstyle=gb7714-2015,citestyle=authoryear]{biblatex}

以下总结一些常用的参考文献样式,除 biblatex 宏包自带的样式外,许多样式以单独的宏包在发行版内发布。

authoryear biblatex 自带样式,类似 natbib 默认的引用样式效果。

authortitle biblatex 自带样式,采用作者-题名(shorttile 字段)的引用样式。

verbose biblatex 自带样式,引用样式中包含作者、题名、书名、页码等字段的信息。

alphabetic biblatex 自带样式,著录样式与 BIBTEX 的 alpha 样式类似。

trad-alpha biblatex-trad 样式包,移植自 BIBTEX 默认的 alpha 样式。另外还包括 trad-abbrv、trad-plain 和 trad-unsrt。

gb7714-2015 符合中文文献著录标准 GB/T 7714-2015 的样式,著录按顺序编码排版。另外还包括按作者-年份顺序排版著录的样式 gb7714-2015ay。

caspervector 以中文文献著录标准 GB/T 7714-2015 为基础的一个样式。

ieee 兼容 IEEEtean 风格的样式,著录按顺序编码排版。另外还包括按作者-年份顺序排版著录的样式 ieee-alphabetic。

6.2 索引和 makeindex 工具

书籍和大文档通常索引来归纳关键词,方便用户查阅。 LaTeX 借助配套的 makeindex 程序完成对索引的排版。

6.2.1 使用 makeindex 工具的方法

要使用索引,须经过这么几个步骤(仍设源代码为 demo.tex);

第一步,在 LaTeX 源代码的导言区调用 makeidx 宏包,并使用 \makeindex 命令开启索引的搜集:

\usepackage{makeidex} \makeindex

第二步,在正文中需要索引的地方使用 \index 命令。\index 命令的参数写法详见下一节;并在需要输出索引的地方(如所有章节之后)使用 \printindex 命令。

第三步,编译过程。

  1. 首先用 xelatex 等命令编译源代码 demo.tex。编译过程中产生索引记录文件 demo.idx;
  2. 用 makeindex 程序处理 demo.idx,生成用于排版的索引列表文件 demo.ind;
  3. 再次编译源代码 demo.tex,正确生成索引列表。

6.2.2 索引项的写法

添加索引项等命令为:

\index{<index entry>}

其中 为索引项,写法由表 6.2 汇总。其中 !、@ 和 |为特殊符号,如果需要索引项直接输入这些符号,需要加前缀 “;而 " 需要输入两个引号 " " 才能输出到索引项。

读者可以钻研一下以下给出的一个较为复杂的,结合多级索引、索引格式、页码格式等的用法示例。但在自己使用时,最好还是遵循“简单的就是最好的”原则,尽量使用表 6.2 中的写法。

Test index. \index{Test@\textsf{” “Test} | {textbf} \index{Test@\textsf{” “Test} ! sub@” | sub" | | see{Test}} \newpage Test index. \index{Test@\textsf{" “Test} | ) textbf}

6.3 使用颜色

原始的 LaTeX 不支持使用各种颜色。 color 宏包或者 xcolor 宏包提供了对颜色的支持,给 PDF 输出生成颜色的特殊指令。

6.3.1 颜色的表达方式

调用 color 或 xcolor 宏包后,我们就可以用如下命令切换颜色:

\color[<color-mode>]{<code>} \color{<color-name>}

颜色的表达方式有两种,其一是使用色彩模型和色彩代码,代码用 0~1 的数字代表成分的比例。color 宏包支持 rgb、cmyk 和 gray 模型,xcolor 支持更多的模型如 hsb 等。

\large\sffamily
{\color[gray]{0.6}
    60% 灰色 } \\
{\color[rag]{0,1,1}
    青色}

其二是直接使用名称代表颜色,前提是已经定义了颜色名称(没定义的话会报错):

\large\sffamily
{\color{red} 红色}\\
{\color{blue} 蓝色}

color 宏包仅定义了 8 种颜色名称,xcolor 补充了一些,总共有 19 种,见表 6.3

xcolor 还支持将颜色通过表达式混合或互补:

\large\sffamily
{\color{red!40} 40% 红色}\\
{\color{bule}蓝色
\color{bule!50!black}蓝黑
\color{black}黑色}\\
{\color{-red}红色的互补色}

我们还可以通过命令自定义颜色名称,注意这里的 是必选参数:

\definecolor{<color-name>}{<color-mode>}{<code>}

如果调用 color 或 xcolor 宏包时指定 dvipsnames 选项,就有额外的 68 种颜色名称可用。xcolor 宏包还支持通过指定其他选项载入更多颜色名称。限于篇幅不展开介绍,详情请参考 xcolor 宏包的手册。

6.3.2 带颜色的文本和盒子

原始的 \color 命令类似于字体命令 \bfseries,它使之后排版的内容全部变成指定的颜色,所以直接使用时通常要加花括号分组。color / xcolor 宏包都定义了一些方便用户使用的带颜色元素。

输入带颜色的文本可以用类似 \textbf 的命令:

\textcolor[<color-mode>]{<code>}{<text>} \textcolor{<color-name>}{<text>}

以下命令构造一个带背景色的盒子,< material > 为盒子中的内容:

\colorbox[<color-mode>]{<code>}{<material>} \colorbox{<color-name>}{<material>}

以下命令构造一个带背景色和有色边框的盒子,< fcode > 或 < fcolor-name > 用于设置边框颜色:

\fcolorbox[<color-mode>]{<code>}{<material>} \fcolorbox{<fcolor-name>}{<color-name>}{<material>}

\sffamily
文字用 \textcolor{red}{红色}强调\\
\colorbox[gray]{0.95}{浅灰色背景}\\
\fcolorbox{bule}{yellow}{%
    \textcolor{bule}{蓝色边框+文字,%
        黄色背景}
}

\fcolorbox 也可以像 3.8.2 小节里的 \fbox 那样调节 \fboxrule 和 \fboxsep;对于 \colorbox,调整 \fboxsep 是有效的。这里不再给出具体的示例。

6.4 使用超链接

PDF 文档格式是现今最流行的电子文档格式,而电子文档最实用的需求之一就是超链接功能。LaTeX 中实现这一功能的是 hyperref 宏包。

6.4.1 hyperref 宏包

hyperref 宏包涉及到的链接遍布 LaTeX 的每个角落——目录、引用、脚注、索引、参考文献等等都被封装成超链接。但这也使得它与其他宏包发生冲突的可能性大大增加,虽然宏包已经尽力解决各方面的兼容性,但仍不能面面俱到。为减少可能的冲突,习惯上将 hyperref 宏包 放在其他宏包之后调用

与 graphicx 宏包类似,latex + dvipdfmx 命令下调用 hyperref 宏包时,需要指定选项 dvipdfmx;而 pdflatex 或 xelatex 命令下不需要。

hyperref 宏包提供了命令 \hypersetup 配置各种参数。参数也可以作为宏包选项,在调用宏包时指定:

\hypersetup{<optional>,<option2>=<value,…> \usepackage[<optional>,<option2>={value},…]{hyperref}

6.4.2 超链接

hyperref 宏包提供了直接书写超链接的命令,用于在 PDF 中生成 URL:

\url{<url>} \nolinkurl{<url>}

\url 和 \nolinkurl 都生成可以点击的 URL,区别是前者有色彩,后者没有。在 \url 命令中作为参数的 URL 里,可直接输入如 %、& 这样的特殊符号

我们也可以像 HTML 中的超链接一样,把一段文字作为超链接:

\href{<url>}{<text>}

\url{http://wikipedia.org}\\
\nolinkurl{http://wikipedia.org}\\
\href{http://wikipedia.org}{Wiki}

使用 hyperref 宏包后,文档中所有的引用、参考文献、索引等等都转换为超链接。用户也可对某个 \label 命令定义的标签 < label > 作超链接(注意这里的 < label > 虽然是可选参数的形式,但通常是必填的

\hyperref[<label>]{<text>}

默认的超链接在文字外边加上一个带颜色的边框(在打印 PDF 时边框不会打印),可指定 colorlinks 参数修改为将文字本身加上颜色,或修改 pdfborder 参数调整边框宽度以“去掉”边框:hidelinks 参数则令超链接既不变色也不加边框。

\hypersetup{hidelinks}
% or:
\hypersetup{pdfborder=0 0 0}}

6.4.3 PDF 书签

hyperref 宏包另一个强大的功能是为 PDF 生成书签。对于章节命令 \chapter、\section等,默认情况下会为 PDF 自动生成书签。和交叉引用、索引等类似,生成书签也需要多次编译源代码,第一次编译将书签记录写入 .out 文件,第二次编译才正确生成书签。

书签的一些属性见表 6.4。在 latex+dvipdfmx 或 pdflatex 命令下使用 ctex 宏包或 CJK 宏包时,为了正确生成中文书签而不出现乱码,需要额外的设置,甚至繁琐的工序(这也是我们推荐使用 xelatex 命令处理中文的原因)。

hyperref 还提供了手动生成书签的命令:

\pdfbookmark[<level>]{<bookmark>}{<anchor>}

< bookmark > 为书签名称,< anchor > 为书签项使用的锚点(类似交叉引用的标签)。可选参数 < level > 为书签的层级,默认为 0。

章节命令里往往有 Latex 命令甚至数学公式,而 PDF 书签是纯文本,对命令和公式的处理很困难,有出错的风险。hyperref 宏包已经为我们处理了许多常见命令,如 \LaTeX 和字体命令 \textbf 等,对于未被处理的命令或数学公式,就要在章节标题中使用如下命令,分别提供 LaTeX 代码和 PDF 书签可用的纯文本:

\texorpdfstring{<LaTeX code>}{<PDF bookmark text>}

比如在章节名称里使用公式 E=mc2,而书签使用字符 E=mc^2:

\section{质能公式 \textorpdfstring{$E=mc^2$}{E=mc\textasciicircum 2}}

6.4.4 PDF 文档属性

hyperref 宏包还提供了一些参数用于改变 PDF 文档的属性,部分见表 6.4