Classificação de índice onde os números são indexados

Classificação de índice onde os números são indexados

Eu tenho um vasto documento onde tenho um índice separado de datas (na verdade, apenas o ano ou intervalo de anos de eventos específicos). Estou a usar memoir.

Às vezes o ano é conhecido exatamente

\index[dates]{1875!Event xyz}

Às vezes o ano é um intervalo

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

Eles são classificados no índice como

1822-1897
Evento xxxx 77,87
Evento pppp 73

1829-1844
Evento zzz 79

Evento 1756
xxx2 99

Em outras palavras, os intervalos de datas são classificados em ordem alfabética e são separados das entradas numéricas únicas que são classificadas numericamente, produzindo uma ordem ímpar. Existe alguma maneira de ordenar os números em ordem alfabética e não numérica, para que eu possa ordenar

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

em vez de

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

As entradas do índice são feitas por meio de uma macro

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

E assim, uma única alteração na macro pode alcançar o que desejo, sem ter que editar manualmente cada uma das milhares de entradas para impor uma ordem de classificação.

Eu encontrei um obstáculo neste caso. Não acho que um MWE seria útil aqui, mas fico feliz em postar um.

Responder1

Makeindex classifica os números em ordem numérica:

1
9
10

No entanto, os intervalos não são números. O símbolo de intervalo --impede que o Makeindex considere tal entrada como número. Essas entradas são classificadas em ordem lexical. Também eles precedem os números.

Você pode especificar uma chave de classificação para Makeindex. Se a chave de classificação for um número, o número de dígitos deverá ser o mesmo para anos e intervalos de anos, por exemplo:

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

A sortkey é a entrada anterior @. A chave de classificação de um intervalo de anos são apenas os dois anos de quatro dígitos. No caso de um ano, a chave de classificação é o ano de quatro dígitos, seguido por quatro zeros para preencher os oito dígitos de todas as chaves de classificação numéricas.

Alternativamente, a chave de classificação pode adicionar um não dígito, então as entradas são classificadas em ordem lexical, com anos de quatro dígitos, a ordem numérica não é realmente necessária:

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

Responder2

Xindyjá está pronto para esses casos graças às regras de mesclagem e classificação. Anexo um exemplo e uma prévia da última página. Por favor, execute-o com shell escape ativado ou execute estas três linhas neste exemplo ( pdflatexe xelatextambém pode ser usado imediatamente, pois os pacotes relacionados a fontes ainda não estão ativados):

lualatex mal-xindy-numbers.tex
xindy -M texindy -L geral -C utf8 -M estilo mal -o datas.ind datas.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}

eu

informação relacionada