Index II: Stildatei und Layout

Nachdem wir im letzten Monat bereits erfahren haben, wie man Indexeinträge anlegt und sortiert, geht es nun darum die Darstellung des Index anzupassen. Wir werden das Zusammenspiel mit hyperref einrichten, neue Befehle (Attribute) zum Formatieren einer Seitenzahl ergänzen sowie den Index so umdefinieren, dass wir die schlechten Umbrüche vermeiden können und in der Kopfzeile die Einträge der jeweiligen Seite erscheinen.

Zielstellung

Bevor wir mit dem Code beginnen hier noch einmal unsere Ziele zusammengefasst: Wir wollen, …

  • die Zeilenumbrüche verbessern, d. h. selbige vor dem ersten Haupteintrag einer Buchstabengruppe und vor dem jeweils ersten Untereintrag verhindern,
  • Seitenzahlen klickbar machen,
  • Einträge in die Kopfzeile übernehmen,
  • Buchstabengruppen in die PDF-Bookmarks aufnehmen,
  • inhaltliche/bedeutungstragende Attribute vergeben können (bspw. \index{Licht|important} statt \index{Licht|textbf}),

Damit das möglich wird, müssen wir zunächst einen neuen Xindy-Stil definieren, der eine angepassten Code für den Index ausgibt. Das Standardverhalten sehen wir, wenn wir in die von texindy erzeugte Datei mit der Endung .ind, die den formatierten Index enthält, schauen (hier gekürzt wiedergegeben):

\begin{theindex}
 
   \lettergroup{A}
   \item Aerodynamik, 16
 
   \indexspace
 
   \lettergroup{E}
   \item Eintrag, 1, \textbf{9}, \textit{11}, I, VI--IX
      \subitem Untereintrag, 2
         \subsubitem zweite Ebene, 3
 
   \indexspace
 
   \lettergroup{L}
   \item Licht, 5--8, \seealso{Wellen, Elektromagnetische}{}
 
\end{theindex}

Eine Buchstabengruppe beginnt jeweils mit dem Befehl \lettergroup, die Einträge werden jeweils durch einen \item-Befehl begonnen und die Seitenzahlen stehen plain – ggf. mit Formatierungsbefehlen – in der Datei.

Für unsere Bedürfnisse, müssen wir die Formatierung so anpassen, dass wir für die Kopfzeilen auf die Texte der Haupteinträge zugreifen können, die müssen also durch einen Befehl mit Argument verarbeitet werden, außerdem sollen eigene Attribute definiert werden und einige kleinere Anpassungen vorgenommen werden, sodass der formatierte Index wie folgt aussieht (ebenfalls gekürzt):

\begin{theindex}
 
   \lettergroup{A}
   \item \IndexMainEntry{Aerodynamik}\IndexEntryPageSep \hyperpage{16}
 
   \indexspace
 
   \lettergroup{E}
   \item \IndexMainEntry{Eintrag}\IndexEntryPageSep \hyperpage{I}\IndexPageSep \hyperpage{VI}--\hyperpage{IX}\IndexPageClassSep \hyperpage{1}\IndexPageSep \IndexImportantPage{9}\IndexPageSep \IndexEmphPage{11}
      \subitem Untereintrag\IndexEntryPageSep \hyperpage{2}
         \subsubitem zweite Ebene\IndexEntryPageSep \hyperpage{3}
 
   \indexspace
 
   \lettergroup{L}
   \item \IndexMainEntry{Licht}\IndexEntryPageSep \hyperpage{5}\kern0.1em--\kern0.1em\hyperpage{8}\IndexPageSep \IndexImportantPage{12}\kern0.1em--\kern0.1em\IndexImportantPage{16}\IndexPageClassSep \IndexSeeAlso{Wellen, Elektromagnetische}
 
\end{theindex}

Das sieht auf den ersten Blick komplizierter aus, ermöglicht aber den angepassten Index und da diese Datei ohnehin automatisch erzeugt und eingebunden wird, bekommen wir sie als Nutzer eigentlich nie zu Gesicht.

Index-Stil: Datei index-style.xdy

Bevor wir uns die -Datei anschauen, wollen wir zunächst den Index-Stil (oder das Index-Modul) zusammenstellen. Die Syntax ist vergleichsweise überschaubar:

  • Kommentare werden mit einem Semikolon ; eingeleitet
  • Befehle/Einstellungen werden durch Klammern zusammengefasst
  • Optionen zu den Befehlen beginnen mit dem Doppelpunkt :
  • Werte werden ohne Trennzeichen hinter der Option angeben
  • Strings (Zeichenketten) werden in Ersatzanführungszeichen " eingeschlossen
  • Ganzzahlen werden direkt eingegeben

Eine vollständige Referenz findet man auf der xindy-Homepage: xindy.org.

Basis-Module laden

Mit dem Befehl require laden wir die Basismodule für die Kodierung (hier Unicode/UTF-8) und zur Sortierung der Seitenzahlenklassen (römische vor arabischen, gefolgt von alphabetischen Seitenzahlen; Verweise zuletzt)

(require "tex/inputenc/utf8.xdy")
(require "book-order.xdy")

Einträge und Seitenzahlen formatieren

Um die Einträge der ersten Ebene mit dem Befehl \IndexMainEntry zu formatieren, verwenden wir markup-keyword-list und geben mit :open und :close den hinzuzufügenden -Code an. Mit der Option :depth beschränken wir die Einstellung auf eine bestimmte Ebene und könnten so bei Bedarf auch die Untereinträge ansteuern. Ohne die :depth-Angabe würden alle Ebenen gleich formatiert.

(markup-keyword-list :open "\IndexMainEntry{" :close "}" :depth 0)
;(markup-keyword-list :open "\IndexSubEntry{" :close "}" :depth 1)
;(markup-keyword-list :open "\IndexSubSubEntry{" :close "}" :depth 2)

Auf die Liste aller Seitenzahlen eines Eintrages greifen wir mit diesem Befehl zu. Die Liste soll mit IndexEntryPageSep beginnen (:open) – das ist also der Trenner zwischen Eintrag und Seitenzahlen – und mit :sep geben wir das Trennzeichen zwischen Seitenzahlen verschiedener Klassen an.

(markup-locclass-list :open "\IndexEntryPageSep " :sep "\IndexPageClassSep ")

Analog setzen wir jetzt das Trennzeichen zwischen Seitenzahlen gleicher Klasse.

(markup-locref-list :sep "\IndexPageSep ")

Damit die Seitenzahlen in der PDF klickbar werden, müssen wir diese mit \hyperpage formatieren, wozu wir im Modul den Befehl markup-locref verwenden. Diese Angabe bezieht sich allerdings nur auf Seitenzahlen, die kein Attribut haben (oder genauer: die das Attribut default haben).

(markup-locref :open "\hyperpage{" :close "}")

Mit markup-range können wir die Darstellung von Seitenzahlenbereichen beeinflussen: hier fügen wir einen Bis-Strich und mit \kern etwas Abstand um diesen ein.

(markup-range :sep "\kern0.1em--\kern0.1em")

Diese Einstellung könnte man durch die Angabe der Option :class "arabic-page-numbers" bspw. auf arabische Seitenzahlen beschränken.

Zur Formatierung der Verweiseinträge („siehe“ und „siehe auch“) nutzen wir markup-crossref-list unter Angabe der jeweiligen Klasse.

(markup-crossref-list
   :class "see"
   :open "\IndexSee{"
   :close "}"
)
(markup-crossref-list
   :class "seealso"
   :open "\IndexSeeAlso{"
   :close "}"
)

Eigene Attribute

Wie im letzten Monat schon gesagt, ist es ungünstig bzw. nicht in ’s Sinn der strikten Trennung von Inhalt und Darstellung/Aussehen, die Attribute textit und textbf zu benutzen. Stattdessen wollen wir emph und important einführen.

Dazu müssen wir zunächst die Attribute definieren, wobei wir auch default(= kein Attribut) berücksichtigen müssen. Damit die Seitenzahlen trotzdem _ohne_ Berücksichtigung der Attribute sortiert werden, müssen wir alle Attribute durch Klammern als Gruppe zusammenfassen. Das zweite Klammernpaar ist nötig, weildefine-attributes` eine Liste von Einträgen (diese hat hier einen Eintrag) erwartet.

(define-attributes (("important" "emph" "default")))

Um nun die Seitenzahlen mit einem Format zu versehen, nutzen wir wie oben markup-locref, nur dass wir jetzt das Attribut mit :attr explizit angeben. Auch hier nutzen wir \hyperpage, um klickbare Seitenzahlen zu erhalten.

Oben galt die Voreinstellung :attr "default".

(markup-locref :open "\IndexImportantPage{\hyperpage{" :close "}}" :attr "important")
(markup-locref :open "\IndexEmphPage{\hyperpage{" :close "}}" :attr "emph")

Damit können wir nun einen für uns passenden formatierten Index erzeugen, der dann von eingelesen wird. Allerdings müssen wir dann auch die hier verwendeten -Befehle in unserer Datei definieren.

Wo speichert man einen Stil / ein Modul?

Am einfachsten ist es, die .xdy-Datei im selben Verzeichnis zu speichern wie die .tex-Datei. Dann ist sie zwar nur für dieses Projekt verfügbar, aber man muss sich nicht mit Pfadvariablen etc. herumschlagen.

Für Experten: xindy ist derzeit nicht in der Lage kpsewhich zu nutzen, weshalb man Stile nicht einfach im Nutzer-TEXMF-Verzeichnis ablegen kann. Siehe dazu auch What is the best (most robust) way to install a custom Xindy style?.

Datei index2.tex

Ausgangspunkt für diese Datei ist die Datei index.tex mit den zugehörigen Erklärungen aus dem letzten Monat. Wir werden diese nun (als index2.tex) nach unseren Bedürfnissen erweitern. Kommentiert werden hier jeweils nur Teile die nicht oder anders in der alten Datei stehen.

Für einen Teil der Definitionen werden wir 3 verwenden. Siehe dazu auch den Abschnitt 3-Grundlagen“ im Beispiel aus dem Mai 2016. Das Modul, also den Präfix für alle internen Befehle, nennen wir dieses Mal schlicht idx.

\documentclass[ngerman]{scrartcl}
 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
 
\usepackage{babel}
 
\usepackage{lipsum}
 
\usepackage[xindy]{imakeidx}

Damit im Index die Einträge in der Kopfzeile erscheinen können, müssen wir überhaupt erst einmal für das Vorhandensein einer solchen sorgen. Dazu nutzen wir das Paket scrlayer-scrpage mit der \automark-Funktion. Dadurch erhalten wir automatisch Kopfzeilen, die zentriert den jeweiligen Abschnitt enthalten.

Mehr zu Kopf- und Fußzeilen findet man im Beispiel „Layout II: Kopf- und Fußzeilen“ (November 2015).

\usepackage{scrlayer-scrpage}
\automark{section}

Für die 3-Funktionen benutzen wir das Paket expl3.

\usepackage{expl3}

Um den Index dreispaltig ausgeben zu können, benötigen wir die Umgebung {multicols}, die vom fast gleichnamigen Paket bereit gestellt wird.

\usepackage{multicol}

hyperref laden wir dieses Mal mit der zusätzlichen Option colorlinks, damit wir leicht erkennen können, ob die verlinkung der Seitenzahlen erfolgreich war.

\usepackage[
   hyperindex=false,
   colorlinks,
]{hyperref}

Einfache Befehle

Die Definition der meisten im Index-Stil vorgebenden Befehle ist recht einfach und wird mit \newcommand (siehe FAQs 6, 10) gemacht.

Trennzeichen

Damit zwischen dem Eintrag und der ersten Seitenzahl kein Zeilenumbruch stattfinden kann verwenden wir \nolinebreak. \enskip erzeugt ein etwas breiteres Leerzeichen.

\newcommand{\IndexEntryPageSep}{%
   \nolinebreak\enskip\nolinebreak
}
\newcommand{\IndexPageSep}{%
   , % inkl. Leerzeichen!
}
\newcommand{\IndexPageClassSep}{%
   \IndexPageSep
}

Attribute

Für die Seitenzahlen mit Attributen definieren wir jeweils einen Befehl mit einem Argument, der die Darstellung der Seitenzahl steuert. Das Argument ist dann die Seitenzahl.

\newcommand{\IndexEmphPage}[1]{%
   \emph{#1}%
}
\newcommand{\IndexImportantPage}[1]{%
   \textbf{#1}%
}

Verweise

Für die Verweise definieren wir ebenfalls je einen Befehl mit einem Argument. Darin benutzen wir \nearrow (im Mathe-Modus), um einen Pfeil von unten links nach oben rechts auszugeben gefolgt von dem Verweisziel in kursiver Schrift. Im zweiten Befehl nutzen wir \mkern-8mu, um die beiden Pfeile dichter aneinander zu ziehen.

\newcommand{\IndexSee}[1]{%
   $\nearrow$~\textit{#1}%
}
\newcommand{\IndexSeeAlso}[1]{%
   $\nearrow\mkern-8mu\nearrow$~\textit{#1}%
}

Buchstabengruppenüberschriften 1

Zuletzt bestimmen wir noch die Überschrift für die Gruppe der Zahlen und Symbole, in dem wir \lettergroupDefault definieren. Dass dieser Befehl mit einem Argument definiert wird, obwohl wir das hier nicht brauchen liegt daran, dass texindy erwartet, dass der Befehl ein Argument hat und in den formatierten Index \lettergroupDefault{default} schreibt.

\newcommand{\lettergroupDefault}[1]{%
   \lettergroup{Zahlen und Symbole}%
}

Komplexere Befehle

Jetzt folgen die etwas komplizierteren Befehle, um die gewünschten Funktionen in Bezug auf Zeilenumbrüche, PDF-Bookmarks und die Kopfzeile umsetzen zu können.

Um die oben genannten Verbesserungen für die Umbrüche durchführen zu können, müssen wir bei jedem Eintrag prüfen, ob dieser der jeweils erste ist, wozu wir die drei Bool’schen Variablen \l_idx_first_index_item_bool, \l_idx_first_index_subitem_bool und \l_idx_first_index_subsubitem_bool einführen werden.

Beginn der 3-Syntax

\ExplSyntaxOn

Variablen

Wie eben angekündigt, definieren wir hier die drei Bool’schen Variablen.

\bool_new:N \l_idx_first_index_item_bool
\bool_new:N \l_idx_first_index_subitem_bool
\bool_new:N \l_idx_first_index_subsubitem_bool

Außerdem definieren wir verschiedene Längen, die die Einrückungen im Index steuern.

\dim_new:N \g_idx_index_hangindent_dim
\dim_set:Nn \g_idx_index_hangindent_dim { 4em }
\dim_new:N \g_idx_index_subitemindent_dim
\dim_set:Nn \g_idx_index_subitemindent_dim { 1em }
\dim_new:N \g_idx_index_subsubitemindent_dim
\dim_set:Nn \g_idx_index_subsubitemindent_dim { 2em }

Buchstabengruppenüberschriften 2

Für die Überschriften der Buchstabengruppen im Index wird \lettergroup benutzt, wie wir bereits in der Definition von \lettergruopudefault gesehen haben.

Der Befehl hat ein Argument, das für den Buchstaben bzw. die Überschrift der jeweiligen Gruppe steht.

\newcommand { \lettergroup } [ 1 ] {

Wird eine Buchstabengruppe begonnen, setzten wir zunächst die Variable für die Einträge der obersten Ebene auf true, denn nach der Überschrift folgt der erste Eintrag auf dieser Ebene.

   \bool_set_true:N \l_idx_first_index_item_bool

Anschließend teilen wir mit, dass hier eine gute Gelegenheit für einen Seitenumbruch wäre, beginnen mit \par einen neuen Absatz und fügen einen vertikalen Abstand ein.

   \goodbreak
   \par
   \bigskip

Das Makro \belowpdfbookmark (aus hyperref) erzeugt einen Eintrag in die PDF-Bookmark-Liste und zwar unterhalb der aktuellen Überschriftenebene (das ist hier \section). Im ersten Argument geben wir dabei den Eintrag ein, der in den Bookmarks stehen soll, im zweiten Argument dann einen eindeutigen Anker, den hyperref benötigt, um dem Bookmark eine Stelle im Dokument zuordnen zu können.

   \belowpdfbookmark { #1 } { index:letter-#1 }

Jetzt geben wir die Überschrift in endstrichloser (serifenloser) fetter Schrift aus.

   \textsf { \textbf{ #1 } }

Zuletzt fügen wir einen weiteren Absatz ein, und legen mit \nobreak fest, dass hier besser kein Umbruch stattfinden sollte, damit der folgende erste Eintrag nicht von der Überschrift getrennt wird.

   \nobreak \par \nobreak

Ende der Definition

}

Indexeintragbefehle

Jetzt definieren wir für jede Ebene einen eigenen Befehl, der für den richtigen Einzug sorgt und bei Bedarf einen Umbruch verhindert. Da dieser Befehle nur intern verwendet werden sollen, nutzen wir dabei nicht \newcommand sondern den 3 Befehl \cs_new:Nn.

Die folgenden drei Befehle haben keine Argumente – sie geben nicht den Eintrag selbst aus, sondern werden diesem nur vorangestellt.

Dieser Befehl ist für die Einträge der ersten Ebene.

\cs_new:Nn \idx_index_item: {

Hier setzen wir zuerst die Variable für die Einträge der zweiten Ebene auf true (analog zu \lettergroup).

   \bool_set_true:N \l_idx_first_index_subitem_bool

Dann testen wir, ob es sich bei diesem Eintrag um den ersten auf dieser Ebene handelt (d. h. ob wir uns gerade direkt nach einer Gruppenüberschrift befinden).

   \bool_if:NTF \l_idx_first_index_item_bool {

Sollte dieser der Fall sein (T-Argument), setzen wir die Variable auf false, denn der folgende Eintrag dieser Ebene ist offensichtlich nicht mehr der erste. Den Umbruch haben wir bereits in der Definition von \lettergroup verhindert.

      \bool_set_false:N \l_idx_first_index_item_bool
} {

Ist es nicht der erste Eintrag (F-Fall), ist hier eine gute Stelle für einen Umbruch.

      \goodbreak

Ende der if-Abfrage

   }

Zuletzt beginnen wir einen neuen Absatz und setzen den hängenden Einzug.

Die Einstellung für den hängenden Einzug gilt immer nur für einen Absatz, weshalb wir sie nicht zentral an einer Stelle machen können.

   \par
   \setlength { \hangindent } { \g_idx_index_hangindent_dim }

Ende der Definition

}

Analog dazu definieren wir die Befehle für die zweite und dritte Ebene, nur das wir hier im T-Fall ein zusätzliches \nobreak einfügen müssen, um einen Umbruch vor dem jeweils ersten Eintrag zu verhindern.

\cs_new:Nn \idx_index_subitem: {
   \bool_set_true:N \l_idx_first_index_subsubitem_bool
   \bool_if:NTF \l_idx_first_index_subitem_bool {
      \nobreak
      \bool_set_false:N \l_idx_first_index_subitem_bool
   } {
      \goodbreak
   }
   \par
   \setlength { \hangindent } { \g_idx_index_hangindent_dim }
   \strut \hspace { \g_idx_index_subitemindent_dim }
}
 
\cs_new:Nn \idx_index_subsubitem: {
   \bool_if:NTF \l_idx_first_index_subsubitem_bool {
      \nobreak
      \bool_set_false:N \l_idx_first_index_subsubitem_bool
   } {
      \goodbreak
   }
   \par
   \setlength { \hangindent } { \g_idx_index_hangindent_dim }
   \strut \hspace { \g_idx_index_subsubitemindent_dim }
}

Kopfzeile

Damit jeweils der erste und der letzte Eintrag einer Seite in der Kopfzeile erscheinen, müssen wir zwei Befehle definieren: Einen, der die Kopfzeileneinträge setzt und einen, der die Ausgabe übernimmt. Generell nutzen wir dabei den mark-Mechanismus von . Dieser kennt eine linke und eine rechte Marke, die ggf. mehrfach pro Seite definiert werden können. Die linke Marke behält dabei immer den ersten Wert, den sie auf der Seite bekam, wogegen die rechte Marke den letzten Wert enthält.

Der Beispiel-Index ist so kurz, dass sich der Aufwand für die Kopfzeilen hier eigentlich nicht lohnt, aber ein „echter“ Index ist schließlich meistens deutlich länger als eine Seite …

Der Befehl, mit dem wir die Haupteinträge formatieren hat ein Argument (den Eintrag).

\newcommand { \IndexMainEntry } [ 1 ] {

Dieses wird ausgegeben und dann mit \markboth immer an beide Marken übergeben. Der oben beschriebene Mechanismus kümmert sich für uns darum, dass am Ende der Seite jeweils linke und rechte Marke korrekt gesetzt sind.

   #1
   \markboth { #1 } { #1 }

Ende der Definition

}

Der nächste Befehl ist ein interner und hat kein Argument. Er soll den Text für die Kopfzeile ausgeben.

\cs_new:Nn \idx_index_head_mark: {

Zunächst also die Überschrift des Index gefolgt von einem Leerzeichen und einer öffnenden Klammer.

   \indexname \c_space_tl
   (

Anschließend vergleichen wir die Inhalte der linken und rechten Marken und geben im (unwahrscheinlichen) Fall der Gleichheit nur die linke, ansonsten beide Marken getrennt durch einen Bis-Strich mit etwas mehr Abstand aus.

      \tl_if_eq:NNTF \leftmark \rightmark
         { \leftmark }
         { \rightmark \kern0.25em -- \kern0.25em \leftmark }
   )

Ende der Definition

}

Index-Umgebung

Zu guter Letzt definieren wir noch die Indexumgebung, die den gesamten Index enthält, neu.

Dazu verwenden wir \renewenvironment: Im ersten Argument geben wir den Namen der umzudefinierenden Umgebung – hier theindex – an, gefolgt von den Definitionen des \begin- und \end-Teils.

\renewenvironment { theindex } {

Der Index soll immer auf einer neuen Seite beginnen.

   \clearpage

Dann ändern wir den mittleren Kopfzeilenbereich mit \chead so, dass er die Index-Kopfmarke enthält.

   \chead { \idx_index_head_mark: }

Als nächstes müssen wir die von texindy für die Ausgabe der Einträge benutzten \item-Befehle auf die von uns definierten Befehle „umlenken“. Das machen wir, in dem wir beide mit \cs_set_eq gleichsetzen.

   \cs_set_eq:NN \item \idx_index_item:
   \cs_set_eq:NN \subitem \idx_index_subitem:
   \cs_set_eq:NN \subsubitem \idx_index_subsubitem:

Der Index selbst soll mit {multicols} dreispaltig ausgegeben werden, wobei wir im optionalen Argument dieser Umgebung die dann alle Spalten überspannende Überschrift mit \section* ausgeben und manuell den Inhaltsverzeichniseintrag erzeugen.

Wir können hier nicht \addsec benutzen, da dies \leftmark setzt und das wollen wir hier ja für die Indexeinträge benutzen.

   \begin{multicols} { 3 } [
      \section* { \indexname }
      \addcontentsline{ toc }{ section }{ \indexname }
   ]

Innerhalb des Index setzten wir den Absatzeinzug auf Null und stellen auf eine kleinere Schriftgröße um.

      \setlength { \parindent } { 0pt }
      \footnotesize

Ende der Definition des \begin-Teils; Anfang für den \end-Teil

} {

Am Ende der Index-Umgebung müssen wir {multicols} beenden und lassen erneut eine neue Seite beginnen.

   \end{multicols}
   \clearpage

Ende der Definition des \end-Teils

}

Ende der 3-Syntax

\ExplSyntaxOff

Indexbefehl

Die Erstellung des Index stoßen wir auch hier wieder mit \makeindex an, allerdings müssen wir über die Option options jetzt diverse Einstellungen an texindy weitergeben: -M index-style lädt unseren eigenen Stil (Modul), -C uft8 legt die Kodierung fest und mit -g (german) stellen wir ein, dass Umlaute nach deutschen Regeln sortiert werden sollen.

Die Option intoc entfällt, da sie in unserer umdefinierten {theindex}-Umgebung sowieso keine Wirkung zeigen könnte und wir den IHV-Eintrag selbst vorgenommen haben.

\makeindex[options=-M index-style -C utf8 -g]

Testdokument

Nach den vielen Definitionen folgt nun das im Wesentlichen dem des letzten Monats entsprechende Test-Dokument.

\begin{document}
 
\tableofcontents
 
 
\section{Einträge und Untereinträge}
Hier geht es um einen Eintrag\index{Eintrag}
\lipsum
 
Hier um einen Untereintrag\index{Eintrag!Untereintrag}
Hier um einen Untereintrag\index{Haupteintrag!Untereintrag}
\lipsum
 
Und hier um einen Untereintrag 2. Ebene\index{Eintrag!Untereintrag!zweite Ebene}
\lipsum
 
Hier beginnt ein Bereich über Licht\index{Licht|(}
\lipsum\lipsum\lipsum
\textbf{Und hier endet der Bereich wieder}\index{Licht|)}

Anders als im letzten Beispiel verwenden wir nun die eigens definierten Attribute emph und important.

\section{Einträge mit Attributen}
Stellen mit formatierten Seitenzahlen\index{Eintrag|important}
\lipsum\lipsum
Hier soll die Seitenzahl kursiv hervorgehoben werden\index{Eintrag|emph}
\lipsum
Hier beginnt ein Bereich über Licht\index{Licht|(important}
\lipsum\lipsum\lipsum
\textbf{Und hier endet der Bereich wieder}\index{Licht|)important}
\section{Korrekte Sortierung?}
Werden diese Einträge richtig sortiert?
\index{Affe}
\index{Äffchen}
\index{Aerodynamik}
\index{$a^2+b^2=c^2$}
\index{3D-Brille}
\index{\%-Werte}
\index{Ohm, Georg Simon}
\index{Ørsted, Hans Christian}
\index{Oxford}
\index{\textsc{öpnv}}
\index{Wellen!Elektromagnetische}
\index{Wellen!-berg}
\index{Wellen!-tal}
\index{Wellen!Teilchen-}
\lipsum
 
Eintrag mit manueller Sortierung\index{a-Strahlung@$\alpha$-Strahlung}
\lipsum
 
\section{Verweise auf andere Einträge}
Verweise auf andere Einträge (an einer Stelle im Dokument sammeln!)
\index{Prozent-Werte|see{\%-Werte}}
\index{Pythagoras, Satz von|see{$a^2+b^2=c^2$}}
\index{Satz von Pythagoras|see{$a^2+b^2=c^2$}}
\index{Licht|seealso{Wellen!Elektromagnetische}}

Außerdem fügen wir noch einen Abschnitt mit anderer Seitenzählung an: Die Art der Seitennummerierung ändern wir mit dem Befehl \pagenumbering, der automatisch eine neue Seite beginnt und den Zähler auf Eins zurück setzt.

(siedenote: Das Seitenzahlenformat gibt man als Argument an, wobei arabic, alph, Alph, roman, Roman und theoretisch auch fnsymbol benutzt werden können.)

\pagenumbering{Roman}% Seitenzählung ab hier = I, II, III, IV, ...
\section{Seitenzahlen mit anderer Klasse}
Hier geht es um einen Eintrag\index{Eintrag}
\lipsum\lipsum\lipsum\lipsum
Hier geht es um einen Eintrag\index{Eintrag|(}
\lipsum\lipsum
Hier geht es um einen Eintrag\index{Eintrag|)}
\printindex
 
\end{document}