Aufwändige Lösung mit MakeIndex
makeindex
kann zwar bei den Seitenzahlen mit arabischen Zahlen, kleinen und großen römischen Zahlen und Klein- und Großbuchstaben umgehen, erwartet allerdings, dass bei Kombinationen davon ein Trennzeichen zwischen den unterschiedlichen Zahlenteilen steht. Dieses Trennzeichen kann im MakeIndex-Stil über die Variable page_compositer
eingestellt werden. Es sind alle Zeichen außer dem NUL-Zeichen erlaubt. Zeichen, die gleichzeitig als Ziffern verwendet werden können, sollten allerdings besser nicht verwendet werden.
Um zu erkennen, ob ein Zeichen Teil einer Zahl ist waren in früheren Versionen von makeindex
eine feste Reihenfolge eingestellt. Dabei wurden zunächst arabische Ziffern dann alle einzelnen Kleinbuchstaben erkannt. Bei mehreren Kleinbuchstaben wurde hingegen geprüft, ob beispielsweise mehrere i
aufeinander folgen oder auf das i
eine andere kleine römische Ziffer folgte. In dem Fall wurde auf eine römische Zahl erkannt. Dann fand für Großbuchstaben ein ähnlicher Test statt. Problematisch war dabei, dass einzelne römische Ziffern als Buchstaben erkannt und deshalb ggf. falsch einsortiert wurden. Seit einigen Versionen (AFAIK min. 2.12) wird die Reihenfolge, in der die Zahlen geprüft werden, jedoch über die Variable page_precedence
erkannt. Der dort angegebene String gibt die Erkennungsreihenfolge an:
r
– kleine römische Zahl
n
– arabische Zahl
a
– Kleinbuchstabe
R
– große römische Zahl
A
– Großbuchstabe
Die oben angegebene Reihenfolge ist gleichzeitig die normale Such-/Testreihenfolge.
Du hast also zwei Probleme.
- Da zwischen arabischer Zahl und Kleinbuchstabe bei Dir kein Trennzeichen steht, erkennt MakeIndex keine Zahlengruppen, sondern meldet falsche Zeichen in der Seitenzahl.
- Da MakeIndex in der Voreinstellung zuerst kleine römische Zahlen und dann Kleinbuchstaben erkennt, werden
c
, d
, i
, m
und x
eventuell falsch einsortiert.
Das zweite Problem ist einfach mit
page_precedence "narAR"
in der MakeIndex-Stildatei zu lösen.
Da es nicht möglich ist, bei page_compositor
nichts anzugeben. Ist das erste Problem nur sehr umständlich zu lösen. Dazu muss man die Seitenzahlen mit einem Trennzeichen versehen, aber dafür sorgen, dass LaTeX dieses Trennzeichen nicht mit anzeigt.
% Zuerst `\jobname.mst` erzeugen. Diese wird von makeindex automatisch verwendet.
\begin{filecontents*}{\jobname.mst}
page_precedence "narAR"
page_compositor "."
\end{filecontents*}
\documentclass{article}
\usepackage{scrbase}
\usepackage{scrpage2}
\usepackage{lipsum}
\usepackage{makeidx}\makeindex
\makeatletter
% Der Befehl `\pagewithsuffix` schaltet auf die eingeschobenen Seiten um.
% Er definiert gleichzeitig `\endpagewithsuffix`, das dann wieder zurück
% schaltet.
\newcommand*{\pagewithsuffix}{%
\clearpage
\edef\endpagewithsuffix{\noexpand\clearpage
\noexpand\setcounter{page}{\the\value{page}}%
\noexpand\stepcounter{page}}%
\expandafter\l@addto@macro\expandafter\endpagewithsuffix\expandafter{%
\expandafter\def\expandafter\thepage\expandafter{\thepage}%
}%
\edef\thepage{\thepage.\noexpand\alph{page}}%
\setcounter{page}{1}%
}
% Mit `\specialpageformat` werden die Punkte in den Seitenzahlen
% für die Ausgabe entfernt. Es ist zu beachten, dass dies für
% alle Seitenzahlen anzuwenden ist! Das ganze funktioniert nur,
% solange nicht zwei unmittelbar aufeinanderfolgende Punkte in
% den Seitenzahlen auftreten können. Eine alternative Implementierung
% mit Hilfe des `xstrings`-Pakets wäre eventuell sinnvoll und möglich
\newcommand*{\specialpageformat}[1]{%
\begingroup
\edef\reserved@a{#1}%
\expandafter\@specialpageformat\reserved@a..%
\endgroup
}
\newcommand*{\@specialpageformat}{}
\def\@specialpageformat#1.#2{%
#1\ifx #2.\else #2\expandafter\@specialpageformat\fi
}
% Es wird scrpage2 für den Seitenstil verwendet, damit die Ausgabe
% der Seitenzahlen bei der Nummerierung der Seiten ebenfalls
% `\specialpageformat` verwenden kann. Eine Lösung mit fancyhdr
% wäre natürlich alternativ möglich.
\renewcommand*{\pagemark}{%
\specialpageformat{\thepage}%
}
\pagestyle{scrplain}
\makeatother
% Die folgende Anweisung dient nur meinem persönlichen Komfort.
\newcommand*\lipsumpages{%
\lipsum[1]\index{Eintrag|specialpageformat}
\lipsum[2-5]\index{Eintrag|specialpageformat}
\lipsum[6-10]\index{Eintrag|specialpageformat}
}
\begin{document}
\lipsumpages
\pagewithsuffix
\lipsumpages\lipsumpages
\endpagewithsuffix
\printindex
\end{document}
Kommt dann noch hyperref
hinzu, so wird die Lösung schnell unübersichtlich und schwer beherrschbar. Daher sei stattdessen ausdrücklich xindy
an Stelle von makeindex
empfohlen.
Einfache Lösung mit Xindy:
xindy
ist makeindex
in vielerlei Hinsicht deutlich überlegen.
Bereits das folgende einfache Beispiel zeigt, wie man den neuen Nummerierungsstil, der aus arabischen Zahlen, denen unmittelbar ein Kleinbuchstabe folgt, definieren kann:
% Es wird ein neues xindy-Modul angelegt, das die neue Nummerierungsart für
% Seiten bereitstellt.
\begin{filecontents*}{arabicalpha.xdy}
(define-location-class "arabic-pages" ("arabic-numbers"))
(define-location-class "arabicalpha-pages" ("arabic-numbers" "alpha"))
(define-location-class-order ("arabic-pages" "arabicalpha-pages"))
\end{filecontents*}
\documentclass{article}
\usepackage{scrbase}% für \l@addto@macro
\usepackage{lipsum}
\usepackage{makeidx}\makeindex
\makeatletter
% Der Befehl `\pagewithsuffix` schaltet auf die eingeschobenen Seiten um.
% Er definiert gleichzeitig `\endpagewithsuffix`, das dann wieder zurück
% schaltet.
\newcommand*{\pagewithsuffix}{%
\clearpage
\edef\endpagewithsuffix{\noexpand\clearpage
\noexpand\setcounter{page}{\the\value{page}}%
\noexpand\stepcounter{page}}%
\expandafter\l@addto@macro\expandafter\endpagewithsuffix\expandafter{%
\expandafter\def\expandafter\thepage\expandafter{\thepage}%
}%
\edef\thepage{\thepage\noexpand\alph{page}}%
\setcounter{page}{1}%
}
\makeatother
% Die folgende Anweisung dient nur meinem persönlichen Komfort.
\newcommand*\lipsumpages{%
\lipsum[1]\index{Eintrag}
\lipsum[2-5]\index{Eintrag}
\lipsum[6-10]\index{Eintrag}
}
\begin{document}
\lipsumpages
\pagewithsuffix
\lipsumpages\lipsumpages
\endpagewithsuffix
\printindex
\end{document}
Nach dem ersten LaTeX-Lauf kann man in diesem einfachen Fall xindy
über den MakeIndex-Kompatibilitäts-Wrapper texindy
wie folgt aufrufen:
texindy -M arabicalpha.xdy <DATEINAME>
wobei <DATEINAME>
der Name der idx
-Datei ist. Dabei ist xindy
sogar in der Lage, die aufeinanderfolgenden Seiten 3a bis 3d korrekt zusammenzufassen:
Wie man sieht, lohnt es sich, über einen Umstieg auf xindy
nachzudenken.
Es wäre übrigens schön, wenn Du Deinen Fragen in der Regel ein VM beifügen würdest und nicht nur einen Codeschnippsel. Dann hätte man etwas zum Testen in der Hand und müsste sich nicht erst selbst etwas aus den Fingern saugen, das dann am Ende möglicherweise gar nicht passt.