数字をインデックスするインデックスソート

数字をインデックスするインデックスソート

膨大な文書があり、そこには日付の個別のインデックス(実際には特定のイベントの年または年の範囲のみ)があります。 を使用しています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}}}

そのため、マクロを 1 回変更するだけで、数千のエントリをすべて手動で編集して並べ替え順序を設定する必要なく、目的を達成できる可能性があります。

この問題で行き詰まってしまいました。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}}

ソートキーは の前のエントリです@。年の範囲のソートキーは、2 つの 4 桁の年だけです。年の場合、ソートキーは 4 桁の年で、その後に 4 つのゼロが続き、すべての数値ソートキーの 8 桁を埋めます。

あるいは、ソート キーに数字以外の文字を追加することもできます。その場合、エントリは語彙順にソートされます。4 桁の年の場合、数値の順序は実際には必要ありません。

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

答え2

ジンディマージとソートのルールのおかげで、このようなケースにはすでに対応できます。サンプルと最後のページのプレビューを同封します。シェル エスケープをオンにして実行するか、このサンプルで次の 3 行を実行してください (フォント関連のパッケージはまだアクティブ化されていないため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}

ムウェ

関連情報