使用 makeindex 对复合页码进行正确排序

使用 makeindex 对复合页码进行正确排序

运行索引文件

\indexentry{foo}{1}
\indexentry{foo}{i}
\indexentry{foo}{a}

通过makeindex结果生成一个可包含的输出文件,例如

\begin{theindex}

  \item foo, i, 1, a

\end{theindex}

显然,i被认为是一个罗马数字,这通常是正确的。

但是,当页码为复合页时,如

\indexentry{foo}{1.7}
\indexentry{foo}{i.8}
\indexentry{foo}{a.9}

带有样式文件

page_compositor "."

我得到的输出

\begin{theindex}

  \item foo, 1.7, a.9, i.8

\end{theindex}

现在,i被认为是一封信,这在我的用例中是错误的。

有没有办法辨别makeindex一个字母是罗马数字,特别是在上述复合字母中?

答案1

我以为有一面标志可以强制i成为罗马,但是现在我没有看到它,所以......

如果你将idx文件排列成如下形式

\indexentry{foo|zz}{1.1.7}
\indexentry{foo|zz}{0.1.8}
\indexentry{foo|zz}{0.4.8}
\indexentry{foo|zz}{0.5.8}
\indexentry{foo|zz}{1.a.9}

0.在罗马首页和其余页面中添加额外的前缀组件,1.并使用阿拉伯数字书写所有页面,然后makeindex正确排序并生成

\begin{theindex}

  \item foo, \zz{0.1.8}, \zz{0.4.8}, \zz{0.5.8}, \zz{1.1.7}, \zz{1.a.9}

\end{theindex}

然后你只需要定义\zz就可以了,丢弃每个数字的第一个部分,但如果第一个部分是 0,则使用第二个部分的罗马形式

\def\zz#1{\zzz#1}
\def\zzz#1.#2.{\ifnum#1=0 \romannumeral\fi#2\relax}

答案2

由于我找不到规则的详细描述,所以我查看了 的源代码。函数makeindex中应用的启发式方法如下:i、v、x、l、c、d、m 中没有跟 a (如样式文件中所设置)的单个字母是罗马数字,以及两个或多个罗马数字的字符串。因此“vi.1”和“Ai”包含罗马数字,而“i.1”不包含。scanid.cint scan_no(char no[], short npg[], short *count, short *type)page_compositormakeindex

还可以看到,字母页面标签被限制为一个字母,这意味着页面标签“ij”无效,而“ji”和“jj”被接受并被视为相同。有趣的是,“ji.1”和“jj.2”也被视为相同,但“j.1”和“j.2”则不是。这只是切换到xindy基于索引的解决方案的另一个原因。

所有这些都是硬编码到的makeindex,这意味着人们可以修改源本身,使用,或者诉诸于像DavidCarlisle的解决方案这样的东西,当间接使用索引命令(例如通过包)时,xindy这很痛苦。\@empty\relaxglossaries

相关内容