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 731829-1844
Evento zzz 791756
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 ( pdflatex
y xelatex
tambié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}