Сортировка индекса, где числа индексируются

Сортировка индекса, где числа индексируются

У меня есть большой документ, в котором есть отдельный индекс дат (на самом деле только год или диапазон лет определенных событий). Я использую 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 или запустите эти три строки в этом примере ( pdflatexи xelatexих можно использовать сразу, так как пакеты, связанные со шрифтами, еще не активированы):

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}

мве

Связанный контент