對數字進行索引的索引排序

對數字進行索引的索引排序

我有一份龐大的文檔,其中有一個單獨的日期索引(實際上只有特定事件的年份或年份範圍)。我在用著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 一般 -C utf8 -M mal-style -o 日期.ind 日期.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}

姆韋

相關內容