\chapter{特色工具和功能}\label{chap:spec}
\addtocontents{los}{\protect\addvspace{10pt}}

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

\section{参考文献和 \hologo{BibTeX} 工具}\label{sec:bib}

\subsection{基本的参考文献和引用}\label{subsec:bib-basics}

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

\cmdindex{cite}
\LaTeX{} 提供了最基本的 \cmd{cite} 命令用于在正文中引用参考文献：
\begin{command}
\cmd{cite}\marg{citation}
\end{command}

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

\envindex{thebibliography}
\cmdindex{bibitem}
参考文献由 \env{thebibliography} 环境包裹。每条参考文献由 \cmd{bibitem} 开头，其后是参考文献本身的内容：
\begin{command}
\cmd{begin}\marg*{thebibliography}\marg{widest label} \\
\quad \cmd{bibitem}\oarg{item number}\marg{citation} ...\\
\cmd{end}\marg*{thebibliography}
\end{command}
其中 \Arg{citation} 是 \cmd{cite} 使用的文献标签，
\Arg{item number} 自定义参考文献的序号，如果省略，则按自然排序给定序号。
\Arg{widest label} 用以限制参考文献序号的宽度，如 99 意味着不超过两位数字。通常设定为与参考文献的数目一致。

\env{thebibliography} 环境自动生成不带编号的一节（\cls{article} 文档类）或一章（\cls{report} / \cls{book} 文档类）。
在 \cls{article} 文档类的节标题默认为“References”，而在 \cls{report} / \cls{book} 文档类
的章标题默认为“Bibliography”。用户可通过 \ref{sec:latex-settings} 节给出的方法定制参考文献的标题。

以下为一个使用 \env{the\-biblio\-graphy} 排版参考文献的例子：
\begin{verbatim}
\documentclass{article}
\begin{document}
\section{Introduction}
Partl~\cite{germenTeX} has proposed that \ldots

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

\subsection{\hologo{BibTeX} 数据库}\label{subsec:bibtex-data}

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

\hologo{BibTeX} 数据库以 \texttt{.bib} 作为扩展名，其内容是若干个文献条目，每个条目的格式为：
\begin{command}
\texttt @\Arg{type}\texttt\{\Arg{citation}, \\
\qquad\Arg{key1} = \marg{value1}, \\
\qquad\Arg{key2} = \marg{value2}, \\
\qquad\ldots\\
\texttt\}
\end{command}

其中 \Arg{type} 为文献的类别，如 \texttt{article} 为学术论文，\texttt{book} 为书籍，\texttt{in\-collection} 为论文集中的某一篇，等等。
\Arg{citation} 为 \cmd{cite} 命令使用的文献标签。在 \Arg{citation} 之后为条目里的各个字段，以 \Arg{key} = \marg{value} 的形式组织。

我们在此简单列举学术论文里使用较多的 \hologo{BibTeX} 文献条目类别：
\begin{description}
  \item[\texttt{article}] 学术论文，必需字段有 author, title, journal, year; 可选字段包括 volume, number, pages, doi 等；
  \item[\texttt{book}] 书籍，必需字段有 author/editor, title, publisher, year; 可选字段包括 volume/number, series, address 等；
  \item[\texttt{incollection}] 论文集中的一篇，必需字段有 author, title, booktitle, publisher, year; 可选字段包括 editor, volume/number, chapter, pages, address 等；
  \item[\texttt{inbook}] 书中的一章，必需字段有 author/editor, title, chapter/pages, publisher, year; 可选字段包括 volume/number, series, address 等。
\end{description}

例如 \texttt{article} 类别的参考文献数据条目写法如下：
\begin{verbatim}
@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}}
\end{verbatim}
所有类别的文献条目格式请参考 \CTAN|biblio/bibtex/base/btxdoc.pdf|。

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

\subsection{\hologo{BibTeX} 样式}\label{subsec:bibtex-style}

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

\cmdindex{bibliographystyle}
使用样式文件的方法是在源代码内（一般在导言区）使用 \cmd{biblio\-graphy\-style} 命令：
\begin{command}
\cmd{bibliographystyle}\marg{bst-name}
\end{command}
这里 \Arg{bst-name} 为 \texttt{.bst} 样式文件的名称，\textbf{不要带 \texttt{.bst} 扩展名}。

我们以 \ref{subsec:bibtex-data} 小节给出的数据条目为例，使用 \cmd{biblio\-graphy\-style} 命令选择不同的参考文献样式，
效果大致如表 \ref{tbl:bibtex-style} 所示。

\begin{table}[htp]
\caption{\hologo{BibTeX} 样式的排版效果}\label{tbl:bibtex-style}
\hrule
\begin{trivlist}\item\relax
\textbf{plain}\\{}
[1] Alice Axford, Bob Birkin, Charlie Copper, and Danny Dannford.
\newblock Demostration of bibliography items.
\newblock {\em Journal of \TeX perts}, 36(7):114--120, Mar 2013.

\medskip
\textbf{alpha}\\{}
[ABCD13] Alice Axford, Bob Birkin, Charlie Copper, and Danny Dannford.
\newblock Demostration of bibliography items.
\newblock {\em Journal of \TeX perts}, 36(7):114--120, Mar 2013.

\medskip
\textbf{abbrv}\\{}
[1] A.~Axford, B.~Birkin, C.~Copper, and D.~Dannford.
\newblock Demostration of bibliography items.
\newblock {\em Journal of \TeX perts}, 36(7):114--120, Mar 2013.

\medskip
\textbf{amsplain}（\AmS{} 文档类 \textsf{amsart} 等配套的样式）\\{}
[1] Alice Axford, Bob Birkin, Charlie Copper, and Danny Dannford, \emph{Demostration of bibliography
  items}, Journal of \TeX perts \textbf{36} (2013), no.~7, 114--120.

\medskip
\textbf{elsarticle-num}（Elsevier 提供的 \textsf{elsarticle} 文档类配套的样式）\\{}
[1] A.~Axford, B.~Birkin, C.~Copper, D.~Dannford, Demostration of bibliography items,
  Journal of \TeX perts 36~(7) (2013) 114--120.

\medskip
\textbf{IEEEtran}（\textsf{IEEEtran} 模板文档类配套的样式）\\{}
[1] A.~Axford, B.~Birkin, C.~Copper, and D.~Dannford, ``Demostration of
  bibliography items,'' \emph{Journal of \TeX perts}, vol.~36, no.~7, pp.
  114--120, Mar 2013.

\medskip
\textbf{gbt7714-numerical}（GB/T 7714---2015 样式，由 \textsf{gbt7714} 宏包提供）\\{}
[1] 陈登原. 国史旧闻: 第 1 卷[M]. 北京: 中华书局, 2000: 29.
\end{trivlist}
\hrule
\end{table}

\subsection{使用 \hologo{BibTeX} 排版参考文献}\label{subsec:bibtex-use}

\index{bibtex@\protect\hologo{BibTeX} 工具}
现在我们来看如何利用 \hologo{BibTeX} 数据库生成参考文献和引用。

第一步：准备一份 \hologo{BibTeX} 数据库，假设数据库文件名为 \texttt{books.bib}，
和 \LaTeX{} 源代码\textbf{一般位于同一个目录下}。

第二步：在源代码中添加必要的命令。假设源代码名为 \texttt{demo.tex}（见源代码 \ref{code:bibtex-demo}）。
\begin{enumerate}
\item \cmdindex{bibliographystyle}
首先需要使用命令 \cmd{bibliographystyle} 设定参考文献的格式。

\item \cmdindex{cite,nocite}
其次，在正文中引用参考文献。\hologo{BibTeX} 程序在生成参考文献列表的时候，通常只列出用了 \cmd{cite} 命令引用的那些。
如果需要列出未被引用的文献，则需要 \cmd{nocite}\marg{citation} 命令；而 \cmd{nocite}\marg*{*} 则让所有未被引用的文献都列出。

\item \cmdindex{bibliography}
再次，在需要列出参考文献的位置，使用 \cmd{biblio\-graphy} 命令代替 \env{the\-biblio\-graphy} 环境：
\begin{command}
\cmd{bibliography}\marg{bib-name}
\end{command}

其中 \Arg{bib-name} 是 \hologo{BibTeX} 数据库的文件名，\textbf{不要带 \texttt{.bib} 扩展名}。
\end{enumerate}

\begin{sourcecode}[htp]
\begin{Verbatim}
\documentclass{article}
\bibliographystyle{plain}
\begin{document}
\section{Some words}
Some excellent books, for example, \cite{citation1}
and \cite{citation2} \ldots

\bibliography{books}
\end{document}
\end{Verbatim}
\caption{利用 \texttt{books.bib} 生成参考文献的源代码 \texttt{demo.tex}。}\label{code:bibtex-demo}
\end{sourcecode}

注意：\cmd{bibliographystyle} 和 \cmd{bibliography} 命令缺一不可，没有这两个命令，使用 \hologo{BibTeX} 生成参考文献列表的时候会报错。

第三步：写好了以上两个文件之后，我们就可以开始编译了。
\begin{enumerate}
  \item 首先使用 \texttt{pdflatex} 或 \texttt{xelatex} 等命令编译 \LaTeX{} 源代码 \texttt{demo.tex}；
  \item 接下来用 \texttt{bibtex} 命令处理 \texttt{demo.aux} 辅助文件记录的参考文献格式、引用条目等信息。
  \texttt{bibtex} 命令处理完毕后会生成 \texttt{demo.bbl} 文件，内容就是一个 \env{thebibliography} 环境；
  \item 再使用 \texttt{pdflatex} 或 \texttt{xelatex} 等命令把源代码 \texttt{demo.tex} 编译\textbf{两遍}，读入参考文献并正确生成引用。
\end{enumerate}

整个过程使用的命令如下（可以略去扩展名）：
\begin{verbatim}
xelatex demo
bibtex demo
xelatex demo
xelatex demo
\end{verbatim}

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

\subsection{\pkg{natbib} 宏包}\label{subsec:natbib}

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

\cmdindex[natbib]{citep,citet}
除了 \cmd{cite} 之外，\pkg{natbib} 宏包在正文中支持两种引用方式：
\begin{command}
\cmd{citep}\marg{citation} \\
\cmd{citet}\marg{citation}
\end{command}

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

\pkg{natbib} 宏包同样也支持数字引用，并且支持将引用的序号压缩，例如：
\begin{verbatim}
\usepackage[numbers,sort&compress]{natbib}
\end{verbatim}
调用 \pkg{natbib} 宏包时指定以上选项后，连续引用多篇文献时，会生成形如 (3--7) 的引用而不是 (3, 4, 5, 6, 7)。

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


\subsection{\pkg{biblatex} 宏包}\label{subsec:biblatex}

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

基于 \pkg{biblatex} 宏包的方式与基于 \hologo{BibTeX} 的传统方式有一定区别，下面从文档结构和命令、编译方式、样式选择等方面逐一介绍：

\subsubsection{文档结构和 \pkg{biblatex} 相关命令}

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

\begin{sourcecode}[htp]
\begin{Verbatim}
% File: egbibdata.bib
@book{caimin2006,
  title      = {UML基础和Rose建模教程},
  address    = {北京},
  author     = {蔡敏 and 徐慧慧 and 黄柄强},
  publisher  = {人民邮电出版社},
  year       = {2006},
  month      = {1}
}

% File: demo.tex
\documentclass{ctexart}
% 使用符合 GB/T 7714-2015 规范的参考文献样式
\usepackage[style=gb7714-2015]{biblatex}
% 注意加 .bib 扩展名
\addbibresource{egbibdata.bib}

\begin{document}

见文献\cite{caimin2006}。

\printbibliography
\end{document}
\end{Verbatim}
\caption{应用 \pkg{biblatex} 的示例 egbibdata.bib 和 demo.tex。}
\end{sourcecode}

\subsubsection{编译方式}

\index{biber}
与基于 \hologo{BibTeX} 的传统方式不同的是，\pkg{biblatex} 宏包使用 \texttt{biber} 程序处理参考文献。因此上述文档的编译步骤为：

\begin{verbatim}
xelatex demo
biber demo
xelatex demo
xelatex demo
\end{verbatim}

\subsubsection{\pkg{biblatex} 样式和其它选项}

\pkg{biblatex} 使用的参考文献样式分为著录样式（bibliography style）和引用样式（citation style），分别以 \texttt{.bbx} 和 \texttt{.cbx} 为扩展名。参考文献的样式在调用宏包时使用 \texttt{style} 选项指定，或者使用 \texttt{bibstyle} 或 \texttt{citestyle} 分别指定：
\begin{verbatim}
% 同时调用 gb7714-2015.bbx 和 gb7714-2015.cbx
\usepackage[style=gb7714-2015]{biblatex}
% 著录样式调用 gb7714-2015.bbx，引用样式调用 biblatex 宏包自带的 authoryear
\usepackage[bibstyle=gb7714-2015,citestyle=authoryear]{biblatex}
\end{verbatim}

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

\begin{description}
  \item[\texttt{authoryear}]
  \pkg{biblatex} 自带样式，类似 \pkg{natbib} 默认的引用样式效果。
  \item[\texttt{authortitle}]
  \pkg{biblatex} 自带样式，采用作者-题名（shorttitle 字段）的引用样式。
  \item[\texttt{verbose}]
  \pkg{biblatex} 自带样式，引用样式中包含作者、题名、书名、页码等字段的信息。
  \item[\texttt{alphabetic}]
  \pkg{biblatex} 自带样式，著录样式与 \hologo{BibTeX} 的 \texttt{alpha} 样式类似。
  \item[\texttt{trad-alpha}]
  \pkg{biblatex-trad} 样式包，移植自 \hologo{BibTeX} 默认的 \texttt{alpha} 样式。另外还包括 \texttt{trad-abbrv}、\texttt{trad-plain} 和 \texttt{trad-unsrt}。
  \item[\texttt{gb7714-2015}]
  符合中文文献著录标准 GB/T 7714---2015 的样式，著录按顺序编码排版。另外还包括按作者—年份顺序排版著录的样式 \texttt{gb7714-2015ay}。
  \item[\texttt{caspervector}]
  以中文文献著录标准 GB/T 7714---2015 为基础的一个样式。
  \item[\texttt{ieee}]
  兼容 \pkg{IEEEtran} 风格的样式，著录按顺序编码排版。另外还包括按作者—年份顺序排版著录的样式 \texttt{ieee-alphabetic}。
\end{description}

\section{索引和 makeindex 工具}\label{sec:index}

\pinyinindex{suoyin}{索引}
\index{makeindex@makeindex 工具}
书籍和大文档通常用索引来归纳关键词，方便用户查阅。\LaTeX{} 借助配套的 makeindex 程序完成对索引的排版。

\subsection{使用 makeindex 工具的方法}\label{subsec:makeidx}

要使用索引，须经过这么几个步骤（仍设源代码名为 \texttt{demo.tex}）：

\pkgindex{makeidx}
\cmdindex[makeidx]{makeindex}
第一步，在 \LaTeX{} 源代码的导言区调用 \pkg{makeidx} 宏包，并使用 \cmd{makeindex} 命令开启索引的收集：
\begin{verbatim}
\usepackage{makeidx}
\makeindex
\end{verbatim}

\cmdindex{index}
\cmdindex[makeidx]{printindex}
第二步，在正文中需要索引的地方使用 \cmd{index} 命令。\cmd{index} 命令的参数写法详见下一小节；
并在需要输出索引的地方（如所有章节之后）使用 \cmd{printindex} 命令。

第三步，编译过程：

\begin{enumerate}
  \item 首先用 \texttt{xelatex} 等命令编译源代码 \texttt{demo.tex}。编译过程中产生索引记录文件 \texttt{demo.idx}；
  \item 用 makeindex 程序处理 \texttt{demo.idx}，生成用于排版的索引列表文件 \texttt{demo.ind}；
  \item 再次编译源代码 \texttt{demo.tex}，正确生成索引列表。
\end{enumerate}

\subsection{索引项的写法}\label{subsec:index-entry}

\cmdindex{index}
添加索引项的命令为：
\begin{command}
\cmd{index}\marg{index entry}
\end{command}

其中 \Arg{index entry} 为索引项，写法由表 \ref{tbl:index-entry} 汇总。其中 \texttt!、\texttt @ 和 \texttt|
为特殊符号，如果要向索引项直接输出这些符号，需要加前缀 \texttt"；而 \texttt" 需要输入两个引号 \texttt{""} 才能输出到索引项。

\begin{table}[htp]
\centering
\caption{索引项的写法列表}\label{tbl:index-entry}
\begin{tabular}{lll}
  \hline
  \textbf{举例} &\textbf{索引项} &\textbf{备注}\\
  \hline
  \multicolumn{3}{l}{普通索引} \\[.8ex]
  \verb+hello+              & hello, 1             & 普通索引 \\
  \hline
  \multicolumn{3}{l}{分级索引，以 \texttt! 分隔，最多支持三级} \\[.8ex]
  \verb+hello+              & hello, 1             & 一级索引 \\
  \verb+hello!Peter+        &\quad Peter, 3 & 二级索引 \\
  \verb+hello!Peter!Jack+   &\qquad Jack,  3 & 三级索引 \\
  \hline
  \multicolumn{3}{l}{格式化索引，形式为 \Arg{alpha}\texttt @\Arg{format}} \\
  \multicolumn{3}{l}{\Arg{alpha}为纯字母，用来排序} \\
  \multicolumn{3}{l}{\Arg{format}为索引的格式，可以包括 \LaTeX 代码和简单的公式} \\[.8ex]
  \verb+Mobius@M\""obius+   & M\"obius, 2          & 输出重音 \\
  \verb+alpha@$\alpha$+     & $\alpha$, 7          & 输出公式 \\
  \verb+bold@\textbf{bold}+ & \textbf{bold}, 12    & 输出粗体 \\
  \hline
  \multicolumn{3}{l}{页码范围} \\[.8ex]
  \verb+morning|(+          & morning, 6--7        & 范围索引的开头 \\
  \verb+morning|)+          &                      & 范围索引的结尾 \\
  \hline
  \multicolumn{3}{l}{格式化索引页码} \\[.8ex]
  \verb+Jenny|textbf+       & Jenny, \textbf{3}       & 调用 \cmd{textbf} 加粗页码 \\
  \verb+Joe|see{Jenny}+     & Joe, \textit{see} Jenny & 调用 \cmd{see} 生成特殊形式 \\
  \verb+Joe|seealso{Jenny}+ & Joe, \textit{see also} Jenny & 调用 \cmd{seealso} 生成特殊形式 \\
  \hline
\end{tabular}
\end{table}

读者可以钻研一下以下给出的一个较为复杂的，结合多级索引、索引格式、页码格式等的用法示例。但在自己使用时，
最好还是遵循“简单的就是最好的”原则，尽量使用表 \ref{tbl:index-entry} 中的写法。
\begin{verbatim}
Test index.
\index{Test@\textsf{""Test}|(textbf}
\index{Test@\textsf{""Test}!sub@"|sub"||see{Test}}
\newpage
Test index.
\index{Test@\textsf{""Test}|)textbf}
\end{verbatim}

\section{使用颜色}\label{sec:color}

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

\subsection{颜色的表达方式}\label{subsec:color-code}

\pkgindex{color}
\cmdindex[color/xcolor]{color}
调用 \pkg{color} 或 \pkg{xcolor} 宏包后，我们就可以用如下命令切换颜色：
\begin{command}
\cmd{color}\oarg{color-mode}\marg{code} \\
\cmd{color}\marg{color-name}
\end{command}

颜色的表达方式有两种，其一是使用色彩模型和色彩代码，代码用 $0\sim1$ 的数字代表成分的比例。
\pkg{color} 宏包支持 \texttt{rgb}、\texttt{cmyk} 和 \texttt{gray} 模型，\pkg{xcolor} 支持更多的模型如 \texttt{hsb} 等。
\begin{example}
\large\sffamily
{\color[gray]{0.6}
  60\% 灰色} \\
{\color[rgb]{0,1,1}
  青色}
\end{example}

其二是直接使用名称代表颜色，前提是已经定义了颜色名称（没定义的话会报错）：
\begin{example}
\large\sffamily
{\color{red} 红色} \\
{\color{blue} 蓝色}
\end{example}

\pkgindex{xcolor}
\pkg{color} 宏包仅定义了 8 种颜色名称，\pkg{xcolor} 补充了一些，总共有 19 种，见表 \ref{tbl:colors}。

\def\showcolor#1{%
  \texttt{#1}\index{yanse@颜色!#1@\texttt{#1}}%
  \ \begingroup\fboxsep=0pt\fbox{{\color{#1}\vrule width 1.2em height 1.4ex}}\endgroup}
\def\showxcolor#1{%
  \texttt{#1}\index{yanse@颜色!#1@\texttt{#1} (\pkg{xcolor})}%
  \ \begingroup\fboxsep=0pt\fbox{{\color{#1}\vrule width 1.2em height 1.4ex}}\endgroup}

\begin{table}[htp]
\centering
\caption{\pkg{color} 和 \pkg{xcolor} 宏包可用的颜色名称}\label{tbl:colors}
\renewcommand\arraystretch{1.1}
\begin{tabularx}{0.8\textwidth}{*{4}{>{\raggedleft\arraybackslash}X}}
 \hline
 \multicolumn{4}{c}{基本的 8 种颜色名称（后三种颜色为 CMYK 模型）} \\
 \showcolor{black} & \showcolor{red} & \showcolor{green} & \showcolor{blue} \\
 \showcolor{white} & \showcolor{cyan} & \showcolor{magenta} & \showcolor{yellow} \\
 \hline
 \multicolumn{4}{c}{\pkg{xcolor} 额外可用的颜色名称：} \\
 \showxcolor{darkgray} & \showxcolor{gray} & \showxcolor{lightgray} &    \\
 \showxcolor{brown}  & \showxcolor{olive} & \showxcolor{orange} & \showxcolor{lime}\\
 \showxcolor{purple} & \showxcolor{teal} & \showxcolor{violet} & \showxcolor{pink} \\
 \hline
\end{tabularx}
\end{table}

\pkg{xcolor} 还支持将颜色通过表达式混合或互补：
\begin{example}
\large\sffamily
{\color{red!40} 40\% 红色}\\
{\color{blue}蓝色
\color{blue!50!black}蓝黑
\color{black}黑色}\\
{\color{-red}红色的互补色}
\end{example}

我们还可以通过命令自定义颜色名称，注意这里的 \Arg{color-mode} 是必选参数：
\begin{command}
\cmd{definecolor}\marg{color-name}\marg{color-mode}\marg{code}
\end{command}

如果调用 \pkg{color} 或 \pkg{xcolor} 宏包时指定 \texttt{dvipsnames} 选项，就有额外的 68 种颜色名称可用%
\footnote{\pkg{color} 宏包实际要指定 \texttt{dvipsnames} 和 \texttt{usenames} 选项。}。
\pkg{xcolor} 宏包还支持通过指定其它选项载入更多颜色名称。限于篇幅不展开介绍，详情请参考 \pkg{xcolor} 宏包的手册。

\subsection{带颜色的文本和盒子}\label{subsec:colorbox}

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

\cmdindex[color/xcolor]{textcolor}
输入带颜色的文本可以用类似 \cmd{textbf} 的命令：
\begin{command}
\cmd{textcolor}\oarg{color-mode}\marg{code}\marg{text} \\
\cmd{textcolor}\marg{color-name}\marg{text}
\end{command}

\cmdindex[color/xcolor]{colorbox}
以下命令构造一个带背景色的盒子，\Arg{material} 为盒子中的内容：
\begin{command}
\cmd{colorbox}\oarg{color-mode}\marg{code}\marg{material} \\
\cmd{colorbox}\marg{color-name}\marg{material}
\end{command}

\cmdindex[color/xcolor]{fcolorbox}
以下命令构造一个带背景色和有色边框的盒子，\Arg{fcode} 或 \Arg{fcolor-name} 用于设置边框颜色：
\begin{command}
\cmd{fcolorbox}\oarg{color-mode}\marg{fcode}\marg{code}\marg{material} \\
\cmd{fcolorbox}\marg{fcolor-name}\marg{color-name}\marg{material}
\end{command}

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

\cmdindex{fboxrule,fboxsep}
\cmd{fcolorbox} 也可以像 \ref{subsec:fbox} 小节里的 \cmd{fbox} 那样调节 \cmd{fbox\-rule} 和 \cmd{fbox\-sep}；对于 \cmd{color\-box}，
调整 \cmd{fbox\-sep} 是有效的。这里不再给出具体的示例。

\section{使用超链接}\label{sec:hyperlinks}

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

\subsection{\pkg{hyperref} 宏包}\label{subsec:hyperref}

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

\pinyinindex{xuanxiang}{选项（宏包/文档类）}
与 \pkg{graphicx} 宏包类似，\texttt{latex} + \texttt{dvipdfmx} 命令下调用 \pkg{hyperref} 宏包时，需要指定选项 \texttt{dvipdfmx}；
而 \texttt{pdflatex} 或 \texttt{xelatex} 命令下不需要。

\cmdindex[hyperref]{hypersetup}
\pkg{hyperref} 宏包提供了命令 \cmd{hypersetup} 配置各种参数。参数也可以作为宏包选项，在调用宏包时指定：
\begin{command}
\cmd{hypersetup}\marg*{\Arg{option1},\Arg{option2}=\marg*{value},\ldots} \\
\cmd{usepackage}\oarg*{\Arg{option1},\Arg{option2}=\marg*{value},\ldots}\marg*{hyperref}
\end{command}
当选项值为 \texttt{true} 时，可以省略“\texttt{=true}”不写。可用的参数见表 \ref{tbl:hyperref-settings}。

\begin{table}[htp]
\centering
\caption{\pkg{hyperref} 宏包提供的参数设置}\label{tbl:hyperref-settings}
\def\TF{\Arg{true\textnormal|false}}
\begin{tabular}{llp{19.5em}}
 \hline
 \textbf{参数}                     & \textbf{默认值} & \textbf{含义} \\
 \hline
 \texttt{draft=}\TF                & \textit{false}  & 关闭所有超链接、书签等功能（也可以通过文档类选项指定） \\
 \texttt{final=}\TF                & \textit{true}   & 开启所有超链接、书签等功能（也可以通过文档类选项指定） \\
 \hline
 \texttt{colorlinks=}\TF           & \textit{false}  & 设置为 \textit{true} 为链接文字带颜色，反之加上带颜色的边框 \\
 \texttt{hidelinks}                &                 & 取消链接的颜色和边框 \\
 \texttt{pdfborder=}\marg*{\Arg{n} \Arg{n} \Arg{n}}
                                   &  0 0 1          & 超链接边框设置，设为 0 0 0 可取消边框 \\
 \hline
 \texttt{bookmarks=}\TF\textsuperscript{\dag}
                                   & \textit{true}   & 是否生成书签 \\
 \texttt{bookmarksopen=}\TF        & \textit{false}  & 是否展开书签 \\
 \texttt{bookmarksnumbered=}\TF    & \textit{false}  & 书签是否带章节编号 \\
 \hline
 \texttt{pdftitle=}\Arg{string}    & 空              & 标题 \\
 \texttt{pdfauthor=}\Arg{string}   & 空              & 作者 \\
 \texttt{pdfsubject=}\Arg{string}  & 空              & 主题 \\
 \texttt{pdfkeywords=}\Arg{string} & 空              & 关键词 \\
 \texttt{pdfstartview=}\Arg{Fit\textnormal|FitH\textnormal|FitV}
                                   & \textit{Fit}    & 设置 PDF 页面以适合页面/适合宽度/适合高度等方式显示，默认为适合页面 \\
 \hline
\end{tabular}
\begin{quotation}
\small
\textsuperscript{\dag} 该选项只能作为宏包选项，在调用宏包时指定。
\end{quotation}
\end{table}

\subsection{超链接}\label{subsec:url-href}

\cmdindex[hyperref]{url,nolinkurl}
\pkg{hyperref} 宏包提供了直接书写超链接的命令，用于在 PDF 中生成 URL：
\begin{command}
\cmd{url}\marg{url} \\
\cmd{nolinkurl}\marg{url}
\end{command}

\cmd{url} 和 \cmd{nolinkurl} 都像抄录命令 \cmd{verb} 一样输出一个 URL，区别是前者还为 URL 加上了超链接，后者没有。%
\footnote{注意，一些 PDF 阅读器会为 URL 文本自动加上超链接，这些超链接不是 \LaTeX{} 生成的。}%
在 \cmd{url} 等命令的参数 \Arg{url} 里，
\textbf{可直接输入如 \texttt\%、\texttt\& 这样的特殊符号}。

\cmdindex[hyperref]{href}
我们也可以像 HTML 中的超链接一样，把一段文字作为超链接：
\begin{command}
\cmd{href}\marg{url}\marg{text}
\end{command}

\begin{example}
\url{https://wikipedia.org} \\
\nolinkurl{https://wikipedia.org} \\
\href{https://wikipedia.org}{Wiki}
\end{example}

\cmdindex[hyperref]{hyperref}
使用 \pkg{hyperref} 宏包后，文档中所有的引用、参考文献、索引等等都转换为超链接。
用户也可对某个 \cmd{label} 命令定义的标签 \Arg{label} 作超链接（注意这里的 \Arg{label} 虽然是可选参数的形式，但通常是\textbf{必填的}%
\footnote{不带可选参数的 \cmd{hyperref} 命令带四个必选参数，前三个组成特殊格式的超链接，最后一个同 \Arg{text}。}）：
\begin{command}
\cmd{hyperref}\oarg{label}\marg{text}
\end{command}

默认的超链接在文字外边加上一个带颜色的边框（在打印 PDF 时边框不会打印），可指定 \texttt{color\-links} 参数修改为将文字本身加上颜色，
或修改 \texttt{pdf\-border} 参数调整边框宽度以“去掉”边框；\texttt{hide\-links} 参数则令超链接既不变色也不加边框。
\begin{verbatim}
\hypersetup{hidelinks}
% or:
\hypersetup{pdfborder={0 0 0}}
\end{verbatim}

\subsection{PDF 书签}\label{subsec:pdf-bookmark}

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

书签的一些属性见表 \ref{tbl:hyperref-settings}。使用 \pkg{CJK} 宏包时，为了防止中文书签出现乱码，
需要进行繁琐的设置；但在使用 \pkg{ctex} 宏包和文档类、且使用 \texttt{xelatex} 或 \texttt{lualatex} 编译的情况下，
无需用户额外干预，即可正确生成中文书签。

\cmdindex[hyperref]{pdfbookmark}
\pkg{hyperref} 还提供了手动生成书签的命令：
\begin{command}
\cmd{pdfbookmark}\oarg{level}\marg{bookmark}\marg{anchor}
\end{command}
\Arg{bookmark} 为书签名称，\Arg{anchor} 为书签项使用的锚点（类似交叉引用的标签）。可选参数 \Arg{level} 为书签的层级，默认为 0。

\cmdindex[hyperref]{texorpdfstring}
章节命令里往往有 \LaTeX{} 命令甚至数学公式，而 PDF 书签是纯文本，对命令和公式的处理很困难，有出错的风险。
\pkg{hyperref} 宏包已经为我们处理了许多常见命令，如 \cmd{LaTeX} 和字体命令 \cmd{textbf} 等，
对于未被处理的命令或数学公式，就要在章节标题中使用如下命令，分别提供 \LaTeX{} 代码和 PDF 书签可用的纯文本：
\begin{command}
\cmd{texorpdfstring}\marg{\LaTeX{} code}\marg{PDF bookmark text}
\end{command}
比如在章节名称里使用公式 $E=mc^2$，而书签则使用纯文本形式的 \verb|E=mc^2|：
\begin{verbatim}
\section{质能公式 \texorpdfstring{$E=mc^2$}{E=mc\textasciicircum 2}}
\end{verbatim}

\subsection{PDF 文档属性}\label{subsec:pdf-settings}

\pkg{hyperref} 宏包还提供了一些参数用于改变 PDF 文档的属性，部分见表 \ref{tbl:hyperref-settings}。


\endinput
