我有一份龐大的文檔,其中有一個單獨的日期索引(實際上只有特定事件的年份或年份範圍)。我在用著memoir
。
有時年份是已知的
\index[dates]{1875!Event xyz}
有時年份是一個範圍
\index[dates]{1822--1867!Event abc}
這些在索引中排序為
1822-1897
事件 xxxx 77,87
事件 pppp 731829-1844
事件 zzz 791756
事件 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 的情況下運行它,或在此範例中執行這三行(pdflatex
也xelatex
可以立即使用,因為字體相關的套件尚未啟動):
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}