Sie sind hier

Anhangverzeichnis mit eigenem Abbildungs-, Tabellenverzeichnis

Hallo,

beim Versuch ein Dokument mit separaten Verzeichnissen für den Anhang zu erstellen, bin ich auf diesen Beitrag gestoßen, in dem das Problem eines eigenen TOC für den Anhang gelöst wird:
http://www.komascript.de/node/458#comment-5575

Nun möchte ich zusätzlich, dass die Abbildungen und Tabellen, für Hauptdokument (main) und Anhang (appendix), in eigenen Verzeichnissen aufgeführt sind, und diese im jeweiligen TOC erscheinen.

Markus schrieb:

Vermutlich würde ich das aber nicht auf diesem Weg machen, sondern einfach neue Verzeichnisse mit \DeclareNewTOC definieren und in \appendix die Makros \ext@figure und \ext@table entsprechend umdefinieren. Den Verzeichniseintrag gibt es dann quasi als Zugabe von listof=totoc automatisch.

Dafür reichen meine Fähigkeiten noch nicht aus. Ich bitte um Hilfe.

Das folgende Beispiel ist dem o. g. Beitrag entnommen und wurde um Beispiele (fig/tab) ergänzt.

In meinem Dokument verwende ich liststotoc als \documentclass Option um Abbildungs- und Tabellenverzeichnis im Inhaltsverzeichnis aufzuführen. Im Beispiel-Code wird mit dieser Option nach jedem Verzeichnis zusätzlich eine Seite mit dem Verzeichnisnamen beschriftet, desshalb hier ohne.

% Dieses Beispiel wurde abgeleitet von `appendixtocexample.tex'.
% Copyright der Originaldatei: (c) Markus Kohm, 2010-2013
% Die Original-Datei steht unter LPPL und ist zu finden unter
% <https://komascript.de/comment/3447#comment-3447>.
% Zu den rechtlichen Bedingungen der Weitergabe dieser Datei
% siehe die dortigen Hinweise.
\documentclass{scrbook}% bliebige Standard- oder KOMA-Script-Klasse
\usepackage[ngerman]{babel}
\usepackage{blindtext, hyperref}
 
% [Admin-Note: Zu frühes Laden von appendixtoc entfernt.]
% Wir wollen das Anhangsverzeichnis im Inhaltsverzeichnis, also sorgen wir
% dafür, dass das Paket tocbasic geladen ist (auch, wenn keine
% KOMA-Script-Klasse verwendet wird). Das muss unbedingt _vor_ dem Laden von
% appendixtoc passieren!
\usepackage{tocbasic}
% [Admin-Note: Paketcode des Originals entfernt.]
\usepackage{appendixtoc}% siehe <https://komascript.de/comment/3447#comment-3447>
\setuptoc{appendix}{totoc}% dank tocbasic geht das jetzt so einfach
 
\begin{document}
\tableofcontents
\listoffigures
\listoftables
\blinddocument
 
% Es folgen Modifikationen des Originalcodes:
\begin{figure}[!h]
\centering
\rule{5cm}{2cm}
\caption{test-fig-main}
\end{figure}
 
\begin{table}[h]
  \caption{test-tab-main}
  \noindent
  \centering
    \begin{tabular}{|c|c|}
      \hline
      a & b\tabularnewline
      \hline\hline
      1 & 2\tabularnewline
      \hline
    \end{tabular}
\end{table}
 
\appendix
\listoffigures
\listoftables
\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}
 
\postappendix
\makeatletter
\@ifundefined{addchap}{%
  \@ifundefined{addsec}{%
    \@ifundefined{chapter}{%
      \section*{Testabschnitt halbwegs nach dem Anhang}%
      \addcontentsline{toc}{section}{Testabschnitt halbwegs nach dem Anhang}%
    }{%
      \chapter*{Testkapitel halbwegs nach dem Anhang}
      \addcontentsline{toc}{chapter}{Testkapitel halbwegs nach dem Anhang}%
    }%
  }{%
    \addsec{Testabschnitt halbwegs nach dem Anhang}%
  }%
}{%
  \addchap{Testkapitel halbwegs nach dem Anhang}%
}
\makeatother
\blindtext
 
\end{document}

mfG

[Admin-Edit:] Der unter Verstoß gegen die Lizenz angegebene Code wurde abgeändert, um Übereinstimmung mit der Lizenz zu erreichen.

Gleich vorab sei erwähnt, dass Option liststotoc veraltet ist und nicht mehr verwendet werden sollte. Außerdem sollte ein vollständiges Minimalbeispiel, das sich mit einem Verzeichnisproblem befasst, natürlich wichtige Optionen wie listof=totoc, die Verzeichniseinträge betreffen, auch enthalten.

Das grundsätzliche Vorgehen wurde übrigens bereits in meiner Antwort zur Frage »Inhaltsverzeichnis aufsplitten« gezeigt.

Seit der KOMA-Script Pre-Release v3.23.2600 kann man nicht nur die Endung der Hilfsdateien für Abbildungen und Tabellen, sondern auch die Endung der Hilfsdatei für das Inhaltsverzeichnis einfach ändern. Für Abbildungen ist diese bekanntlich im Makro \ext@figure gespeichert, für Tabellen in \ext@table. Für das Inhaltsverzeichnis wurde der Makroname \ext@toc gewählt.

Das Paket tocbasic, das von allen KOMA-Script-Klassen verwendet wird, bietet mit \DeclareNewTOC die Möglichkeit, neue Verzeichnisse zu definieren. Diese haben in der Voreinstellung den Besitzer float, also denselben Besitzer, den auch die Verzeichnisse der Gleitumgebungen figure und table haben. Für die Gleitumgebungsverzeichnisse im Anhang kann dieser also einfach beibehalten werden:

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

Für das neue Inhaltsverzeichnis ist es hingegen sinnvoll, einen anderen Besitzer zu wählen. Ich verwende hier willkürlich den Besitzer \jobname:

\DeclareNewTOC[%
  owner=\jobname,
  listname={Inhalt des Anhangs},% Titel des Verzeichnisses
]{atoc}% Dateierweiterung (a=appendix, toc=table of contents)

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

Es fehlt nun min. eine Anweisung, mit der von den normalen Endungen toc, lof und lot auf die Anhangsendungen umgeschaltet werden kann:

\newcommand*{\useappendixtocs}{%
  \renewcommand*{\ext@toc}{atoc}%
  \renewcommand*{\ext@figure}{alof}%
  \renewcommand*{\ext@table}{alot}%
}

Wer mag, kann auch eine Anweisung für den Weg zurück definieren:

\newcommand*{\usestandardtocs}{%
  \renewcommand*{\ext@toc}{toc}%
  \renewcommand*{\ext@figure}{lof}%
  \renewcommand*{\ext@table}{lot}%
}

Jetzt kann man 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.

\documentclass[listof=totoc,index=totoc]{scrbook}[2017/02/23]
\usepackage{ifxetex,ifluatex}
\ifcase \ifxetex 1\else\ifluatex 1\else 0\fi\fi\usepackage[utf8]{inputenc}\fi
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{lmodern}
 
\usepackage{makeidx}\makeindex% Nur als Beispiel
 
\usepackage{mwe}
\usepackage{hyperref}% Weil es so in der Frage enthalten war.
\usepackage{bookmark}% Weil das hyperref deutlich verbesser.
 
\DeclareNewTOC[%
  owner=\jobname,
  listname={Inhalt des Anhangs},% Titel des Verzeichnisses
]{atoc}% Dateierweiterung (a=appendix, toc=table of contents)
\DeclareNewTOC[%
  listname={Abbildungen im Anhang},% Titel des Verzeichnisses
]{alof}% Dateierweiterung (a=appendix, lof=list of figures)
\DeclareNewTOC[%
  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}%
}
\ifundefinedorrelax{ext@toc}{%
  \newcommand*{\ext@toc}{toc}
  \renewcommand{\addtocentrydefault}[3]{%
    \expandafter\tocbasic@addxcontentsline\expandafter{\ext@toc}{#1}{#2}{#3}%
  }
}{}
\makeatother
 
\usepackage{xpatch}
\xapptocmd\appendix{%
  \addpart{\appendixname}
  \useappendixtocs
  \listofatocs
  \listofalofs
  \listofalots
}{}{}
 
 
\begin{document}
\tableofcontents
\listoffigures
\listoftables
\blinddocument
 
% Es folgen Modifikationen des Originalcodes:
\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}

Wer den Code aufmerksam liest, dem wird auffallen, dass ich gegenüber der Erklärung oben noch zwei Erweiterungen vorgenommen habe. Da ist zum einen zweimal eine Zeile der Art:

  \hypersetup{bookmarkstype=…}%

Das Paket hyperref bzw. dessen Erweiterung bookmark 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 beiden Zeilen.

Außerdem habe ich noch die Zeilen

\ifundefinedorrelax{ext@toc}{%
  \newcommand*{\ext@toc}{toc}
  \renewcommand{\addtocentrydefault}[3]{%
    \expandafter\tocbasic@addxcontentsline\expandafter{\ext@toc}{#1}{#2}{#3}%
  }
}{}

eingefügt. Diese patchen in frühere Versionen von KOMA-Script wenigstens teilweise die Verwendung von \ext@toc. Besser ist jedoch die Warnung ernst zu nehmen, die man erhält, wenn man eine KOMA-Script-Klasse verwendet, die noch nicht auf die Verwendung von \ext@toc vorbereitet ist.

Abschließend sei noch erwähnt, dass nur solche Inhaltsverzeichniseinträge im Anhangsinhaltsverzeichnis landen, die nicht an KOMA-Script (vor allem tocbasic) vorbei vorgenommen wurden. Mit direkten Aufrufen von \addcontentsline{toc}{…}{…} schreibt man natürlich auch im Anhang weiterhin in das Hauptinhaltsverzeichnis. Ebenso werden nur solche Gleitumgebungseinträge in das entsprechende Anhangsverzeichnis geschrieben, die korrekt die von LaTeX vorgesehenen Makros \ext@figure und \ext@table verwenden. Enthält ein Paket ein hart codiertes \addcontentsline{lot}{table}{…} an Stelle eines \addcontentsline{\ext@table}{table}{…} wie das beim beliebten longtable der Fall ist, so geht das natürlich ebenfalls in die Hose. Solche Bugs sollte man ggf. an den Autor des jeweiligen Pakets melden. Bis das Problem bei longtable behoben ist, kann man einfach zusätzlich caption laden, damit dessen Code für den Verzeichniseintrag verwendet wird, oder zu folgendem Patch greifen:

\usepackage{longtable}
\usepackage{xpatch}
\makeatletter
\xpatchcmd{\LT@c@ption}{%
  \addcontentsline{lot}%
}{%
  \addcontentsline{\ext@table}%
}{}{}
\makeatother

Mit einem aktuellen KOMA-Script geht alles viel einfacher

sieht deutlich eleganter aus.

\addpart{\appendixname} entsprechend der obersten verwendeten Gliederungsebene angepasst, z. B. \addchap{\appendixname}, und dann stimmt die Schriftgröße im TOC auch von allein mit dem Rest überein.
Wobei das einleitende Blatt für den Anhang mit \addpart durch die Zentrierung natürlich besser aussieht.

Vielen Dank für ausführliche Hilfe und Erklärung !

Comments for "Anhangverzeichnis mit eigenem Abbildungs-, Tabellenverzeichnis" abonnieren