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 731829-1844
Ereignis zzz 791756
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 ( pdflatex
und xelatex
kann 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}