LaTeX/索引
索引在印刷书籍中尤为有用,它是一个按字母顺序排列的单词和表达式的列表,以及它们在书中出现的页面。LaTeX 使用其包 makeidx 及其支持程序 makeindex
(在某些系统上称为 makeidx
)支持创建索引。
要启用 LaTeX 的索引功能,必须在 前言 中使用以下命令加载 makeidx 包:
\usepackage{makeidx}
|
并将特殊的索引命令通过以下命令启用:
\makeindex
|
此命令应放在前言中,因为它告诉 LaTeX 创建索引所需的必要文件。要告诉 LaTeX 要索引的内容,请使用
\index{key}
|
其中 key 是索引条目,不会出现在最终布局中。您可以在要将文本引用到索引的文本位置输入索引命令,通常是在导致 key 的原因附近。例如,文本
To solve various problems in physics, it can be advantageous
to express any arbitrary piecewise-smooth function as a
Fourier Series composed of multiples of sine and cosine functions.
|
可以改写为
To solve various problems in physics, it can be advantageous
to express any arbitrary piecewise-smooth function as a Fourier Series
\index{Fourier Series}
composed of multiples of sine and cosine functions.
|
以创建一个名为“傅里叶级数”的条目,并引用目标页面。在不同页面上对使用相同 key 的 \index 的多次使用会将这些目标页面添加到相同的索引条目中。
要显示文档中的索引,只需使用以下命令
\printindex
|
通常将其放在文档末尾。默认索引格式为两列。
与 LaTeX 捆绑在一起的 showidx 包会在文本的右侧边距处打印出所有索引条目。这对于校对文档并验证索引非常有用。
当用 LaTeX 处理输入文件时,每个 \index
命令会将一个适当的索引条目及其当前页码写入一个特殊文件。该文件与 LaTeX 输入文件具有相同的名称,但扩展名不同 (.idx
)。然后可以使用 makeindex
程序处理此 .idx
文件。在命令行中键入
makeindex filename
请注意,filename 不带扩展名:程序将查找 filename.idx 并使用它。您可以选择将 filename.idx 直接作为参数传递给程序。makeindex
程序会生成一个排序的索引,其基本文件名相同,但扩展名不同 (.ind
)。如果现在再次处理 LaTeX 输入文件,则此排序的索引将在 LaTeX 找到 \printindex
的位置被包含到文档中。
latex 使用默认选项创建的索引可能看起来不像您期望的那样美观或合适。要改善索引的外观,makeindex
附带了一组样式文件,通常位于 tex 目录结构的某个位置,通常位于 makeindex
子目录之下。要告诉makeindex使用特定的样式文件,使用以下命令行选项运行它:
makeindex -s [style file] filename
如果您使用 GUI 编译 latex 和索引文件,您可能需要在选项中设置此选项。以下是一些典型工具的配置提示
假设您要添加一个名为 simpleidx.ist
的索引样式文件
- Texify/PDFTexify:选项→执行模式→附件→PDFTeXify,添加到开关:
--mkidx-option="-s simpleidx.ist"
- 仅 MakeIndex:选项→执行模式→附件→MakeIndex,添加到命令行:
-s simpleidx.ist
以下是一些 \index
条目的示例
示例 | 索引条目 | 注释 |
---|---|---|
\index{hello}
|
hello, 1 | 普通条目 |
\index{hello!Peter}
|
Peter, 3 | 'hello' 下的子条目 |
\index{hello!Sam@\textsl{Sam}}
|
Sam, 2 | 格式化和排序的子条目 |
\index{Sam@\textsl{Sam}}
|
Sam, 2 | 格式化条目 |
\index{Lin@\textbf{Lin}}
|
Lin, 7 | 与上面相同 |
\index{Jenny|textbf}
|
Jenny, 3 | 格式化的页码 |
\index{Joe|textit}
|
Joe, 5 | 与上面相同 |
\index{ecole@\'ecole}
|
école, 4 | 处理重音符号 |
\index{Peter|see {hello}}
|
Peter, 参见 hello | 交叉引用 |
\index{Greeting|see {hello, Peter}}
|
Greeting, 参见 hello, Peter | 交叉引用子条目 |
\index{Jen|seealso{Jenny}}
|
Jen, 另请参见 Jenny | 与上面相同 |
如果某个条目有小节,可以使用 !
将其分隔开。例如,
\index{encodings!input!cp850}
|
将创建一个索引条目,其中 “cp850” 分类在 “input” 下(“input” 本身分类在 “encodings” 下)。在 makeidx 术语中,这些被称为子子条目和子条目。
为了确定索引键的排序方式,请使用 @
作为分隔符,在键之前放置一个要排序的值。如果存在任何格式或数学模式,这将很有用,因此一个示例可能是
\index{F@$\vec{F}$}
|
以便索引中的条目显示为“”,但排序为“F”。
为了与上述子条目功能结合使用,您应该对适当的组件进行样式设置。
\index{bug reports!In re code@\emph{In re} code}
\index{LaTeX@\LaTeX!Typesetting engine}
|
要更改页码的格式,请在页码后面附加一个|
和一个执行格式设置的命令名称。此命令应只接受一个参数。
例如,如果在一本书的第 3 页上你介绍了牛头犬,并包含了以下命令
\index{bulldog}
|
并且在同一本书的第 10 页上,您希望用粗体页码显示牛头犬的主要部分,请使用
\index{bulldog|textbf}
|
这将在索引中显示为牛头犬,3,10
如果您使用texindy
代替makeindex
,则分类条目也将被排序,这样所有加粗的条目默认情况下都将排在所有其他条目之前。
要执行多页索引,请在 \index
命令的末尾添加一个|(
和 |)
,如下所示
\index{Quantum Mechanics!History|(}
In 1901, Max Planck released his theory of radiation dependent on quantized energy.
While this explained the ultraviolet catastrophe in the spectrum of
blackbody radiation, this had far larger consequences as the beginnings of quantum mechanics.
...
\index{Quantum Mechanics!History|)}
|
子条目“历史”的索引条目将是两个 \index
命令之间的页码范围。
为了在索引中放置带 !
、@
或 |
的值,这些值通常是转义字符,必须在 \index
命令中使用双引号 ("
) 对这些字符进行引用,并且只能通过引用来放置 "
在索引中(即,“ 的键将是 \index{""}
)。
此规则不适用于 \", 因此要将字母 ä 放入索引,您仍然可以使用 \index{a@\"{a}}
。
您可以使用 nomencl [1] 包创建缩略语列表。您可能还希望使用 术语表 章中介绍的 glossaries 包。另一个选择是 acronym [2] 包。
要启用 LaTeX 的命名法功能,必须在序言中使用以下命令加载 nomencl 包
\usepackage[⟨options ⟩]{nomencl}
\makenomenclature
|
对要包含在命名法列表中的每个符号执行 \nomenclature[⟨prefix⟩]{⟨symbol⟩}{⟨description⟩}
命令。此命令的最佳位置是在您首次介绍该符号后立即执行。将 \printnomenclature
放置在您希望显示命名法列表的位置。
运行 LaTeX 2 次,然后
makeindex filename.nlo -s nomencl.ist -o filename.nls
再次运行 LaTeX。
要将缩略语列表添加到目录中,在声明 nomencl 包时可以使用 intoc 选项,即
\usepackage[intoc]{nomencl}
|
而不是使用 将索引添加到目录 部分中的代码。
可以使用以下命令更改列表的标题
\renewcommand{\nomname}{List of Abbreviations}
|
如果您需要多个索引,可以使用多种选项。
imakeidx 包是 TeX Live 和 MiKTeX 的一部分。
它是 makeidx 的扩展,允许创建除默认索引之外的其他索引或代替默认索引。它具有许多选项和命令来操纵生成的输出。
索引通过多次调用 \makeindex
命令来定义,每个命令都可以有自己的选项。特定索引的条目通过在 \index
命令中添加索引名称作为可选参数来给出。
\usepackage{imakeidx}
...
\makeindex[title=Concept index] % Create the default index
\makeindex[name=persons,title=Index of names,columns=3] % Create an index named 'persons'
...
\begin{document}
...
...relativity\index{relativity}... % Add an item to the default index
...
... Einstein\index[persons]{Einstein, Albert}... % Add an item to the 'persons' index
...
And this is the end of the story.
\printindex % Ouput the default index here
\indexprologue{\small In this index you’ll find only famous people’s names}
\printindex[persons] % Output the 'persons' index
\end{document}
|
两个索引的条目应按上述方式键入。此示例将生成两个索引。默认索引将被赋予标题“概念索引”,并以默认的两列格式排版。序言文本将仅在“人员”索引中打印,该索引将具有标题“姓名索引”,并以三列格式排版。
每个索引的其他选项允许您确定索引标题是否以及如何出现在目录中,使用哪个样式文件,设置页眉等等。
无需从命令行显式调用 makeindex
程序。与目录生成类似,索引将通过简单地运行 LaTeX 来生成。可以使用选项来使用 xindy
程序代替 makeindex
。
请注意,imakeidx 可以直接处理为 MakeIndex
编写的任何 TeX 源文件。如果您有一个现有的源文件,并且想要拆分现有的索引或添加额外的索引,只需在 \usepackage{...}
命令中将 makeidx
更改为 imakeidx
,输出将相同。然后,您可以添加命令和选项来创建多个索引。
还提供 multind [3]。
此包提供了与 makeidx 相同的命令,但现在您还必须将名称作为第一个参数传递给每个命令。
\usepackage{multind}
\makeindex{books}
\makeindex{authors}
...
\index{books}{A book to index}
\index{authors}{Put this author in the index}
...
\printindex{books}{The Books index}
\printindex{authors}{The Authors index}
|
默认情况下,索引不会显示在目录中,因此您必须手动添加它。
要将索引添加为一章,请使用以下命令
\clearpage
\addcontentsline{toc}{chapter}{Index}
\printindex
|
如果您使用 book 类,您可能希望通过使用 \cleardoublepage
将其从奇数页开始。
如果您想对包含国际字符(如 ő、ą、ó、ç 等)的条目进行排序,您可能会发现排序“不完全正确”。在大多数情况下,字符被视为特殊字符,并最终与 @、¶ 或 µ 放在同一个组中。在大多数使用拉丁字母的语言中,这不是正确的。
以下部分描述了 xindy
,但请注意,此程序目前已过时,并且存在新的替代方案,如 upmendex
和 xindex
。
不幸的是,当前版本的 xindy
和 hyperref 不兼容。当您使用 textbf 或 textit 修饰符时,texindy
将打印错误消息:unknown cross-reference-class `hyperindexformat'! (ignored)
并且不会将这些页面添加到索引中。此错误的解决方法在 讨论页面 上有所描述。
要生成国际索引文件,您必须使用 texindy
而不是 makeindex
。
xindy 是一个比 makeindex
系统更具可扩展性和鲁棒性的索引系统。
例如,您不需要编写
\index{Lin@\textbf{Lin}}
|
来获取Lin条目后LAN并且之前LZA,相反,只需编写
\index{\textbf{Lin}}
|
但更重要的是,它可以正确地对许多语言的索引文件进行排序,而不仅仅是英语。
不幸的是,生成可以使用LaTeX使用 xindy
的索引比使用 makeindex
稍微复杂一些。
首先,我们需要知道.tex项目文件保存的编码方式。在大多数情况下,它将是 UTF-8 或 ISO-8859-1,但如果您住在波兰等国家,它可能是 ISO-8859-2 或 CP-1250。检查 inputenc
包的参数。
首先,我们需要知道文档中主要使用的语言是什么。xindy可以原生排序阿尔巴尼亚语、白俄罗斯语、保加利亚语、克罗地亚语、捷克语、丹麦语、荷兰语、英语、世界语、爱沙尼亚语、芬兰语、法语、格鲁吉亚语、德语、希腊语、吉普赛语、豪萨语、希伯来语、匈牙利语、冰岛语、意大利语、克林贡语、库尔德语、拉丁语、拉脱维亚语、立陶宛语、马其顿语、蒙古语、挪威语、波兰语、葡萄牙语、罗马尼亚语、俄语、塞尔维亚语斯洛伐克语、斯洛文尼亚语、索布语、西班牙语、瑞典语、土耳其语、乌克兰语和越南语的索引。
我不知道其他语言是否有类似的问题,但对于波兰语来说,如果你的 .tex
文件使用 UTF-8 编码保存,而你只使用 -L polish
参数,texindy
生成的 .ind
文件将使用 ISO-8859-2 编码。虽然这对于包含波兰字母的条目没有问题,因为 LaTeX 在内部将所有字母编码为纯 ASCII,但对于单词开头的带重音字母,则会出现问题,因为它们会创建新的索引条目组。例如,如果你有一个 "średnia" 条目,你将在 ISO-8859-2 编码的 .ind
文件中得到一个 "Ś"。 LaTeX 不喜欢文件的一部分使用 UTF-8 编码,而另一部分使用 ISO-8859-2 编码。显而易见的解决方案(添加 -C utf8
)不起作用,texindy
会停止并提示
ERROR: Could not find file "tex/inputenc/utf8.xdy"
错误。为了解决这个问题,你必须使用 -M 开关
加载标题的定义样式。
-M lang/polish/utf8
最后,你需要运行以下命令:
texindy -L polish -M lang/polish/utf8 filename.idx
另一种解决此问题的方法是使用 "iconv" 将 latin2.xdy 转换为 utf8.xdy。
iconv -f latin2 -t utf8 latin2.xdy >utf8.xdy
在目录
/usr/share/xindy/tex/inputenc
(你必须拥有 root 权限)
要在 kile 中使用 texindy
而不是 makeindex
,你必须重新定义设置 → 配置 Kile... → 工具 → 构建中的 MakeIndex 工具,或者定义新的工具并重新定义其他工具以使用它(例如,将其添加到快速构建中)。
xindy
定义应该类似于以下内容:
General: Command: texindy Options: -L polish -M lang/polish/utf8 -I latex '%S.idx' Advanced: Type: Run Outside of Kile Class: Compile Source extension: idx Target extension: ind Target file: <empty> Relative dir: <empty> State: Editor Menu: Add tool to Build menu: Compile Icon: the one you like