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 !

Mir ist ein kleiner aber unschöner Fehler bei der Verwendung der besseren Version zusammen mit der KOMA-Option listof=entryprefix aufgefallen. Im Abb.- und Tab.-Verzeichnis des Anhangs erscheint ein Alot, statt den gewollten Bezeichnungen Tabelle bzw. Abbildung. Wie kann man das beheben?

\documentclass[listof=totoc,index=totoc,listof=entryprefix]{scrbook}
 
\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} 

Das entspricht dem dokumentierten Verhalten, ist aber leicht änderbar.

Der Befehl \DeclareNewTOC kennt noch eine ganze Reihe weiterer Optionen. Zuständig für die Präfixe der Listeneinträge ist name. Wird diese Option nicht explizit angegeben, dann wird dafür der Wert der Option type genutzt. Wird dieser auch nicht vorgegeben, dann wird die Dateierweiterung genommen. Im Beispiel werden also alof bzw. alot jeweils auch für die fehlenden Optionen type und name verwendet. Deshalb liefert \listofalofentryname den Präfix "Alof".

Ändern lässt sich das beispielsweise mit

\def\listofalofentryname{\listoflofentryname}
\def\listofalotentryname{\listoflotentryname}

in der Präambel. Aber es lassen sich natürlich auch eigene sprachabhängige Präfixe definieren:

\providecaptionname{ngerman}{\listofalofentryname}{Abb. im Anhang}
\providecaptionname{ngerman}{\listofalotentryname}{Tab. im Anhang}

Alternativ könnte man auch die Option name für die neuen Verzeichnisse setzen:

\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
  name=\noexpand\listoflofentryname% Präfix der Verzeichniseinträge
]{alof}% Dateierweiterung (a=appendix, lof=list of figures)
\DeclareNewTOC[%
  listname={Tabellen im Anhang},% Titel des Verzeichnisses
  name=\noexpand\listoflotentryname% Präfix der Verzeichniseinträge
]{alot}% Dateierweiterung (a=appendix, lot=list of tables)

Die Option type sollte dagegen nicht geändert werden, da type Bestandteil weiterer Befehlsnamen ist, die im Zusammenhang mit \DeclareNewTOC definiert werden.

Vielen Dank. Funktioniert einwandfrei.

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