按数字进行索引排序

按数字进行索引排序

我有一份庞大的文档,其中有单独的日期索引(实际上只有特定事件的年份或年份范围)。我正在使用memoir

有时确切的年份

\index[dates]{1875!Event xyz}

有时年份是一个范围

\index[dates]{1822--1867!Event abc}

这些在索引中排序为

1822-1897
事件 xxxx 77,87
事件 pppp 73

1829-1844
事件 zzz 79

1756
事件 xxx2 99

换句话说,日期范围按字母顺序排序,并与按数字排序的单个数字条目分开,产生奇数顺序。有什么方法可以让数字按字母顺序而不是按数字顺序排序,这样我就可以得到排序

1
1--5
2
3
3--5
4

而不是

1--5
3--5
1
2
3
4

索引条目通过宏

\newcommand{\indexdate}[2]{#1\index[dates]{#1!{#2}}}

因此,只需对宏进行简单更改即可实现我想要的效果,而无需手动编辑数千个条目中的每一个来强制进行排序。

我遇到了一个障碍。我不认为 MWE 在这里会有什么用处,但很高兴发布一个。

答案1

Makeindex 按数字顺序对数字进行排序:

1
9
10

但是范围不是数字。范围符号--阻止 Makeindex 将此类条目视为数字。这些条目按词汇顺序排序。它们也位于数字之前。

您可以为 Makeindex 指定排序键。如果排序键是数字,则年份和年份范围的位数应该相同,例如:

\newcommand{\indexdate}[2]{#1\index[dates]{#10000@#1!#2}}
\newcommand{\indexdaterange}[3]{#1--#2\index[dates]{#1#2@#1--#2!#3}}

排序键是@。年份范围的排序键只是两个四位数年份。对于年份,排序键是四位数年份,后跟四个零以填充所有数字排序键的八位数字。

或者,排序键可以添加非数字,然后按词汇顺序对条目进行排序,对于四位数的年份,数字顺序并不是真正需要的:

\newcommand{\indexdate}[2]{#1\index[dates]{#1x@#1!#2}}

答案2

辛迪由于合并和排序规则,已经为此类情况做好了准备。我附上了一个示例和最后一页的预览。请在启用 shell escape 的情况下运行它,或者在此示例上运行这三行(pdflatexxelatex可以立即使用,因为字体相关包尚未激活):

lualatex mal-xindy-numbers.tex
xindy -M texindy -L general -C utf8 -M mal-style -o dates.ind dates.idx
lualatex mal-xindy-numbers.tex

%! *latex mal-xindy-numbers.tex
%  with shell escape on
\documentclass{memoir}
%\usepackage{xltxtra} % use: inputenc (pdflatex), fontspec (xelatex)
\usepackage[hyperindex=false,colorlinks]{hyperref}
\usepackage[xindy]{imakeidx}
\indexsetup{firstpagestyle=empty}
\makeatletter\def\imki@progdefault{xindy}\makeatother
\makeindex[name=dates, title=Milestone events, options=-M texindy -L general -C utf8 -M mal-style]
\def\indexdate#1#2{#1\index[dates]{#1!#2}}
\usepackage{filecontents}
\begin{filecontents*}{mal-style.xdy}
(markup-locref :attr "default" :open "\hyperpage{" :close "}")
\end{filecontents*}

\begin{document}
\indexdate{1}{Event A}
\indexdate{1}{Event I}
\indexdate{1--5}{Event I}
\indexdate{1--5}{Event X}
\indexdate{1--5}{Event B}
\indexdate{2}{Event C}
\indexdate{3}{Event D}
\indexdate{3--5}{Event E}
\indexdate{4}{Event F}
\indexdate{1950}{Event G}
\indexdate{1950}{Event K}
\newpage
\indexdate{1950}{Event G}
\indexdate{1950}{Event K}
\indexdate{1950--1955}{Event G}
\indexdate{1948}{Event L}
\indexdate{1949--1951}{Event G}
\indexdate{1949--1950}{Event H}
\printindex[dates]
\end{document}

姆韦

相关内容