Spezielle Zeichen im Index
% Das ist `basisbeispiel.tex'.
% Unbedingt darauf achten, dass kein `basisbeispiel.mst` existiert!
\documentclass{article}
\usepackage{makeidx}
\makeindex
\begin{document}
Hallo\index{Hallo"!Ich} im Unterschied zu Hallo Du\index{Hallo!Du}.
\printindex
\end{document}
Erklärung: !
ist in der Voreinstellung von makeindex
der sogenannte level character, also das Zeichen, mit dem ein Untereintrag vom Haupteintrag getrennt wird. Im Beispiel zeigt das Hallo!Du
, bei dem Du
ein Untereintrag von Hallo
wird. Um den level character als normales Zeichen in den Index einzufügen, muss man den quote character voranstellen. In der Voreinstellung ist das "
, wie für Hallo"!Ich
gezeigt. Das funktioniert so natürlich nur, solange man den quote character nicht umdefiniert, also keine .ist
-Datei verwendet wird und keine .mst
-Datei (beispielsweise aus einem späteren Beispiel dieser Antwort) mit gleichem Basisnamen vorhanden ist, in der quote
geändert wird.
Sonderfall Umlaute
Der quote character führt übrigens bei deutschen Umlauten, die beispielsweise als \"a
in den Index geschrieben werden zu keinem Problem, weil in diesem Fall, vor dem quote character der voreingestellte escape character steht:
% Das ist `umlautbeispiel.tex'.
% Unbedingt darauf achten, dass kein `umlautbeispiel.mst' existiert!
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{makeidx}
\makeindex
\begin{document}
Hallöchen!\index{Hallöchen"!}
\printindex
\end{document}
Als Index-Eintrag selbst wird hier bei Verwendung von PDFLaTeX mit LaTeX vor 2018-10-1 \indexentry{Hall\IeC {\"o}chen"!}{1}
und mit aktuellen LaTeX \indexentry{Hallöchen"!}{1}
in die idx
-Datei geschrieben. Vor dem quote character "
steht also der escape character \
. Daher bleiben beide bei der Verarbeitung durch makeindex
erhalten und es entsteht mit LaTeX vor 2018-10-1 »\item Hall\IeC {\"o}chen!, 1
« und mit aktuellem LaTeX »\item Hallöchen!, 1
« in der ind
-Datei. Die Ausgabe von PDFLaTeX entspricht also inzwischen der von LuaLaTeX und XeLaTeX.
Übrigens stört das \IeC
im Zweifelsfall trotzdem die Sortierung:
\begin{filecontents}{\jobname.mst}
quote '+'
\end{filecontents}
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{makeidx}
\makeindex
\begin{document}
Hallöchen!\index{Hallöchen}\index{Hallo}\index{Halloren}
\printindex
\end{document}
daran ändert sich auch nichts, wenn man per Makeindex-Stil-Datei 'quote' umdefiniert (im Beispiel zu +
) und makeindex
mit Option -g
aufruft. Deshalb ist es bei Wörtern mit Sonderzeichen meist vorteilhaft einen Sortierstring mit anzugeben:
\begin{filecontents}{\jobname.mst}
quote '+'
\end{filecontents}
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{makeidx}
\makeindex
\begin{document}
Hallöchen!\index{Halloechen@Hallöchen}\index{Hallo}\index{Halloren}
\printindex
\end{document}
Das gilt übrigens genauso bei Verwendung eines aktuellen LaTeX bzw. LuaLaTeX oder XeLaTeX. makeindex
kann nämlich Umlaute in UTF8-Codierung nicht selbst korrekt lexikalisch einsortieren. »Hallöchen« würde daher nach »Halloren« statt davor eingeordnet. Auch das ändert sich nicht durch Verwendung von Option -g
für makeindex
.
Es sei aber darauf hingewiesen, dass in Makeindex-Stilen für deutsche Texte, der quote character trotzdem (wie im Beispiel angegeben) häufig umdefiniert wird. Wird also ein Makeindex-Stil verwendet, muss man ggf. in diesem nachschauen, was dort bei quote
angegeben ist.
Wie bereits angedeutet hat auch die Verwendung von xelatex
oder lualatex
ggf. Einfluss darauf, was in die idx
-Datei geschrieben wird. Man sollte sich deshalb die idx
-Datei ruhig einmal anschauen und auch den erzeugten Index bezüglich der Korrektheit der Einträge und der Sortierung einem kritischen Blick unterziehen.
Natürlich gilt das Geschriebene ebenfalls, wenn man nicht mit der Standardcodierung UTF8, sondern mit einer veralteten 8-Bit-Codierung wie ISO-Latin-1 arbeitet. Auch da zerbrechen die Umlaute mit PDFLaTeX, wenn man eine ältere Version von LaTeX verwendet. Auch da funktioniert die Sortierung nicht automatisch korrekt. Eine bessere, automatische Sortierung für Deutsch kann man ggf. erreichen, wenn man die Umlaute als babel
-shorthand in die Index-Datei schreibt. Tatsächlich ergibt:
\begin{filecontents}{\jobname.mst}
quote '+'
\end{filecontents}
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{makeidx}
\makeindex
\begin{document}
Hallöchen!\index{Hall"ochen}\index{Hallo}\index{Halloren}
\printindex
\end{document}
Bei Aufruf von makeindex
mit Option -g
bereits die korrekte Sortierung. Ich selbst mag das eher weniger.
Zu weiteren Informationen bezüglich der Bedeutung einzelner Zeichen in \index
sowie zur Erstellung von MakeIndex-Stilen siehe die Anleitungen zu makeindex
.
MakeIndex-Alternative xindy
Es sei außerdem darauf hingewiesen, dass es mit xindy
eine Alternative zu makeindex
gibt, bei der man die Auswertung der Index-Einträge und die Sortierung stärker beeinflussen kann, so dass solche Umwege oft nicht mehr notwendig sind. Die Einarbeitung in xindy
kostet meist etwas Zeit. Mit texindy
gibt es jedoch ein bis zu einem gewissen Grad zu makeindex
kompatibles Frontend. So führt die Datei
% Das ist `xindybeispiel.tex'.
% Vorsichtshalber darauf achten, dass kein `xindybeispiel.mst' existiert.
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{makeidx}
\makeindex
\begin{document}
Hallöchen!\index{Hallöchen}\index{Hallo}\index{Halloren}
\printindex
\end{document}
und der Aufruf texindy -g indexbeispiel.idx
ohne jede Sonderbehandlung für den Umlaut zu dem Ergebnis:
und das vollkommen unabhängig davon, ob man nun PDFLaTeX, XeLaTeX oder LuaLaTeX verwendet.
Man beachte, dass hierbei bereits die Buchstabengruppe mit H
überschrieben wird. Diese häufig gewünschte Voreinstellung kann man mit:
% Das ist `xindybeispiel2.tex'
% Vorsichtshalber darauf achten, dass kein `xindybeispiel2.mst' exisitert.
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{makeidx}
\makeindex
\newcommand*{\lettergroup}[1]{}
\begin{document}
Hallöchen!\index{Hallöchen"!}\index{Hallo}\index{Halloren}
\printindex
\end{document}
abschalten und erhält dann bei Verwendung von texindy -g xindybeispiel.idx
zwischen den beiden LaTeX-Aufrufen
Zur Verdeutlichung, dass der quote character hier trotz Option -g
weiterhin "
ist, habe ich in diesem Beispiel auch wieder das Ausrufezeichen als Sonderzeichen mit eingefügt.
Automatisierung mit imakeidx
Übrigens ist auch das Paket imakeidx
einen genaueren Blick wert. Ruft man pdflatex
dann mit aktiviertem shell-escape auf, bekommt man obiges Ergebnis nach zweimaligem LaTeX-Lauf direkt aus:
% Das ist `imakeidxbeispiel.tex'.
% Vorsichtshalber darauf achten, dass kein `imakeidxbeispiel.mst' existiert!
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[original,texindy]{imakeidx}
\makeindex[options=-g]
\newcommand*{\lettergroup}[1]{}
\begin{document}
Hallöchen!\index{Hallöchen"!}\index{Hallo}\index{Halloren}
\printindex
\end{document}
Um den Aufruf von texindy
kümmert sich dann imakeidx
. Die shell-escape-Aktivierung ist hier übrigens explizit notwendig, weil xindy
nicht zu den Programmen gehört, die auch im eingeschränkten Modus für shell-escape ausgeführt werden dürfen. Bei Verwendung von makeindex
statt texxindy
genügt dieser normalerweise voreingestellte Modus. Verwendet die TeX-Installation jedoch den abgesicherten Modus, so ist ggf. auch für imakeidx
mit makeindex
die shell-escape-Aktivierung notwendig.
MakeIndex-Alternative xindex
Neben dem altgedienten Weg der Indexerstellung mit MakeIndex oder Xindy gibt es mit xindex
von Herbert Voss einen weiteren Indexprozessor. Dieser befindet sich derzeit zwar noch in der Entwicklung (Versionnummer < 1), hat aber bereits jetzt einige Vorteile. So kann das in Lua geschriebene Programm bereits von Haus aus mit UTF8-codierten Daten umgehen und diese auch abhängig von den gewählten Einstellungen unterschiedlich sortieren. So sind auch Sortierungen für die Mischung unterschiedlicher Schriftsystem, beispielsweise lateinische und cyrillische Buchstaben möglich. Näheres ist der Anleitung und den darin befindlichen Beispielen zu entnehmen.
Schlusshinweis
Alle Beispiele in dieser Antwort basieren auf den Grundeinstellungen von MakeIndex. Sobald eine Index-Stil-Datei verwendet wird, können diese Grundeinstellungen abweichen. Es ist dann ggf. der quote character zu verwenden, der in der Index-Stil-Datei als quote
angegeben ist.
Einige der Beispiele legen auch eine eigene Stil-Datei mit der Endung ».mst
« an. MakeIndex verwendet eine Datei mit demselben Basisname und der Endung ».mst
« automatisch als Stildatei. Es ist daher darauf zu achten, dass vor dem ersten LaTeX-Lauf keine solche Datei existiert. LaTeX kann sonst keine solche Datei anlegen. Bei Verwendung eines aktuellen LaTeX kann man \begin{filecontents}{\jobname.mst}
aber auch mit \begin{filecontents}[force]{\jobname.mst}
ersetzen und so erzwingen, dass die Datei bei jedem LaTeX-Lauf neu geschrieben und dabei eine vorhandene Datei im Dokumentverzeichnis ggf. auch überschrieben wird. Bei Verwendung eines älteren LaTeX kann stattdessen noch vor der filecontents
-Umgebung \RequirePackage{filecontents}
eingefügt werden, um das Überschreiben der Datei zu erreichen.
Bei den Beispielen, die keine filecontents
-Umgebung enthalten, ist umso mehr darauf zu achten, dass keine gleichnamige Datei mit Endung .mst
mehr aus früheren Tests existiert. Es wird daher empfohlen, für jeden Test ein eigenes Verzeichnis oder zumindest einen anderen Dateinamen zu verwenden, wie das in den Kommentaren zu den Beispielen auch angedeutet wird.
Häufig (aber nicht in den gezeigten Beispielen) wird für Index-Stil-Dateien auch die Endung ».ist
« verwendet. Dies findet man meist auch in Anleitungen. Solche Index-Stil-Dateien werden von MakeIndex nicht automatisch geladen, sondern müssten per Option -s
beim Aufruf von Programm makeindex
explizit angegeben werden. Bei Verwendung von Paket imakeidx
ist das einfach über die LaTeX-Datei selbst steuerbar. Bei Verwendung von Paket makeidx
muss hingegen der Aufruf von Programm makeindex
im Editor dazu ggf. angepasst werden. Das Zurückstellen darf dann natürlich nicht vergessen werden, wenn man mit einem anderen Dokument arbeitet, das diesen Index-Stil nicht verwenden soll.
"Hallo!" Hast Du mal ein Minimalbsp. dazu?