\chapter{杂项} \section{超链接} \label{sec:hyperlink} \verb|hyperref|~宏包\citep{Rahtz_2006}提供了一些超链接功能。它给文档内部的交叉引用和参考文献自动加上了超链接,还提供了几个命令。 \verb|\hyperref|~命令对已经定义的label进行简单包装,加上文字描述。 \begin{code} \usepackage{hyperref} ... \label{sec:hyperlink} ... 例如\ref{sec:hyperlink}是编号形式的链接,而\hyperref[sec:hyperlink]{这个链接}是文字形式的链接,都指向本节开始。 \end{code} \begin{out} 例如\ref{sec:hyperlink}是编号形式的超链接,而\hyperref[sec:hyperlink]{这个链接}则是文字形式,都指向本节开始。 \end{out} \verb|\url|~和~\verb|\href|~命令可以用来定义外部链接,后者有文字描述。 \begin{code} \url{http://www.dralpha.com/} \href{http://www.dralpha.com/}{包老师的主页} \end{code} \begin{out} \url{http://www.dralpha.com/} \href{http://www.dralpha.com/}{包老师的主页} \end{out} %hyperref选项 \section{长文档} 当文档很长时,我们可以把它分为多个文件,然后在主控文档的正文中引用它们。注意~\verb|\include|~命令会新起一页,如果不想要新页可以改用~\verb|\input|~命令。 \begin{code} %master.tex \begin{document} \include{chapter1.tex} \include{chapter2.tex} ... \end{document} \end{code} 当文档很长时,编译一遍也会很花时间,我们可以用~\verb|syntonly|~宏包。这样编译时就只检查语法,而不生成结果文件。 \begin{code} \usepackage{syntonly} ... \syntaxonly \end{code} \section{参考文献} 在文档中,我们经常要引用参考文献(bibliography)。\LaTeX~提供的~\verb|thebibliography|~环境和~\verb|\bibtem|~命令可以用来定义参考文献条目及其列表显示格式,\verb|cite|~命令用来在正文中引用参考文献条目。这种方法把内容和格式混在一起,用户需要为每个条目设置格式,很繁琐且易出错。 \subsection{BibTeX} 1985年,~Oren Patashnik\footnote{Wiki~上说他是~Knuth~的学生,我发现他不在~Knuth~的博士生列表上,而在姚期智的博士生列表上,也许他是~Knuth~的硕士生。}和~Lamport~开发了~\BibTeX\citep{Patashnik_1988},其详细使用方法请参阅~Nicolas Markey~的《Tame the BeaST: The B to X of BibTeX》\citep{Markey_2005} \BibTeX~把参考文献的数据放在一个~\verb|.bib|~文件中,显示格式放在~\verb|.bst|~文件中。普通用户一般不需要改动~\verb|.bst|,只须维护~\verb|.bib|~数据库。 一个~\verb|.bib|~文件可以包含多个参考文献条目(entry),每个条目有类型、关键字,以及题目、作者、年份等字段。常用条目类型有~article、~book、conference、manual、misc、techreport~等。每种类型都有一些自己的规定字段和可选字段,字段之间用逗号分开。数据库中每个条目的关键字要保持唯一,因为引用时要用到它们。 下例显示了一个条目,它的类型是~\verb|manual|,关键字是~\verb|Markey_2005|。~\verb|.bib|~文件可以用普通文本编辑器来编辑,也可以用专门的文献管理软件来提高效率。包老师推荐~\href{http://jabref.sourceforge.net/}{JabRef}。 \begin{code} @MANUAL{Markey_2005, title = {Tame the BeaST: The B to X of BibTeX}, author = {Nicolas Markey}, year = {2005}, url = {http://www.ctan.org/tex-archive/info/bibtex/ tamethebeast/} } \end{code} 有了数据库,我们可以象下面这样引用一个条目。 \begin{demo} 请参阅\cite{Markey_2005}。 \end{demo} 前文中我们提到含有交叉引用的文档需要编译两遍。含有参考文献的文档更麻烦,它需要依次执行~\verb|latex、bibtex、latex、latex|~等四次编译操作。 \begin{enumerate} \item 第一遍~\verb|latex|~只把条目的关键字写到中间文件~\verb|.aux|~中去。 \item \verb|bibtex|~根据\verb|.aux、.bib、.bst|~生成一个~\verb|.bbl|~文件,即参考文献列表。它的内容就是~\verb|thebibliography|~环境和一些~\verb|\bibtem|~命令。 \item 第二遍~\verb|latex|~把交叉引用写到~\verb|.aux|~中去。 \item 第三遍~\verb|latex|~则在正文中正确地显示引用。 \end{enumerate} \begin{figure}[htbp] \centering \begin{tikzpicture} \node[box] (tex) {.tex}; \node[box, right=4 of tex] (aux) {.aux}; \node[box, right=6 of aux] (bbl) {.bbl}; \node[box, above=1.5 of aux] (bib) {.bib}; \node[box, below=1.5 of aux] (bst) {.bst}; \path (tex) edge [arrow] node[auto] {latex} (aux) (aux) edge [arrow] node[auto] {bibtex} (bbl) (bib.east) edge [rloop] (bst); \end{tikzpicture} \caption{\BibTeX~的编译} \label{fig:bibtex} \end{figure} 注意在长文档中使用参考文献时,应该用~\verb|latex|~编译主控文档,而用~\verb|bibtex|~编译子文档。 \begin{code} latex master(.tex) bibtex chapter1(.tex) latex master(.tex) latex master(.tex) \end{code} \subsection{natbib} 参考文献的引用通常有两种样式:作者-年份和数字。\LaTeX~本身只支持数字样式,而~\verb|natbib|~宏包\citep{Daly_2007}则同时支持这两种样式。 使用~\verb|natbib|~宏包时,我们首先要引用宏包;其次设置文献列表样式和引用样式,每种列表样式都有自己的缺省引用样式,所以后者可选;然后指定参考文献数据库。 \begin{code} \usepackage{natbib} ... \begin{document} \bibliographystyle{plainnat} \setcitestyle{square,aysep={},yysep={;}} \bibliography{mybib.bib} ... \end{document} \end{code} \verb|natbib|~提供了三种列表样式:plainnat、abbrvnat、unsrtnat。前两种都是作者-年份样式,文献列表按作者-年份排序,后者会使用一些缩写(比如作者的~first name);unsrtnat~是数字样式,文献列表按引用顺序排序。 \verb|\setcitestyle|~命令可以用来改变引用样式的设置,其选项见~\Fref{tab:citestyle}。 \begin{table}[htbp] \caption{参考文献引用样式选项} \label{tab:citestyle} \centering \begin{tabular}{ll} \toprule 引用模式 & authoryear、numbers、super \\ 括号 & round、square、open={char},close={char} \\ 引用条目分隔符 & 分号、逗号、citesep={char} \\ 作者年份分隔符 & aysep={char} \\ 共同作者年份分隔符 & yysep={char} \\ 注解分隔符 & notesep={text} \\ \bottomrule \end{tabular} \end{table} 注意在长文档中,每个含参考文献的子文档都需要分别设置列表样式,并指定数据库。 \verb|natbib|~提供了多种引用命令,其中最基本的是~\verb|\citet|~和~\verb|\citep|~,它们在不同引用模式下效果不同。一般不推荐使用~\LaTeX~本身提供的~\verb|\cite|,因为它在作者-年份模式下和~\verb|\citet|~一样,在数字模式下和~\verb|\citep|~一样。 作者-年份模式下引用命令的效果如下。 \setcitestyle{authoryear} \begin{demo} 参阅\cite{Daly_2007}\\ 参阅\citet{Daly_2007}\\ 参阅\citep{Daly_2007} \end{demo} 数字模式下引用命令的效果如下。 \setcitestyle{numbers} \begin{demo} 参阅\cite{Daly_2007}\\ 参阅\citet{Daly_2007}\\ 参阅\citep{Daly_2007} \end{demo} 上标模式下引用命令的效果如下。 \setcitestyle{super} \begin{demo} 参阅\cite{Daly_2007}\\ 参阅\citet{Daly_2007}\\ 参阅\citep{Daly_2007} \end{demo} 另外还有一些引用命令,如~\verb|\citetext、\citenum、\citeauthor|、~\verb|\citeyear|~等,此处不赘述。 \section{索引} \verb|makeidx|~宏包提供了索引功能。应用它时,我们首先需要在文档序言部分引用宏包,并使用~\verb|makeindex|~命令;其次在正文中需要索引的地方定义索引,注意索引关键字在全文中须保持唯一;最后在合适的地方(一般是文档末尾)打印索引。 \begin{code} \usepackage{makeidx} \makeindex ... \begin{document} \index{索引关键字} ... \printindex \end{document} \end{code} 当编译含索引的文档时,用户需要执行~\verb|latex、makeindex、latex|~等三次编译操作。 \begin{enumerate} \item 第一遍~\verb|latex|~把索引条目写到一个~\verb|.idx|~文件中去。 \item \verb|makeindex|~把~\verb|.idx|~排序后写到一个~\verb|.ind|~文件中去。 \item 第二遍~\verb|latex|~在~\verb|\printindex|~命令的地方引用~\verb|.ind|~的内容,生成正确的DVI。 \end{enumerate} \begin{figure}[htbp] \centering \begin{tikzpicture} \node[box] (tex) {.tex}; \node[box, right=4 of tex] (idx) {.idx}; \node[box, right=7 of idx] (ind) {.ind}; \node[box, right=6 of ind] (dvi) {.dvi}; \node[box, above=1.5 of ind] (tex1) {.tex}; \node[right=1 of ind] (point) {}; \path (tex) edge [arrow] node[auto] {latex} (idx) (idx) edge [arrow] node[auto] {makeindex} (ind) (ind) edge [arrow] node[auto] {latex} (dvi) (tex1.east) edge [rloop] (point); \end{tikzpicture} \caption{索引的编译} \label{fig:makeidx} \end{figure} \section{页面布局} 在~\LaTeX~中用户可以通过~\verb|\pagestyle|~和~\verb|\pagenumbering|~命令来设置页眉(header)、页脚(footer)的样式和内容。页面样式有以下四种。 \begin{table}[htbp] \caption{\LaTeX~页面样式} \centering \begin{tabular}{ll} \toprule \texttt{empty} & 页眉、页脚空白 \\ \texttt{plain} & 页眉空白,页脚含居中页码 \\ \texttt{headings} & 页脚空白,页眉含章节名和页码 \\ \texttt{myheadings} & 页脚空白,页眉含页码和用户自定义信息 \\ \bottomrule \end{tabular} \end{table} \verb|fancyhdr|\citep{Oostrum_2004}宏包提供了更灵活的控制。我们可以用以下代码定制页眉、页脚的内容,以及页眉下方、页脚上方的横线。 \begin{code} \usepackage{fancyhdr} ... \pagestyle{fancy} %fancyhdr宏包新增的页面风格 \lhead{左擎苍} \chead{三个代表} \rhead{右牵黄} \lfoot{左青龙} \cfoot{八荣八耻} \rfoot{右白虎} \renewcommand{\headrulewidth}{0.4pt} \renewcommand{\footrulewidth}{0.4pt} \end{code} \ \\ \begin{tikzpicture} \draw (0,0) rectangle (36,10); \node at(2,9) {左擎苍}; \node at(18,9) {三个代表}; \node at(34,9) {右牵黄}; \draw (.5,8)--(35.5,8); \node at(18,5) {和谐社会}; \draw (.5,2)--(35.5,2); \node at(2,1) {左青龙}; \node at(18,1) {八荣八耻}; \node at(34,1) {右白虎}; \end{tikzpicture} 用户可以在页眉、页脚中使用一些~\LaTeX~变量,比如分别代表页码和章节编号的~\verb|\thepage、\thechapter、\thesection|;代表章节起始单词(Chapter、Section等)的~\verb|\chaptername、\sectionname|~等。 这些变量组合起来可以构成复合标记~\verb|\leftmark|~和~\verb|\rightmark|~。当文档奇偶页面布局不同时,我们可以使用以下方法为奇偶页分别设置页眉、页脚。\verb|fancyhdr|~宏包会自动把每章起始页的样式设为~\verb|plain|,若想去掉页脚中间的页码,可以重定义~\verb|plain|~样式。 \begin{code} \pagestyle{fancy} \fancyhf{} %清空页眉页脚 \fancyhead[LE,RO]{\thepage} %偶数页左,奇数页右 \fancyhead[RE]{\leftmark} %偶数页右 \fancyhead[LO]{\rightmark} %奇数页左 \fancypagestyle{plain}{ %重定义plain页面样式 \fancyhf{} \renewcommand{\headrulewidth}{0pt} } \end{code} \ \\ \begin{tikzpicture} \draw (0,0) rectangle (36,10); \node at(2.5,9) {3.2 节名}; \node at(35,9) {17}; \draw (.5,8)--(35.5,8); \node at(18,5) {奇数页}; \end{tikzpicture} \ \\ \begin{tikzpicture} \draw (0,0) rectangle (36,10); \node at(1,9) {18}; \node at(32,9) {Chapter 3 章名}; \draw (.5,8)--(35.5,8); \node at(18,5) {偶数页}; \end{tikzpicture} Lamport当初设计~\LaTeX~时把页面布局变量的定义方式搞得比较晦涩,用户在重定义~\verb|\leftmark|~和~\verb|\rightmark|~时,不能直接用~\verb|\renewcommand|~的方法,而要用另外两个命令。 \begin{code} \markboth{main-mark}{sub-mark} \markright{sub-mark} \end{code} \verb|\leftmark|~即~main-mark,是一种高层次标记,在~article~文档类中它包含~section~的信息,在~report~和~book~则包含~chapter~的信息;\verb|rightmark|~则是一种低层次标记,在~article~中包含~subsection~信息,在~report~和~book~中包含~section~信息。 比如在~\verb|book|~文档类中,章节标记是通过下面的方法定义的,其中的~\verb|#1|~指的是章节的名字。 \begin{code} \renewcommand\chaptermark[1]{\markboth{\chaptername \thechapter. #1}{}} \renewcommand\sectionmark[1]{\markright{\thesection. #1}} \end{code} %\section{演示文档} \bibliographystyle{unsrtnat} \bibliography{reading} \newpage