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