Indexsortierung, bei der Zahlen indiziert werden

Indexsortierung, bei der Zahlen indiziert werden

Ich habe ein umfangreiches Dokument, in dem ich einen separaten Index für Datumsangaben habe (eigentlich nur das Jahr oder der Jahresbereich bestimmter Ereignisse). Ich verwende memoir.

Manchmal ist das Jahr genau bekannt

\index[dates]{1875!Event xyz}

Manchmal ist das Jahr ein Bereich

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

Diese werden im Index sortiert als

1822-1897
Ereignis xxxx 77,87
Ereignis pppp 73

1829-1844
Ereignis zzz 79

1756
Ereignis xxx2 99

Mit anderen Worten, Datumsbereiche werden alphabetisch sortiert und von den einzelnen numerischen Einträgen getrennt, die numerisch sortiert werden, was eine ungerade Reihenfolge ergibt. Gibt es eine Möglichkeit, Zahlen alphabetisch und nicht numerisch zu sortieren, sodass ich eine Reihenfolge erhalte?

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

statt

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

Die Indexeinträge werden über ein Makro

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

Eine einzige Änderung am Makro kann daher möglicherweise mein gewünschtes Ergebnis erzielen, ohne dass ich jeden einzelnen der mehreren Tausend Einträge manuell bearbeiten muss, um eine Sortierreihenfolge festzulegen.

Ich bin hier auf ein Hindernis gestoßen. Ich glaube nicht, dass ein MWE hier von zusätzlichem Nutzen wäre, aber ich poste gerne eines.

Antwort1

Makeindex sortiert Zahlen in numerischer Reihenfolge:

1
9
10

Bereiche sind jedoch keine Zahlen. Das Bereichssymbol --verhindert, dass Makeindex einen solchen Eintrag als Zahl annimmt. Diese Einträge werden in lexikalischer Reihenfolge sortiert. Außerdem stehen sie vor den Zahlen.

Sie können einen Sortierschlüssel für Makeindex angeben. Wenn der Sortierschlüssel eine Zahl ist, sollte die Anzahl der Ziffern für Jahre und Jahresbereiche gleich sein, z. B.:

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

Der Sortierschlüssel ist der Eintrag vor @. Der Sortierschlüssel eines Jahresbereichs sind nur die beiden vierstelligen Jahreszahlen. Im Fall eines Jahres ist der Sortierschlüssel die vierstellige Jahreszahl, gefolgt von vier Nullen, um die acht Ziffern für alle numerischen Sortierschlüssel aufzufüllen.

Alternativ kann dem Sortierschlüssel eine Nicht-Ziffer hinzugefügt werden, dann werden die Einträge in lexikalischer Reihenfolge sortiert, bei vierstelligen Jahreszahlen ist die numerische Reihenfolge nicht wirklich erforderlich:

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

Antwort2

Xindyist dank Zusammenführungs- und Sortierregeln bereits für solche Fälle bereit. Ich füge ein Beispiel und eine Vorschau der letzten Seite bei. Bitte führen Sie es mit aktiviertem Shell-Escape aus oder führen Sie diese drei Zeilen in diesem Beispiel aus ( pdflatexund xelatexkann auch sofort verwendet werden, da die Schriftartpakete noch nicht aktiviert sind):

lualatex mal-xindy-numbers.tex
xindy -M texindy -L allgemein -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}

mwe

verwandte Informationen