目录深 度的表现形式是一种计数器(counter),他的名称是 tocdepth。以这篇文章的 report class 为例,他的默认值是(请自行查一下 report.cls): \setcounter{tocdepth}{2} 所以会计算到 subsection, 以下的就不列入了 (请参考第 3.4.4 小节的章节深度标号) 我们只要在 preamble 区, 。 使用 \setcounter 指令去重新指定,就会改变他的目录深度。 11.1.3 额外的目录 这是指没有编入目录,但想自行加进去的情形,例如:章节指令使用了星号就不会编号,图表目录没有使用 \caption 指令,也不编 入目录了,这时我们可以使用 \addcontentsline 指令来把他们手动加进去。我们来看看文图表的三种不同情况: \addcontentsline{toc}{章节名}{标题} \addcontentsline{lof}{figure}{标题} \addcontentsline{lot}{table}{标题} 这样就会把这些纳入目录,但是,这还是没有编号的。目录中所显示的页数,就是这些指令(图表)所在的页数。 11.2 交互参照(Cross References) 所谓的参照,指的是在文章某处提及某个其他的章节,或某个页数,甚至是某个图表,某个数学式子及某个列举项目,排版系统必需 要有这样的功能来自动达成这种效果,而 LaTeX 本身提供了三个简单易用的指令来自动处理,他会自动计算相对的章节、页数。 当然,由于网络的发达,超链接上的交互参照也变得是不可或缺,但 TeX/LaTeX 毕竟是平面排版系统,并没有这样的原始功能,但我 们可以经由宏套件来达成这样的目的,hyperef 宏套件就是为此而写的,这样就可以让 LaTeX 排版的结果去转换成 PDF/HTML 格式的 时候,也有超链接的功能。 广义的来说,包括目录的参照、文献参照、批注的参照及外部档案的参照(例如,参照某个外部档案的某个章节)都是属于交互参照 的一部份,但这些议题我们另外单独讨论,因为他不在 LaTeX 所提供的三个基本参照的指令范围内。 11.2.1 一般的交互参照 LaTeX 提供了三组基本参照的指令: \label{名称} \ref{名称} % 置放于要被引用之处,以一个名称来标记他 % 引用 \label 所标记处的章节 \pageref{名称} % 引用 \label 所标记处的页数 这里头的名称都是自行取名的,但为了避免重复,个人使用上一般使用上会加入章节或图表的代号,例如: ... \section{\LaTeX\ 的文稿结构} \label{sec:struct} ... \begin{figure} \includesgrapics{fontstruct} \caption{字型的结构} \label{fig:struct} \end{figure} ... 请参考第 \ref{sec:struct} 节,页 \pageref{sec:struct}。 请参考图 \ref{fig:struct},页 \pageref{fig:struct}。 ... 这两个 struct 代表不同的参照处,当然,尽量避免这种情形发生,可加入 fontstruct 之类的来区别,但前面冠上章节、图表的简 名,有助于看文稿时清楚区别。请注意,其中 sec:、fig: 都不是必要的,只是这样比较容易辨识,而且不容易名称重复。 要非常注意的的几个重点是: 1. 有参照的文稿一定要编译两次才能正常显示。 2. 能编号的章节、图表、列举项目、数学式、定理才能参照,虽然他们不一定要编号。 3. 图表的参照 \label 一定要在 \caption 之后,不能在前。 11.2.2 超链接交互参照(hyperlink) 这当然是要像 PDF/HTML 格式的档案才有超链接交互参照的可能, *.dvi、 像 *.ps 这类格式的档案, 先天上并没有这种设计。 LaTeX 而 本身并没有内建这种功能,我们可以使用 hyperref 宏套件来达成这个目的。现在一般的 TeX 发行版应该都会附上这个宏,如果没有 话,可以在以下网站下载、安装: ftp://ftp.tug.org/pub/tex/hyperref/ 这个套件会让原本 LaTeX 有交互参照的地方,在制作成 PDF 格式时也会有超链接的功能。他的配置文件是 hyperref.cfg,为了各种 文稿使用上的弹性,可以把这个文件在工作目录上建立一个,这样会依这个配置文件来执行,可参考本文文稿的原始码,里头会有一 个配置文件供参考。当然也是可以在 preamble 区来设定,但这就只能使用在特殊的文稿上了。 他的使用方法,这里不多做说明,可以参考本文的原始码里头的使用方法,或参考〈由 TeX/LaTeX 制作中文 PDF 档〉一文: http://www.study-area.org/tips/latex/chpdf.html http://www.study-area.org/tips/latex/chpdf.pdf 及 hyperref 所附的使用手册。 11.3 索引(index) 索引的排版方法上并不算困难, 困难的是要选出哪个字词需要索引, 及把各个字词加入索引指令。 我们引用 LaTeX 的标准宏 makeidx, 并在其他加上一个 makeindex 指令,然后在文稿结束前印出索引,下 printindex 就可以了。我们在需要编入索引的名词后加上 \index{名词} 经过编译后就会自动把索引及其相对的页数计算出来。 11.3.1 索引的结构及编译 我们来看看文稿里头要加入什么要件: ... \usepackage{makeidx} \makeindex ... 要索引的名词\index{要索引的名词} ... \printindex ... 编译的的程序如下: latex your.tex makeindex your.idx latex your.tex % 一定要有这个指令才会印出索引 % 把他加入目录 \addcontentsline{toc}{chapter}{索引} 11.3.2 索引值的制作 索引值(key)里头 |、@ 及 ! 有特殊的意义,要索引他们时前面要加 " 来 escape 他。我们来看这些符号实际上有什么作用: abc\index{abc} xyz\index{abc!xyz} abc\index{abc|textit} 这是一般正常的索引 表示 xyz 是 abc 下的一个子索引 表示这个索引值的页数使用 italic 斜体排版 abc\index{abc@\textbf{abc} 表示索引值是 abc,但使用粗体排版 \'abc\index{abc@\'abc} 表示依 abc 来排序索引,而不是后面的 ábc 制作索引是需要细心与耐心的,这方面更详细的数据可以参考系统上的 makeindex.dvi 及 manpages.dvi。要注意的是 \index{} 最 理想是紧接在要索引的名词后,前后都不留空白,有多个 \index{} 相连时亦同,这会让文件维护增加困难,因此,视每个人的习惯, 可以考虑索引在整篇文稿最后才加进去。这份文件也制作了简单的索引,但这只是当个例子供参考,在制作上有点粗糙,因此,实际 上可能会漏掉很多,而且,中文的处理仍有待加强。 制作索引的时候,他的表示法要细心的注意一下,前后相同索引值的表示法要一样,例如 \index{abc@\textbf{abc} 和 \index{abc@{\bf abc} 这会造成两个不同的索引,虽然印出来的是一样。而且,\verb|abc| 这种方式就行不通,因为 | 这个符号在 索引指令内有他的特殊作用,要改用其他的符号代替。如果是和 hyperref 配合的话,abc\index{abc|textit} 也会行不通,因为 hyperref 对超链接的索引是自动加上 |hyperpage, 如果已经有 |textit 了的话, 就不会加上去了, 这样一来超链接的部份会被忽略, 解决的方法只能去重定义索引方法,或在编译出来的 *.idx 或 *.ind 上做另外处理。例如: abc\index{abc|textit} latex 编译后的情形是: \indexentry{abc|textit}{143} 经 makeindex 编译后的情形是: % *.idx 档 \item abc, \textit{143} \item abc, \textit{\hyperpage{143}} % *.ind 档 % 这样才能又变更编号字体又能超链接 这样只编号改变字体,并没有超链接。而我们要的是: 这个议题比较深入一点,解决的方式可能需要大家一同来研究、研究,不是不能解决,而是方式在使用上是否方便的问题。 索引的处理, 他的信息实际上是产生在编译后的 *.idx 文件里头, 然后经由 makeindex 外部程序编译后, 转换成 *.ind, 然后 latex 再次编译的时候, 才把这个 *.ind 引进来, 这个 *.ind 其实就是一个 LaTeX 的文稿, 他把所有的索引值及页数, 包在一个 theindex 环境中来引入排版的。 说明这些的用意就是暗示,我们可以由外部处理程序去动手脚,把索引的部份再「加工」,包括中文数据的处理也是一样,下一节要 谈到的参考文献的处理机制也是类似的情形, 而这也就是为什么 latex 要执行好几次的原因, 也正因为这样, 我们才有动手脚的机会, 例如 makeindex 就有 -s 参数,可以接受外部的 style 档,或者,如果工作目录上有 *.mst(makeindex style)这个档,也会优先 去参考锩,这样就可以产生不同形式的索引结果。当然,参考文献可以另单独的一个文献外部文件,索引的话,目前则没有办法这样 做,是否可以比照参考文献的做法,由外部档案来处理呢?就请大家脑筋急转弯一下了,这样也可以让文稿更容易维护。 11.3.3 更改索引标题 默认的索引标题是 Index,我们可以在 preamble 区来更改他(中文的话,请放在本文区 CJK 环境内),例如,设要中文名称的话, 可更改为中文: \renewcommand\indexname{索~引} 11.4 参考文献(Bibliography) 参考文献可以经由 LaTeX 内建的 thebibliography 环境来制作。长篇文稿,也可以使用 BibTeX 由外部档案来制作。至于参考文献 的格式,就要符合邀稿单位的规格了,这里不多做说明。 11.4.1 thebibliography 环境 在进入 thebibliography,编译后他会自成一个独立的章节,如果是 article 类别的文稿,他会自动印出 Referrences 的字样为标 题,如果是 report 或 book 类别的文稿,他会印出 Bibliography 的字样为标题。 在 thebibliography 环境里头,他是由 \bibitem 指令来列出数据的,我们来看一下他的语法: \begin{thebibliography}{99} % 参考文献印出之编号最宽为两个字母宽 \bibitem[标记一]{键值一} 参考数据一 \bibitem[标记二]{键值二} 参考数据二 ... \edn{thebibliography} 所谓的「标记」这是选项参数,如果没有的话,则正常引用后会在甲用处使用阿拉伯数字外加方括号来显示;如果有加入的话,引用 后会使用所加入的标记来显示。那个「键值」指的就是引用时的关键词,后面所接的「参考数据」就是书籍、论文等信息。其中的 {99} 只表示在最后的参考文献印出来的时候,最开始的编号统一在两个字母宽,如果都没有使用「标记」,那么就是两个数目字宽,如果 有使用「标记」,那么要设在最长标记的字母宽,否则印出时会无法对齐。 我们引用的时候是使用 \cite{键值} 这个指令,他会显示参考数据中的编号值,且以方括号括起来。我们来看看一些设定及引用的例 子,: \begin{thebibliography}{KDE} % 参考文献中印出的编号最宽为三个字母宽 \bibitem{KDEt} Knuth, D.E., \textit{The \TeX{}book}, Reading, Massachusetts: Addison-Wesley, 1989. \bibitem[KDE]{KDEm} Knuth, D.E., \textit{The \MF{}book}, Reading, Massachusetts: Addison-Wesley, 1986. ... \end{thebibliography} 参考文献印出的结果请参考本文件后面关于参考数据的部份。至于引用方式及其引用情形如下(颜色的部份是因为使用 hyperref 套 件的超链接): 引用方式 请参考 \cite{KDEt} 引用结果 请参考 [1] 请参考 \cite[1989]{KDEt} 请参考 [1, 1989] 请参考 \cite{KDEm} 请参考 [KDE] 请参考 \cite[1986]{KDEm} 请参考 [KDE, 1986] 请参考 \cite{KDEt,KDEm} 请参考 [1,KDE] 如果你现在是在观看 PDF 格式的档案,那在 Xpdf 或 Adobe Acrobat Reader 都可以使用鼠标来点一下,看看真正在后面印出时是什 么样子。再次强调,参考文献的规格请依邀稿单位的要求,这里所列出来的不是「标准」。 11.4.2 更改标题名称 前面已提到过更改目录及索引的标题,同样的方法,我们也可以更改参考资料的标题,只是要注意引用的文稿类别是什么。 \renewcommand\refname{参~考~资~料} \renewcommand\bibname{参~考~文~献} % article 类别文稿 % report/book 类别文稿 11.4.3 BibTeX 简介 如果常常有写论文的机会,整理出自己的一份参考文献数据库可以节省许多时间,正常情况下,使用 bibtex 来处理外部文献档案的 情形,只有引用到的文献才会印出来,这样也就不必担心印出一堆不相关的文献了。另外一个好处是,这个参考文献数据库可以另外 独立维护,所有的文章都用这一份数据库,这在维护上会很方便,也减少错误的机会。 BibTeX 本身提供一个外部的 bibtex 工具程序,在 latex 编译过文稿后,再利用 bibtex 编译一次文稿,最后再使用 latex 重编译 过。而参考文献数据库是按一定的格式写于 *.bib 档案里头,在文稿中则以 \bibliogrphy 指令来引入,编译过程中自然会去参考这 个外部考文献数据库。他的使用情形如下(以 your.bib 为例): ... \begin{document} \bibliographystyle{plain} ... \bibliography{your.bib} % *.bib 延伸档名可以省略 % 指定 style 档 ... \end{document} 编译过程: latex example bibtex example latex example 11.4.3.1 *.bib 档的格式 *.bib 档的格式自成一格,和写在原来文稿里头的不同,视数据的性质,要把他标明出来,例如书籍类是 @book 来开头,期刊文章使 用 @article 来起头,我们来看一个例子: @book{ KDEt, author year title publisher address volumn edition = "Knuth, Donald E.", = "1989", = "The {\TeX}book", = "Addison-Wesley", = "Reading, Massachusetts", = " ", = " ", month series note } = " ", = " ", = " ", @article{ somekey, author year title journal volumn number pages month note } 每行后的逗点是必要的,名字的话 Knuth, Donald E. 或 Donald E. Knuth 这两种方式,bibtex 都能认得,但姓摆在前面的时候其 后要加个逗点,如果是两位以上的作者时要以 and 来连接。虽然可以使用 LaTeX 的语法,这时他整个要由大括号括起来,而且,批 注符号 % 不被接受。红色的项目是必要的项目,其他项目可以列进去,也可以省略,要加进去的话,则以 空出来,这样以后有这方 面的数据时再填进去。 = "Someone", = "2004", = "The {\TeX} Journal", = "SayYa-Publisher", = " ", = " ", = " ", = " ", = " ", 显现的形式是受 *.bst 格式档在控制的,所以,不必要的标点符号不要自行加进去,书名的字体显示也无需加进去。 引用的方式同样是使用 \cite 指令,一般只要要引用到的数据才会印出来,如果要全部 *.bib 里头的数据都印出来的话,可以加个 \nocite{*} 指令。 在使用中文的情形下, bibtex 程序认不得中文, CJK 环境下编译会出问题, 在 我们可以先编辑一个 *.cbib 档, 然后再使用 bg5conv 来把他转成 *.bib 档: bg5conv < some.cbib > some.bib 这样,在文稿里头引入 some.bib 就可以了。 11.4.3.2 格式档 BibTeX 的格式档是 *.bst(bibliography style),我们上面所引用的是 plain 其实就是引用 plain.bst 这个格式档,这是最基本 的格式,在编译时期会依这个格式档来印出参考文献的显现形式。其他尚有: plain 依字母的顺序印出,比较顺序为 author, year, title unsrt 依引用的先后次序印出 abbrv 与 plain 相同,但 first name, month, title, journal 以缩写印出 alpha 引用处显示 [作者年份] 来取代数目字。 已经有许多人发表过特定的格式档,但这些对于中文则无法完全合乎我们的使用习惯,例如标点符号及书名号,但我们可以去更改他 们的格式,这方面的数据请参考系统上的 btxdoc.dvi 及 btxhak.dvi 这两个说明档。 这也算是目前的一个值得去研究的空间, 尤其是中文及 Unciode 编码文件索引、 排序及排版的问题, 这在英文语系算是比较容易解决, 都有现成的格式范例可以运用,但中文就比较缺乏这方面的范例。在吴聪敏教授的《cwTeX 排版系统》[5] 一书里头,有对这方面做 过努力,使用的是外部程序工具 cwbibtex,再和 cw.bst 格式档配合的话,有不错的结果。 11.5 附录(Appendix) 排版附录使用的是 \appendix 指令,这个指令以后和正常一般编辑即可,不同的附录以 \chapter 来区隔,但印出来的时候会标上大 写字母,而不是原来的 Chapter 字样。也是可以有 \section 指令,这资了大写英文字母外,会紧接着附上阿拉伯数字,例如 A.1、 B.2 等等。 11.5.1 改变附录的标题 在英文环境,附录是以 Appendix 为标题来开始的,在中文环境下我们要把他改成中文: \renewcommand\appendixname{附~录} article 类别的文稿并不印出 Appendix 字样,因此也就没有 appendixname 来更改。 11.6 大型文稿的维护 通常我们写一篇文章, 大概都是一个文稿写到底, 但如果超过一百页的文稿的时候, 维护起来会比较困难, 所以 LaTeX 提供了 \input 及 \include 指令来将外部档案引进来,当做是文稿的一部份来编译,这样就可以按章节来把文稿分开处理、维护。 他们的使用方法很简单,一个是含主要正常结构的主文件,其他的则没有 preamble 区,只有本文区,就是按照一般文稿中的章节的 部份来书写就可以了。以这一篇文件的例子来说,他的主档是 latex123.tex,主要的内容如下: \documentclass[12pt,a4paper]{report} ... 这里是 preamble 区的内容 ... \begin{document} \begin{CJK}{Bg5}{hwmm} ... % \input{story} \input{preparation} \input{syntax} \input{start} \input{space} \input{class} \input{package} \input{table} \input{graphic} \input{math} \input{abook} \input{theend} \input{fdl} ... \end{CJK} \end{document} 这里分成两段来处理是因为要使用 bg5latex 来编译文稿,但 latex2html 本身已经可以处理未经前置处理的 LaTeX 中文文稿,所以 分成两个部份来分别处理。\input{} 里头的案名,如果没有加附档名的话,预设他的延伸档名是 *.tex。CJK package 另外提供了 \CJKinput 及 \CJKinclude 两个指令,也可以用来引入中文文稿。 11.6.1 input 和 include 的差异 这两个指令都可以用来引进外部文稿,但有一些细节不一样。\input 的情形,他可以另外指定延伸档名,\include 则不行,他一定 要是 *.tex 的延伸档名。 在引入的时候 \include 会起新页, \input 则不一定, 要视文稿类别而定。 最重要的差异在于 \include 可 以在 preamble 区和 \includeonly{} 指令配合,这样就不必每次都要编译整份文稿,只编译新文稿就可以了,页数、参照还是会正 确显示,这在排版大型书籍的时候就很好用了。 11.7 裁切记号(crop marks) 裁切记号是用在排版完成,送印后会有个标记符号,让印刷厂可以跟据这些标记符号来做截切、剪裁的工作。LaTeX 本身并没有内建 这种功能,这得和 crop package 来配合。 由于个人也并没有这方面的实际经验,因此这里不多做说明,请自行参考 crop 宏套件的说明。 【次页】: 12. 后记 【标题页】: latex123 【前页】: 10. 数学排版 目录 索引 Compiled by Edward G.J. Lee (2004-03-07)