运行索引文件
\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.c
int scan_no(char no[], short npg[], short *count, short *type)
page_compositor
makeindex
还可以看到,字母页面标签被限制为一个字母,这意味着页面标签“ij”无效,而“ji”和“jj”被接受并被视为相同。有趣的是,“ji.1”和“jj.2”也被视为相同,但“j.1”和“j.2”则不是。这只是切换到xindy
基于索引的解决方案的另一个原因。
所有这些都是硬编码到的makeindex
,这意味着人们可以修改源本身,使用,或者诉诸于像DavidCarlisle的解决方案这样的东西,当间接使用索引命令(例如通过包)时,xindy
这很痛苦。\@empty\relax
glossaries