使用 makeidx

在打印书籍中,索引是按字母顺序排列的单词和短语列表,列出了它们所在的页码。LaTeX通过其 makeidx 包以及支持程序 makeindex(某些系统上被称为 makeidx)支持创建索引。

启用索引功能

要启用 LaTeX 的索引功能,必须在导言区加载 makeidx 包:

\usepackage{makeidx}

然后,通过在输入文件的导言区放置以下命令来启用特殊的索引命令:

\makeindex

这应该放在导言区,因为它告诉 LaTeX 创建索引所需的文件。要告诉 LaTeX 索引哪些内容,使用如下命令:

\index{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.

这将在索引中创建一个名为“Fourier Series”的条目,并指向目标页面。在不同页面上多次使用相同的 \index 命令会将这些目标页面添加到同一索引条目中。

显示索引

要在文档中显示索引,只需使用命令:

\printindex

通常将其放置在文档的末尾。默认情况下,索引的格式是两列。

showidx

LaTeX 附带的 showidx 包会将所有索引条目打印在文本的右侧边距中。这对于校对文档并验证索引非常有用。


编译索引

当使用 LaTeX 处理输入文件时,每个 \index 命令会将相应的索引条目和当前页码写入一个特殊文件。该文件与 LaTeX 输入文件同名,但扩展名不同(.idx)。然后,可以使用 makeindex 程序处理此 .idx 文件。在命令行中输入:

makeindex filename

注意,filename 是没有扩展名的:程序将查找 filename.idx 并使用它。您也可以选择将 filename.idx 直接作为参数传递给程序。makeindex 程序生成一个已排序的索引,使用相同的基本文件名,但这次扩展名为 .ind。如果现在再次处理 LaTeX 输入文件,已排序的索引会被包含在文档中,并显示在 LaTeX 找到 \printindex 的位置。


改进索引外观

默认选项生成的索引可能不如您希望的那样美观或合适。为了改善索引的外观,makeindex 附带了一些样式文件,通常位于 tex 目录结构的某个位置,通常位于 makeindex 子目录下。要告诉 makeindex 使用特定的样式文件,可以使用以下命令行选项:

makeindex -s [style file] filename

如果您使用的是图形用户界面编译 LaTeX 和索引文件,您可能需要在选项中设置这个参数。以下是一些常用工具的配置提示:


WinEdt 中的 MakeIndex 设置

假设您想要添加一个名为 simpleidx.ist 的索引样式文件:

  • Texify/PDFTexify: 在菜单中选择 Options→Execution Modes→Accessories→PDFTeXify,然后在 Switches 中添加 --mkidx-option="-s simpleidx.ist"

  • MakeIndex: 在菜单中选择 Options→Execution Modes→Accessories→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, see hello
\index{Greeting see {hello, Peter}} Greeting, see hello, Peter
\index{Jen seealso{Jenny}} Jen, see also Jenny

子条目

如果某个条目有子部分,这些子部分可以通过 ! 来标记。例如:

\index{encodings!input!cp850}

这将在索引中创建条目 'cp850',并将其归类到 'input' 下('input' 本身归类于 'encodings')。这些在 makeidx 中被称为子子条目和子条目。

控制排序

为了确定索引键的排序方式,可以在键之前添加一个值,用 @ 作为分隔符。这在有格式化或数学模式的情况下很有用。例如:

\index{F@$\vec{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}

这将出现在索引中,显示为 bulldog, 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|)}

这样,索引中的 'History' 子条目将显示为这两条 \index 命令之间的页码范围。

使用特殊字符

为了将 !@| 等字符放入索引中(这些字符在其他情况下是转义字符),必须在 \index 命令中将这些字符用双引号(")引起来,同时只能通过引号放置双引号(即,对于 ",键入 \index{""})。

此规则不适用于 \",因此,若要将字母 ä 放入索引中,可以使用:

\index{a@\"{a}}

缩写列表

你可以使用 nomencl 包创建缩写列表[1]。你还可以使用在《术语表》章节中描述的 glossaries 包,另一种选择是使用 acronym 包[2]。

要启用 LaTeX 的术语表功能,必须在导言区加载 nomencl 包:

\usepackage[⟨options ⟩]{nomencl}
\makenomenclature

对于每个要包括在术语表中的符号,使用命令:

\nomenclature[⟨prefix⟩]{⟨symbol⟩}{⟨description⟩}

该命令最好在第一次引入符号后立即使用。将 \printnomenclature 放置在你希望显示术语表的位置。

生成多重索引

运行 LaTeX 两次后,执行以下命令:

makeindex filename.nlo -s nomencl.ist -o filename.nls

然后再次运行 LaTeX。

如果你需要将缩写列表添加到目录中,可以在声明 nomencl 包时使用 intoc 选项,例如:

\usepackage[intoc]{nomencl}

这样就可以代替在“将索引添加到目录”部分中的代码。

要更改列表的标题,可以使用以下命令:

\renewcommand{\nomname}{List of Abbreviations}

多重索引

如果你需要多个索引,可以使用不同的选项。

imakeidx

imakeidx 包是 TeX Live 和 MiKTeX 的一部分。

这是 makeidx 的扩展,允许创建多个索引,而不仅仅是默认的一个。它有许多选项和命令来操作生成的输出。

使用多个调用 \makeindex 命令来定义索引,每个索引可以有自己的选项。为特定索引添加条目,通过将索引的名称作为可选参数添加到 \index 命令中。

\usepackage{imakeidx}
...
\makeindex[title=Concept index] % 创建默认索引
\makeindex[name=persons,title=Index of names,columns=3] % 创建一个名为 'persons' 的索引
...
\begin{document}
...
...relativity\index{relativity}... % 将项目添加到默认索引
...
... Einstein\index[persons]{Einstein, Albert}...  % 将项目添加到 'persons' 索引
...
这是故事的结束。

\printindex % 输出默认索引

\indexprologue{\small In this index you’ll find only famous people’s names}
\printindex[persons] % 输出 'persons' 索引
\end{document}

每个索引的条目应该按照上面的示例输入。这个例子将生成两个索引。默认索引将被命名为“Concept index”,并按默认的两列格式排版。前言文本只会在 'persons' 索引中打印,并且这个索引的标题是“Index of names”,将按三列格式排版。

每个索引的其他选项允许你决定索引标题是否以及如何出现在目录中,使用什么样式文件,设置页面头部等。

你不需要从命令行显式调用 makeindex 程序。与生成目录类似,索引将通过简单地运行 LaTeX 来生成。也可以选择使用 xindy 程序替代 makeindex

注意,imakeidx 可以直接处理为 MakeIndex 编写的任何 TeX 源文件。如果你有一个现有的源文件并想分割现有的索引或添加额外的索引,只需将 makeidx 更改为 imakeidx,并且输出将是相同的。然后,你可以添加命令和选项来创建多个索引。

multind

另一个可用的包是 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,但请注意,该程序当前已废弃,现有的新替代方案包括 upmendexxindex

生成索引

不幸的是,当前版本的 xindyhyperref 不兼容。当你使用 \textbf\textit 修饰符时,texindy 会打印错误息:unknown cross-reference-class 'hyperindexformat'! (ignored),并且不会将这些页面添加到索引中。一个解决这个 bug 的方法已经在讨论页中说明。

要生成国际化的索引文件,你必须使用 texindy 而不是 makeindex

xindy 是一个比 makeindex 更具扩展性和更强大的索引系统。

例如,不需要写:

\index{Lin@\textbf{Lin}}

即可获取 Lin 条目,按 LANLZA 排序,而只需写:

\index{\textbf{Lin}}

但更重要的是,xindy 可以正确地对多种语言的索引文件进行排序,而不仅仅是英语。

不幸的是,使用 xindy 为 LaTeX 生成索引比使用 makeindex 更复杂。

首先,我们需要知道 .tex 项目文件保存的编码方式。在大多数情况下,它会是 UTF-8 或 ISO-8859-1,尽管如果你住在波兰等地,它可能是 ISO-8859-2 或 CP-1250。检查 inputenc 包的参数。

其次,我们需要知道文档中使用的主要语言。xindy 本身可以对多种语言的索引进行排序,包括:

阿尔巴尼亚语、白俄罗斯语、保加利亚语、克罗地亚语、捷克语、丹麦语、荷兰语、英语、世界语、爱沙尼亚语、芬兰语、法语、格鲁吉亚语、德语、希腊语、吉普赛语、豪萨语、希伯来语、匈牙利语、冰岛语、意大利语、克林贡语、库尔德语、拉丁语、拉脱维亚语、立陶宛语、马其顿语、蒙古语、挪威语、波兰语、葡萄牙语、罗马尼亚语、俄语、塞尔维亚语、斯洛伐克语、斯洛文尼亚语、索宾语、西班牙语、瑞典语、土耳其语、乌克兰语、越南语。

我不确定其他语言是否也有类似问题,但以波兰语为例,如果你的 .tex 文件使用 UTF-8 保存,texindy 生成的 .ind 文件会编码为 ISO-8859-2(如果只使用 -L polish)。虽然这对包含波兰字母的条目没有问题,因为 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

解决方法的另一种方式是使用 iconvlatin2.xdy 创建 utf8.xdy

iconv -f latin2 -t utf8 latin2.xdy >utf8.xdy

在目录:

/usr/share/xindy/tex/inputenc

(你必须具有 root 权限)

xindy 在 Kile 中的使用

要在 Kile 中使用 texindy 替代 makeindex,你必须在设置 → 配置 Kile... → 工具 → 构建中重新定义 MakeIndex 工具,或者定义一个新的工具并重新定义其他工具以使用它(例如通过将其添加到 QuickBuild)。

xindy 的定义应该类似于:

一般设置:

命令: texindy
选项: -L polish -M lang/polish/utf8 -I latex '%S.idx'

高级设置:

类型: 在 Kile 外部运行
类: 编译
源扩展: idx
目标扩展: ind
目标文件: <空>
相对目录: <空>
状态: 编辑器
菜单:
将工具添加到构建菜单: 编译
图标: 你喜欢的那个

Last modified: Tuesday, 22 April 2025, 11:29 AM