Ein Index, also die alphabetisch sortierte Liste von Begriffen und Seitenzahlen am Ende eines Buches, wird von LaTeX erstellt, sofern Sie die Begriffe im Text markieren. Drei Teile sind nötig: \makeindex in der Präambel deklarieren, an jeder zu indizierenden Stelle \index{…} setzen und dort \printindex aufrufen, wo die Liste erscheinen soll. Der Haken: Sortiert wird nicht von LaTeX selbst, sondern von einem separaten Programm, makeindex (mendex / upmendex für Japanisch). Wie bei bibtex ist also ein zusätzlicher Lauf nötig. Diese Seite führt von den Grunddeklarationen über die Eintragssyntax (! Untereinträge, @ Sortierschlüssel, | Seitenzahlformatierung), den Build-Ablauf, japanische Sortierung, Stilabstimmung und das moderne Paket imakeidx.
Die vier Bestandteile eines Indexes
Die Standardbefehle für Indexe stammen aus dem Paket makeidx. Laden Sie es in der Präambel und deklarieren Sie danach \makeindex; ab dann schreibt LaTeX die Indexeinträge in eine separate Datei (.idx). Danach müssen nur noch die Begriffe markiert und die Ausgabestelle der Liste angegeben werden.
\usepackage{makeidx}— lädt die Indexbefehle (Präambel).\makeindex— die Deklaration, die das Sammeln von Indexeinträgen einschaltet (Präambel). Ohne sie wird\indexstillschweigend ignoriert.\index{entry}— die Markierung im Text an der Stelle, an der ein Begriff vorkommt. Dort wird nichts gedruckt; nur die aktuelle Seitenzahl wird aufgezeichnet.\printindex— der Befehl, der den fertigen Index tatsächlich setzt, meist am Ende des Dokuments.
Der zentrale Gedanke: \index ist eine unsichtbare Markierung. Das Wort selbst schreiben Sie weiterhin in den Text und setzen direkt dahinter \index{…} (random numbers\index{random numbers} are used). Die Seitenzahl der markierten Stelle wird für diesen Eintrag gespeichert.
Indexeinträge schreiben
Das Argument von \index besitzt eine eigene kleine Syntax für Untereinträge, Sortierschlüssel, Seitenbereiche, Seitenzahlformatierung und Querverweise. Sie beruht auf vier Sonderzeichen, die von makeindex (nicht von LaTeX) interpretiert werden: !, @, | und ".
Untereinträge (!). Ein Ausrufezeichen trennt Ebenen. \index{animals!cats} erzeugt einen Haupteintrag „animals“ mit dem Untereintrag „cats“ darunter. Wiederholtes ! verschachtelt bis zu drei Ebenen tief (mit mendex / upmendex auch tiefer).
Sortierschlüssel (@). In der Form sortkey@display trennt er die Zeichenfolge für die Sortierung von der tatsächlich gedruckten Zeichenfolge. Das ist für Symbole und Mathematik wichtig, weil sie nicht nach ihrem Zeichenbild sortieren. \index{alpha@$\alpha$} druckt α im Index, ordnet es aber unter „alpha“ ein. Im Japanischen liefert es die Lesung von Kanji (\index{さくいん@索引}).
Seitenbereiche (|( … |)). Wenn ein Thema mehrere Seiten umfasst, markieren Sie den Anfang mit |( und das Ende mit |), um einen Bereich wie 12–15 zu erhalten. Öffnen Sie mit \index{recursion|(} und schließen Sie später mit \index{recursion|)}.
Seitenzahlformatierung (|). Setzen Sie einen senkrechten Strich gefolgt vom Namen eines Befehls mit einem Argument, und nur diese Seitenzahl wird damit formatiert. \index{cat|textbf} macht die Seite, auf der der Begriff definiert wird, fett; \index{group|textit} macht sie kursiv. Eigene Befehlsnamen funktionieren ebenfalls.
Querverweise (|see / |seealso). Ebenfalls nach einem Strich können Sie statt einer Seitenzahl einen Verweis auf einen anderen Eintrag ausgeben. \index{dog|see{pets}} ergibt „dog, *see* pets“; |seealso{…} ergibt „*see also*“.
Sonderzeichen wörtlich drucken ("). Wenn !, @, | oder " als gewöhnliche Zeichen in einem Eintrag stehen sollen, setzen Sie jeweils ein doppeltes Anführungszeichen davor. \index{C"!} erzeugt zum Beispiel den Eintrag „C!“.
| Symbol | Rolle | Beispiel |
|---|---|---|
! | Untereintrag (Verschachtelung) | \index{animals!cats} |
@ | Sortierschlüssel (steuert die Ordnung) | \index{alpha@$\alpha$} |
|( |) | Seitenbereich öffnen/schließen | \index{recursion|(} … \index{recursion|)} |
|cmd | Seitenzahl formatieren (fett usw.) | \index{cat|textbf} |
|see | „see“-Querverweis | \index{dog|see{pets}} |
" | Nächstes Sonderzeichen wörtlich drucken | \index{C"!} |
Der Build-Ablauf (makeindex ausführen)
Ein Index ist nicht nach einem einzigen LaTeX-Lauf fertig. Wie bei bibtex ist es ein dreistufiger Ablauf mit einem separaten Programm in der Mitte. Zuerst sammelt LaTeX die \index-Aufrufe in der Rohdatei file.idx. Danach sortiert und formatiert makeindex diese zu file.ind, einem setzbaren Index. Schließlich lässt ein weiterer LaTeX-Lauf \printindex die Datei file.ind lesen, sodass der Index im Dokument erscheint. Das Verarbeitungsprotokoll landet in file.ilg.
\documentclass{article}
\usepackage{makeidx}
\makeindex
\begin{document}
METAFONT\index{METAFONT} は字形を、TeX\index{TeX} は組版を担う。
ここでは乱数\index{乱数|textbf} の生成を扱い、
群\index{group@群} と環\index{ring@環} にも触れる。
アルゴリズム\index{algorithm|(} の説明はここから始まり…
% (数ページ後)
…アルゴリズム\index{algorithm|)} の説明はここで終わる。
\printindex
\end{document}Auf der Kommandozeile führen Sie es so aus. -s wählt eine Stildatei, -o benennt die Ausgabe und -t benennt das Protokoll; wenn Sie sie weglassen, ändert sich nur die Dateiendung.
pdflatex mydoc # writes mydoc.idx
makeindex mydoc # mydoc.idx -> mydoc.ind (log in mydoc.ilg)
pdflatex mydoc # \printindex reads mydoc.indDie gesamte Folge kann latexmk automatisch erledigen: Wenn sich die .idx ändert, ruft es makeindex auf und startet LaTeX so oft wie nötig erneut. Sie müssen die drei Schritte also nicht von Hand ausführen.
Japanische Indexe (mendex / upmendex)
Da makeindex von westlicher alphabetischer Ordnung ausgeht, verwenden japanische Indexe mendex (mit pLaTeX) oder upmendex (mit upLaTeX / LuaLaTeX, Unicode-fähig). Beide sind makeindex-kompatibel; Sie rufen sie einfach dort auf, wo sonst makeindex stünde.
uplatex mydoc # writes mydoc.idx
upmendex -s style.ist mydoc # sorts kana correctly -> mydoc.ind
uplatex mydoc # \printindex reads mydoc.indDer große Vorteil ist die Kana-Sortierung. Mit makeindex mussten Einträge für die japanische Silbenordnung jeweils eine Hiragana-/Katakana-Lesung in der Form reading@display erhalten, und stimmhafte Zeichen mussten von Hand normalisiert werden. upmendex sortiert Kana mithilfe von ICU (International Components for Unicode) korrekt und automatisch, wodurch viel Arbeit entfällt. Mit einer Wörterbuchdatei über -d lassen sich Lesungen für Kanji-Wörter gesammelt registrieren, sodass die @-Lesungen oft ganz entfallen können.
Faustregel: mendex für pLaTeX, upmendex für upLaTeX / LuaLaTeX. Lesungen über @ anzugeben funktioniert in beiden (\index{さくいん@索引}).
Den Indexstil ändern (.ist)
Das Aussehen des Indexes wird durch eine Stildatei (.ist) gesteuert, die mit -s übergeben wird, etwa makeindex -s style.ist file. Darin steht lediglich eine Liste von Paaren <parameter> <value>; Zeichenketten stehen in doppelten Anführungszeichen, % beginnt einen Kommentar (Stile für mendex / upmendex sind aufwärtskompatibel mit makeindex).
headings_flag— ein Wert ungleich null fügt vor jeder neuen Gruppe eine Gruppenüberschrift ein (den Anfangsbuchstaben, z. B.A,B… oder Kana-Gruppen).lethead_prefix/lethead_suffix— Zeichenketten vor und nach dieser Überschrift.delim_0/delim_1/delim_2— das Trennzeichen zwischen einem Eintrag (auf jeder Ebene) und seiner Seitenzahl (z. B.", "oder eine Punktlinie).item_0/item_1— Zeichenketten zwischen Einträgen und zwischen Ebenen (Zeilenumbrüche, Einzüge).preamble/postamble— Code, der vor und nach dem gesamten Index ausgegeben wird.
Wenn es nur um Gruppenüberschriften geht, genügt eine kleine .ist wie diese.
% style.ist
headings_flag 1
heading_prefix "{\\bfseries "
heading_suffix "}\\nopagebreak\n"
delim_0 "\\dotfill "Der moderne Weg: imakeidx
imakeidx erweitert makeidx und bringt zwei große Vorteile. Erstens führt es makeindex automatisch während der Kompilierung aus: Starten Sie LaTeX mit -shell-escape (Erlaubnis zum Ausführen externer Programme), und der Index entsteht ähnlich wie das Inhaltsverzeichnis, ohne manuellen Lauf. Zweitens unterstützt es mehrere Indexe in einem Dokument, etwa einen Personenindex und einen Sachindex.
Konfiguriert wird es, indem Optionen an \makeindex übergeben werden. name= unterscheidet einen Index, title= setzt seine Überschrift, intoc trägt ihn ins Inhaltsverzeichnis ein, program= wählt das Sortierprogramm (makeindex / xindy / texindy, oder mendex / upmendex für Japanisch), und options= übergibt Argumente wie -s style.ist. Mehrere \makeindex-Aufrufe erzeugen mehrere Indexe; Einträge werden mit \index[name]{…} zugewiesen und mit \printindex[name] gedruckt.
\documentclass{article}
\usepackage{imakeidx}
% two indexes; built automatically with -shell-escape
\makeindex[name=subject, title=事項索引, intoc, program=upmendex]
\makeindex[name=people, title=人名索引, intoc, program=upmendex,
options={-s style.ist}]
\begin{document}
群\index[subject]{group@群} は重要だ。
クヌース\index[people]{Knuth@クヌース} が TeX を作った。
\printindex[subject]
\printindex[people]
\end{document}# auto-build: makeindex/upmendex is invoked for you
lualatex -shell-escape mydoc
lualatex -shell-escape mydoc # second pass resolves page numbersNur xindy benötigt das *volle* shell-escape, aber automatisches Bauen überhaupt erfordert -shell-escape. Wenn Sie möchten, können Sie makeindex / mendex auch mit imakeidx weiterhin extern aufrufen. Wo -shell-escape nicht aktiviert werden kann (einige Webdienste, strenge CI), ist der automatische Build nicht verfügbar; nutzen Sie dann einen manuellen Lauf oder lassen Sie latexmk die Arbeit erledigen.