Ich möchte das Wort Hallo! mit nachgestelltem Ausrufezeichen als Index aufführen. \index{Hallo!} oder \index{Hallo!!} führen nicht zum Ziel.

gefragt 16 Jan '16, 23:31

kabel's gravatar image

kabel
24932431
Akzeptiert-Rate: 33%

bearbeitet 17 Jan '16, 11:30

saputello's gravatar image

saputello
10.8k104164

1

"Hallo!" Hast Du mal ein Minimalbsp. dazu?

(17 Jan '16, 00:01) cis

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}

Veranschaulichung des quote characters im Index des Beispiels

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}

Geht auch noch mit Umlauten

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}

falsche Sortierung

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}

mit lexikalischer Sortierung

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:

mit xindy

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

mit xindy und !

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.

Permanenter link

beantwortet 17 Jan '16, 09:05

saputello's gravatar image

saputello
10.8k104164
Akzeptiert-Rate: 51%

bearbeitet 14 Jan, 09:48

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×16
×15
×14
×5

gestellte Frage: 16 Jan '16, 23:31

Frage wurde gesehen: 7,058 Mal

zuletzt geändert: 14 Jan, 09:48