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
)。
-
首先需要使用命令 \bibliographystyle 设定参考文献的格式。
-
其次,在正文中引用参考文献。BIBTEX 程序在生成参考文献列表的时候,通常只列出用了 \cite 命令引用的那些。如果需要列出未被引用的文献,则需要 \notice{} 命令;而 \nocite{*} 则让所有未被引用的文献都列出。
-
再次,在需要列出参考文献的位置,使用 \bibliography 命令代替 thebibliography 环境:
\bibliography{<bib-name>}
其中 是 BIBTEX 数据库的文件名,不要带 .bib 扩展名。
注意:\bibliographystyle 和 \bibliography 命令缺一不可,没有这两个命令,使用 BIBTEX 生成参考文献列表的时候会报错。
第三步:写好以上两个文件之后,我们就可以开始编译了。
-
首先使用 pdflatex 或 xelatex 等命令编译 LaTeX 源代码 demo.tex;
-
接下来用 bibtex 命令处理 demo.aux 辅助文件记录的参考文献格式、引用条目等信息。bibtex 命令处理完毕后会生成 demo.bbl 文件,内容就是一个 thebibliography 环境;
-
再使用 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 相关命令
- 首先是在导言区调用 biblatex 宏包。宏包支持以 = 形式指定选项,包括参考文献样式 style、参考文献著录排序的规则 sorting 等。
- 接着在导言区使用 \addbibresource 命令为 biblatex 引入参考文献数据库。与基于 BIBTEX 的传统方式不同的是,这里需要写完整的文件名。
- 在正文中使用 \cite 命令引用参考文献。除此之外还可以使用丰富的命令达到不同的引用效果,如 \citeauthor 和 \citeyear 分别单独引用作者和年份,\textcite 和 \parencite 分别类似 natbib 宏包提供的 \citet 和 \citep 命令,以及脚注式引用 \footcite 等。
- 最后在需要排版参考文献的位置使用命令 \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 命令。
第三步,编译过程。
- 首先用 xelatex 等命令编译源代码 demo.tex。编译过程中产生索引记录文件 demo.idx;
- 用 makeindex 程序处理 demo.idx,生成用于排版的索引列表文件 demo.ind;
- 再次编译源代码 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
。