Sie sind hier

Inhaltsverzeichnis anpassen

Nachdem ich nun auf alle meine Probleme - dank geduldiger Hinweise von Markus Kohm persönlich - eine Antwort gefunden habe, wollte ich dieselbe hier präsentieren.

Eine Warnung vorweg: die Anpassung des Inhaltsverzeichnisses ist in bestimmten Punkten aus typographischer Sicht möglicherweise fragwürdig. Wird allerdings, z.B. vom Verlag, eine bestimmte Formatierung vorgegeben, so kann man meist nichts machen.

Für größere Änderungen und weitgehende Anpassungen empfehle ich das Paket tocloft. Es ermöglicht eine sehr große Kontrolle über sämtliche Darstellungen im Inhaltsverzeichnis. Probleme bei der Verwendung mit KOMA-Script habe ich keine bemerkt. Der einzige Nachteil dieses Paketes ist, daß die Standardeinstellung recht deutlich von der sonst gewohnten abweicht, und man somit einige Zeit investiert, um den Originalzustand wieder zu erreichen.

Möchte man nur einige Anpassungen vornehmen, so ist eine Umdefinierung der Befehle meist der schnellere Weg.

Dazu sucht man sich den Originalbefehl aus

  • der Dokumentklasse (z.B. scrbook unter texmf/tex/latex/koma-script/scrbook.cls)
  • dem verwendeten Paket (z.B. makeindex unter texmf/text/latex/base/makeidx.sty)
  • dem LaTeX-Kern (latex.ltx unter texmf/tex/latex/base/latex.ltx)

Einfach nach \newcommand{befehl}, \newcommand*{befehl}, \renewcommand{befehl}, \renewcommand*{befehl} (alles für die Dokumentklasse) oder \def{befehl} (für den LaTeX-Kern) suchen, oder direkt nach dem Befehlsnamen.
Dann muß der gesamte Befehl in die Dokumentpräambel kopiert werden und zwischen \makeatletter und \makeatother eingeschlossen werden. Das Befehlsende erkennt man sicher durch Abzählen der geschweiften Klammern - es müssen genausoviele öffnende wie schließende Klammern vorhanden sein - oder durch die Formatierung/Einrückung. Wenn nicht, wird LaTeX beim Kompilieren meckern. \newcommand muß noch in \renewcommand umgeändert werden, und ein kurzer Testlauf (2x, um das geänderte Inhaltsverzeichnis auch einzubinden) zeigt, ob noch alles funktioniert.

Dann muß man sich den Befehl so umdefinieren, daß das gewünschte Ergebnis erreicht wird. Dies zeigt sich am besten an einigen Beispielen:

Kapitel sollen nicht-fette oder gar keine Seitenzahlen erhalten:
Der entsprechende Befehl heißt \l@chapter. Die Seitenzahl ist der Parameter 2, also muß in der Definition statt \@pnumwidth{\hss #2} ein \@pnumwidth{\hss \normalfont #2} oder \@pnumwidth{\hss} stehen. Da \hss #2 in geschweiften Klammern eingeschlossen ist, wirkt sich diese Änderung auch nur auf die Seitenzahl aus und propagiert nicht durch die weitere Darstellung.

Vorwort und Index sollen keine Numerierung, aber Pünktchen erhalten. Die übrigen Kapitel sollen jedoch unverändert bleiben:
Dieses Beispiel ist etwas trickreich. Index und Vorwort werden als Kapitel gesetzt. Da das Inhaltsverzeichnis jedoch in einem Rutsch geschrieben wird, ist zwischendurch keine Umdefinierung von \l@chapter möglich. Der Trick ist, Index und Vorwort im Inhaltsverzeichnis als andere Ebene, z.B. subsection, zu setzen. Diese Ebene darf natürlich nicht im Dokument verwendet werden! Dies entspricht zwar nicht der Semantik, aber das Aussehen stimmt. Als erstes ein neuer Befehl dafür:
\newcommand{\achapter}[1]{\addchap*{#1}\addtocontents{toc}{\protect\vspace{1em}}\addcontentsline{toc}{subsection}{#1}}
Im Dokument erscheint also ein Kapitel, im Inhaltsverzeichnis eine subsection. Da normalerweise eine subsection direkt unter einer section steht, wie es der Logik entspricht, benutzen wir \protect\vspace{1em}, um einen Abstand zu erzwingen (derselbe wie zwischen zwei Kapiteln).
Dann muß das makeidx-Paket dazu gebracht werden, statt des normalen Kapitel-Befehls unseren zu verwenden. Dazu dient die Umdefinition des Befehls \idx@heading, in dem einfach \chapter durch \achapter ersetzt wird.
Das Vorwort ist einfacher zu handhaben, hier wird statt \chapter{Vorwort} nur \achapter{Vorwort} geschrieben. Keine Umdefinierung nötig :)
Nun müssen wir nur noch die Formatierung der subsection im Inhaltsverzeichnis anpassen. Standardmäßig sind sie eingerückt und in normaler Schrift, hier sollen sie wie Kapitelüberschriften nichteingerückt und fett erscheinen. Alle Gliederungsebenen unter Kapitel werden mittels \@dottedtocline gesetzt. Die übergebenen Argumente legen dabei die Einrückung und die horizontale Platzverteilung fest. Argument eins gibt die semantische Tiefe an, d.h. ob der Eintrag als Kapitel, section, ... gesehen werden soll. Dies ist wichtig für den Befehl \tocdepth. Da logisch unser Vorwort und der Index Kapitel sind, ist der Eintrag hier 0. Argument zwei gibt den Einzug, auch hier ist 0em gewünscht. Argument drei gibt die Breite der Abschnittsnumerierung an. Da im Regelfall weder Vorwort noch Index eine solche bekommen, kann man diesen Wert ebenfalls auf 0em setzen. Der Befehl für die unteren Gliederungsebene lautet \l@subsection (und natürlich \l@section, ...), und wir erhalten:
\renewcommand*\l@subsection{\@dottedtocline{0}{0em}{0em}}.
Damit ist der Einzug wie gewünscht. Das letzte ist die fette Darstellung. Dazu muß man sich den Befehl \@dottedtocline neu definieren. Da aber nur die subsection fett werden soll, aber alle unteren Ebenen mit \@dottedtocline gesetzt werden, muß man die Definition kopieren und umbenennen, z.B. in \@mydottedtocline. Argument vier gibt den Titel an, wir ändern also {#4} in {\bfseries #4}. Auch hier stellen die geschweiften Klammern sicher, daß Formatieranweisungen sich nur auf den Titel auswirken.

Weitere Änderungen lassen sich in ähnlicher Weise erreichen. Das Beispiel mag kein guter LaTeX-Code sein, aber es funktioniert für mich. Wenn sich Fehler eingeschlichen haben, bitte ich um eine Korrektur.

Man sollte aber nicht vergessen, daß sich viele Änderungen (insbesondere bei der Numerierung der Abschnitte) einfach mittels \addtokomafont und \renewcommand{\thesection} erreichen lassen! Dies ist nicht nur schneller und besser geschehen, bei einer neuen Version eines Paketes ändern sich solche Schnittstellen auch nicht, während die Definitionen angepasst werden können. Dazu muß man die ausführliche KOMA-Script-Dokumentation lesen, empfehlenswert ist auch das LaTeX-Kochbuch die Anleitung l2kurz. Auch nützlich ist das Paket chngcntr, welches erlaubt, Zähler mit anderen Zählern zurückzusetzen - oder eben nicht. Damit kann man z.B. den section-Zähler nicht mit einem neuen Kapitel zurücksetzen lassen, einfach durch den Befehl \counterwithout{section}{chapter}.

Mein Dank gilt allen Leuten, die guten Satz am Rechner für den Normalanwender ermöglichen: Donald Knuth, Leslie Lamport, Markus Kohm und den vielen anderen Paketautoren und -mitautoren, Helfern und fleißigen Fragenbeantwortern. Danke!

Update 3. April: Link auf das Kochbuch herausgenommen und einen auf l2kurz, welches sich explizit auf LaTeX2e bezieht, eingefügt.

Bild von Markus Kohm

Es handelt sich dabei um eine Anleitung zu LaTeX2.09. Seit 1994 ist aber LaTeX2e das aktuelle LaTeX. Wer sich nach dem Kochbuch richtet, wird daher zwangsläufig einigen Unsinn produzieren.

Statt \l@subsection zu missbrauchen, sollte man mal darüber nachdenken, eine eigene Gliederungsebene zu definieren.

Hallo,

der Beitrag ist zwar schon etwas älter, aber meine Frage passt sehr gut hier her, wie ich finde.

*edit* Und ich sehe gerade viel zu spät, dass ich gar nicht im Forum bin, sorry. Ich hoffe, das geht irgendwie klar. Verschieben?

Ich habe im Quellcode von scrbook.cls erfolgslos nach der Einstellung dafür gesucht, wie die subsection ins Inhaltsverzeichnis eingetragen wird. Da \addtokomafont auf dieser Ebene nicht greift, frage ich mich, ob ich irgendwas anderes unternehmen kann, um dieses Element kursiv zu setzen.?

Danke im Voraus
Liebe Grüße

Nohrah

Bild von Markus Kohm

Schau Dir mal das Paket tocstyle an. Es gibt dazu auch ein paar Einträge hier. War übrigens reines Glück, dass ich den Eintrag im Blog angeschaut habe.

Comments for "Inhaltsverzeichnis anpassen" abonnieren