Menu

HowTo_AppendixToC

Wie man den Anhang mit eigenen Verzeichnissen versehen kann

Das grundsätzliche Vorgehen zur Aufspaltung eines Verzeichnisses wurde ja bereits in „Wie man Teile (\part) mit einem eigenen Inhaltsverzeichnis versehen kann“ vorgestellt. Für eine komplette Lösung mit eigenem Inhaltsverzeichnis, eigenem Abbildungsverzeichnis und eigenem Tabellenverzeichnis am Anfang des Anhangs kann man diese Lösung weiter ausbauen und auch ein wenig modifizieren.

Wie in obigem Beitrag bereits erwähnt, seit KOMA-Script v3.23 die Hilfsdatei, die für das Inhaltsverzeichnis verwendet wird, über das Makro \ext@toc bestimmt. Beim Abbildungsverzeichnis war das ohnehin schon immer über \ext@figure und beim Tabellenverzeichnis über \ext@table definiert. Diese Makros kann man auch innerhalb des Dokuments umdefinieren.

Das Paket tocbasic, das von allen KOMA-Script-Klassen verwendet wird, bietet darüber hinaus mit \DeclareNewTOC die Möglichkeit, neue Verzeichnisse zu definieren. Diese haben in der Voreinstellung den Besitzer oder die Kategorie float. Diese Einstellung wird auch für das Abbildungsverzeichnis und das Tabellenverzeichnis verwendet. Für Gleitumgebungsverzeichnisse im Anhang kann man diese einfach beibehalten:

\DeclareNewTOC[%
  name=\listoflofentryname,
  listname={Abbildungen im Anhang},% Titel des Verzeichnisses
]{alof}% Dateierweiterung (a=appendix, lof=list of figures)
\DeclareNewTOC[%
  name=\listoflotentryname,
  listname={Tabellen im Anhang},% Titel des Verzeichnisses
]{alot}% Dateierweiterung (a=appendix, lot=list of tables)

Option name hat übrigens nur Auswirkungen, wenn die Klassenoption listof=entryprefix verwendet wird, wovon ich schon aus typografischen Gründen dringend abrate.

Für das neue Inhaltsverzeichnis sollte hingegen ein abweichender Besitzer gewählt werden. Das normale Inhaltsverzeichnis von \tableofcontents verwendet den Besitzer ToC. Daher verwenden wir das auch hier:

\DeclareNewTOC[%
  owner=ToC,% gleiche Einstellung wie für \tableofcontents
  listname={Inhalt des Anhangs},% Titel des Verzeichnisses
]{atoc}% Dateierweiterung (a=appendix, toc=table of contents)

Sollen die Verzeichnisse im Anhang eher nicht auf Optionen der Klassen oder andere Einstellungen, die vom Besitzer bzw. der Kategorie abhängen, reagieren, so kann man natürlich, beispielsweise mit owner=appendix auch eine eigene Kategorie vorgeben.

Die Dateierweiterungen in obigen Beispielen wurden übrigens willkürlich gewählt. Die Kommentare geben lediglich an, was ich mir dabei gedacht habe.

Nun können diese neuen Verzeichnisse also verwendet werden. Für die Umschaltung ist eine weitere Anweisung sinnvoll:

\newcommand*{\useappendixtocs}{%
  \renewcommand*{\ext@toc}{atoc}%
  \scr@ifundefinedorrelax{hypersetup}{}{% damit es auch ohne hyperref funktioniert
    \hypersetup{bookmarkstype=atoc}%
  }%
  \renewcommand*{\ext@figure}{alof}%
  \renewcommand*{\ext@table}{alot}%
}

Die Besonderheit an dieser Stelle stellt \hypersetup{bookmarkstype=atoc} dar. Das Paket hyperref bzw. dessen empfehlenswerte Erweiterung bookmark, die von den KOMA-Script-Klassen ohnehin geladen wird, verwendet normalerweise die Einträge in die Hilfsdatei mit der Endung toc für die Bookmarks (aka Outlines, aka Lesezeichen, aka PDF-Inhaltsverzeichnis, aka Jeder-nennt-das-anders). Sobald wir auf die Endung atoc umschalten, werden für die Einträge in das Anhangsinhaltsverzeichnis also keine Bookmarks mehr erzeugt (Links im Anhangsinhaltsverzeichnis gibt es natürlich trotzdem). Über Option bookmarkstype kann man hyperref aber mitzuteilen, dass nun die Einträge in die Hilfsdatei mit der angegeben Endung für die Bookmarks verwendet werden. Wer also nicht will, dass die Einträge in das Anhangsverzeichnis in den Bookmarks auftauchen, der löscht diese zusätzlichen Zeilen.

Es ist sicher auch sinnvoll, zusätzlich einen Weg zurück zum Hauptinhaltsverzeichnis zu ermöglichen. Beispielsweise wird man ein Literaturverzeichnis oder einen Index eher nicht im Anhang, sondern – wenn überhaupt – im Hauptinhaltsverzeichnis aufgeführt haben wollen.

\newcommand*{\usestandardtocs}{%
  \renewcommand*{\ext@toc}{toc}%
  \scr@ifundefinedorrelax{hypersetup}{}{% damit es auch ohne hyperref funktioniert
    \hypersetup{bookmarkstype=toc}%
  }%
  \renewcommand*{\ext@figure}{lof}%
  \renewcommand*{\ext@table}{lot}%
}

Auch hier wurde neben der reinen Umschaltung der Dateiendungen auch die Auswirkung auf hyperref berücksichtigt.

Oben habe ich schon einmal Option listof=entryprefix erwähnt. Die schaltet auch bei den KOMA-Script-Klassen auch Option listof=flat. Und leider geschieht das über \if@dynlist nicht nur für die Verzeichnisse des Besitzers oder der Kategorie float, sondern für alle Verzeichnisse. Für das Inhaltsverzeichnis wird dann explizit stattdessen \if@tocleft verwendet. Das hat zur Folge, dass mit dem bisherigen Code listof=flat auch für atoc verwendet wird. Das kann man aber einfach beheben:

\AfterTOCHead[atoc]{%
  \let\if@dynlist\if@tocleft
}

Hier wird nun die Einstellung für das Hauptinhaltsverzeichnis auch für atoc, also das Inhaltsverzeichnis des Anhangs übernommen. Natürlich kann man stattdessen auch \@dynlistfalse oder \@dynlisttrue verwenden, um explizit die flache Darstellung aus- oder einzuschalten.

Jetzt kann man also bereits zwischen den Hauptverzeichnissen und den Anhangsverzeichnissen hin- und her schalten und die neuen Verzeichnisse auch direkt ausgeben. In welcher Form die Verzeichnisse ausgegeben werden, kann über Option listof (nur für die Gleitumgebungsverzeichnisse) oder über \setuptoc und \unsettoc jederzeit bestimmt werden. Näheres zu der Option und den beiden Anweisungen ist der KOMA-Script-Anleitung zu entnehmen. An dieser Stelle sei außerdem empfohlen, die oben verwendeten KOMA-Script-Anweisungen in der Anleitung nachzulesen. Über das Index sind sie nicht schwer zu finden.

Bevor ich ein vollständiges Beispiel mit obigem Code zeige, sei noch darauf hingewiesen, dass dies alles ohne das Paket appendixtoc und natürlich auch ohne das nie offiziell unterstützte Alpha-Paket tocstyle funktioniert. Auch die Verwendung anderer Anhangspakete kann prinzipiell Auswirkungen auf die Funktionsfähigkeit der Lösung haben. Natürlich setzt die Lösung auch voraus, dass nicht beispielsweise per \addcontentsline{toc}{…} oder \addcontentsline{lot}{…} direkt in die Hilfsdateien geschrieben wird. Für die Gleitumgebungen sollte stattdessen beispielsweise \addcontentsline{\ext@table}{…} verwendet werden. Für Einträge ins Inhaltsverzeichnis kann man bei den KOMA-Script-Klassen statt \addcontentline{\ext@toc}{…} einfach die Anweisung \addparttocentry, \addchaptertocentry etc. verwenden, die in der Anleitung dokumentiert sind.

Hier nun ein vollständiges Beispiel:

\documentclass[listof=totoc,index=totoc]{scrbook}[2021/04/30]
\usepackage{iftex}
\iftutex
  \usepackage{fontspec}
\else
  \usepackage[T1]{fontenc}
  \usepackage{lmodern}
\fi
\usepackage[ngerman]{babel}% oder auch \usepackage[german]{babel} mit aktuellem babel

\usepackage{makeidx}\makeindex% Nur als Beispiel

\usepackage{mwe}
\usepackage{hyperref}% Um die Auswirkungen/Notwendigkeiten für hyperref zu zeigen.
\usepackage{bookmark}% Weil das hyperref deutlich verbesser.

\DeclareNewTOC[%
  owner=ToC,% gleiche Einstellung wie für \tableofcontents
  listname={Inhalt des Anhangs},% Titel des Verzeichnisses
]{atoc}% Dateierweiterung (a=appendix, toc=table of contents)
\DeclareNewTOC[%
  name=\listoflofentryname,% im Beispiel unerheblich
  listname={Abbildungen im Anhang},% Titel des Verzeichnisses
]{alof}% Dateierweiterung (a=appendix, lof=list of figures)
\DeclareNewTOC[%
  name=\listoflotentryname,% im Beispiel unerheblich
  listname={Tabellen im Anhang},% Titel des Verzeichnisses
]{alot}% Dateierweiterung (a=appendix, lot=list of tables)

\makeatletter
\newcommand*{\useappendixtocs}{%
  \renewcommand*{\ext@toc}{atoc}%
  \scr@ifundefinedorrelax{hypersetup}{}{% damit es auch ohne hyperref funktioniert
    \hypersetup{bookmarkstype=atoc}%
  }%
  \renewcommand*{\ext@figure}{alof}%
  \renewcommand*{\ext@table}{alot}%
}
\newcommand*{\usestandardtocs}{%
  \renewcommand*{\ext@toc}{toc}%
  \scr@ifundefinedorrelax{hypersetup}{}{% damit es auch ohne hyperref funktioniert
    \hypersetup{bookmarkstype=toc}%
  }%
  \renewcommand*{\ext@figure}{lof}%
  \renewcommand*{\ext@table}{lot}%
}
\AfterTOCHead[atoc]{%
  \let\if@dynlist\if@tocleft% oder \@dynlistfalse oder \@dynlisttrue
}
\makeatother

\AddToHook{\KOMAClassName/appendix}{% Bei \appendix alles automatisch machen:
  \addpart{\appendixname}% - Eintrag ins Hauptinhaltsverzeichnis
  \useappendixtocs% - Umschaltung auf Anhangsverzeichnisse
  \listofatocs% - Inhaltsverzeichnis für den Anhang ausgeben
  \listofalofs% - Abbildungsverzeichnis für den Anhang ausgeben
  \listofalots% - Tabellenverzeichnis für den Anhang ausgeben
}

\begin{document}
\tableofcontents
\listoffigures
\listoftables
\blinddocument

\begin{figure}[!h]
\centering
\rule{5cm}{2cm}
\caption{test-fig-main}
\end{figure}

\begin{table}[h]
\caption{test-tab-main\index{main}}
\noindent
\centering
\begin{tabular}{|c|c|}
\hline
a & b\tabularnewline
\hline\hline
1 & 2\tabularnewline
\hline
\end{tabular}
\end{table}

\appendix
\blinddocument

\begin{figure}[!h]
\centering
\rule{5cm}{2cm}
\caption{test-fig-appendix}
\end{figure}

\begin{table}[h]
\caption{test-tab-appendix}
\noindent
\centering
\begin{tabular}{|c|c|}
\hline
a & b\tabularnewline
\hline\hline
1 & 2\tabularnewline
\hline
\end{tabular}
\end{table}

\usestandardtocs
\bookmarksetup{startatroot}% siehe bookmark-Anleitung
\printindex% nur als Beispiel

\end{document}

Im Beispiel wurde übrigens absichtlich makeidx und nicht imakeidx verwendet. Zum einen reagiert imakeidx nicht auf KOMA-Script-Option index=totoc. Statdessen müsste man \makeindex[intoc} verwenden. Zugleich schreibt imakeidx den Inhaltsverzeichniseintrag immer per \addcontentsline{toc}{…}. Der Eintrag für den Index würde also ohnehin nicht im Anhangsverzeichnis landen. Somit bräuchte man auch kein \usestandardtocs. Ich wollte aber den Sinn dieser Anweisung zeigen, der deutlich wird, wenn man sie in obigem Beispiel versuchsweise auskommentiert und zwei neue LaTeX-Läufe durchführt. MakeIndex braucht man hingegen nicht erneut aufzurufen, wenn der Index bereits für das unveränderte Beispiel erzeugt wurde.

Für die Standardklassen würde es übrigens nicht genügen, tocbasic zu laden, um obigen Code anwenden zu können. Zum einen schreiben diese Klassen immer hart in die Hilfsdatei toc. Innerhalb von \@chapter wird außerdem hart in lof und lot geschrieben statt dort korrekt \ext@figure und \ext@table zu verwenden. Für diese Klassen wäre es also notwendig \addtocontents zu patchen. Das ist natürlich möglich und kann im Zusammenspiel mit einigen Paketen sogar bei Verwendung einer KOMA-Script-Klasse sinnvoll sein. Ein solcher Patch könnte dann so aussehen (ungetestet):

\ExplSyntaxOn
\NewCommandCopy{\appendixtoc_saved_addtocontents:nn}{\addtocontents}
\RenewDocumentCommand{\addtocontents}{m+m}{%
  \exp_args:Ne \appendixtoc_saved_addtocontents:nn
    {
      \str_case:enF {#1}
        {
          {toc} {\ext@toc}
          {lot} {\ext@table}
          {lof} {\ext@figure}
        } {#1}
    } {#2}
}
\ExplSyntaxOff

Related

Wiki (Deutsch): HowTo_PartToC
Wiki (Deutsch): HowTo_ToCConfiguration