Clasificación de índice donde se indexan los números

Clasificación de índice donde se indexan los números

Tengo un documento extenso donde tengo un índice de fechas separado (en realidad, solo el año o el rango de años de eventos particulares). Estoy usando memoir.

A veces se sabe exactamente el año.

\index[dates]{1875!Event xyz}

A veces el año es un rango

\index[dates]{1822--1867!Event abc}

Estos se clasifican en índice como

1822-1897
Evento xxxx 77,87
Evento pppp 73

1829-1844
Evento zzz 79

1756
Evento xxx2 99

En otras palabras, los rangos de fechas se ordenan alfabéticamente y se separan de las entradas numéricas individuales que se clasifican numéricamente dando un orden impar. ¿Hay alguna forma de ordenar los números alfabéticamente y no numéricamente para poder realizar pedidos?

1
1--5
2
3
3--5
4

en vez de

1--5
3--5
1
2
3
4

Las entradas del índice se realizan a través de una macro.

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

Y así, un solo cambio en la macro podría lograr lo que quiero sin tener que editar manualmente cada una de las miles de entradas para imponer un orden de clasificación.

Me encontré con un obstáculo en este caso. No creo que un MWE sea de utilidad adicional aquí, pero estoy feliz de publicar uno.

Respuesta1

Makeindex ordena los números en orden numérico:

1
9
10

Sin embargo, los rangos no son números. El símbolo de rango --impide que Makeindex tome dicha entrada como número. Estas entradas están ordenadas en orden léxico. También preceden a los números.

Puede especificar una clave de clasificación para Makeindex. Si la clave de clasificación es un número, entonces el número de dígitos debe ser el mismo para años y rangos de años, por ejemplo:

\newcommand{\indexdate}[2]{#1\index[dates]{#10000@#1!#2}}
\newcommand{\indexdaterange}[3]{#1--#2\index[dates]{#1#2@#1--#2!#3}}

La clave de clasificación es la entrada anterior @. La clave de clasificación de un rango de años son solo los dos años de cuatro dígitos. En el caso de un año, la clave de clasificación es el año de cuatro dígitos, seguido de cuatro ceros para completar los ocho dígitos de todas las claves de clasificación numéricas.

Alternativamente, la clave de clasificación puede agregar un dígito que no sea un dígito, luego las entradas se ordenan en orden léxico, con años de cuatro dígitos, el orden numérico no es realmente necesario:

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

Respuesta2

Xindyya está preparado para estos casos gracias a las reglas de fusión y clasificación. Adjunto un ejemplo y una vista previa de la última página. Ejecútelo con Shell escape activado o ejecute estas tres líneas en este ejemplo ( pdflatexy xelatextambién se pueden usar de inmediato ya que los paquetes relacionados con fuentes aún no están activados):

lualatex mal-xindy-numbers.tex
xindy -M texindy -L general -C utf8 -M mal-style -o fechas.ind fechas.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}

mwe

información relacionada