4
1

In Anlehnung an die Frage hier möchte ich nun einen Schritt weiter gehen und zwei Inhaltsverzeichnisse erstellen. In dem ersten Inhaltsverzeichnis, was auf dem Deckblatt erscheint, sollen nur die Kapitel aufgelistet werden, uns zwar derart, dass jeder Kapiteleintrag grau unterstrichen ist. Quasi das normale Inhaltsverzeichnis \tableofcontents mit \setcounter{tocdepth}{0} auf Kapitel beschränkt.

Bitte nicht nach dem Sinn Fragen, da ich nur abhängig beschäftigter bin und erkannt habe, dass der Chef immer Recht hat. :-)

Das andere Inhaltsverzeichnis soll das komplette "normale" Inhaltsverzeichnis sein. Habe einmal ein Minimalbeispiel mit etwas Pseudocode erstellt.

Öffne in Overleaf
\documentclass{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage{blindtext}

\begin{document}
% Inhaltsübersicht, in dem nur die Kapitel angezeigt werden sollen. % Jeder Kapiteleintrag soll grau unterstrichen sein.
% \tableofcontents(Overview)  <<-- Pseudo-Code

% Komplettes Inhaltsverzeichnis
\tableofcontents

% Dokument
\Blinddocument
\Blinddocument
\Blinddocument
\end{document}

gefragt 22 Jan '18, 07:24

dzaic's gravatar image

dzaic
63194853
Akzeptiert-Rate: 42%


Bei KOMA-Script kann man neue Verzeichnisse einfach über die Anweisung \DeclareNewTOC aus dem Paket tocbasic erzeugen. Eine Kopie der Kapiteleinträge ist über eine Erweiterung von \addchaptertocentry möglich. Damit könnte beispielsweise folgende Adaption von esdd's Antwort verwendet werden:

Öffne in Overleaf
\documentclass[parskip]{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage{blindtext}
\usepackage{xcolor}

\makeatletter
\newcommand*{\pagenumberboxandgrayline}[1]{%
  \makebox[\@pnumwidth]{\hfill #1}\par\nobreak
  \vspace*{-\ht\strutbox}\hfill
  \llap{\textcolor{gray}{\rule{\textwidth}{.4pt}}}%
}
\let\originaladdchaptertocentry\addchaptertocentry
\renewcommand*{\addchaptertocentry}[2]{%
  \addxcontentsline{ovw}{chapter}[{#1}]{#2}%
  \originaladdchaptertocentry{#1}{#2}%
}
\DeclareNewTOC[%
  types=overview,
  listname=Overview,
  owner=\jobname.tex,
]{ovw}
\BeforeStartingTOC[ovw]{%
  \value{tocdepth}=\chaptertocdepth
  \DeclareTOCStyleEntry[
    pagenumberbox=\pagenumberboxandgrayline
  ]{chapter}{chapter}%
}
\makeatother

\begin{document}
\listofoverview
\tableofcontents
\Blinddocument
\Blinddocument
\Blinddocument
\end{document}

Dabei wird mit \DeclareNewTOC ein neues Verzeichnis \listofoverview mit der Überschrift »Overview« angelegt. Die Hilfsdatei für dieses Verzeichnis hat die Endung ovw. Dann wird durch Erweiterung von \addchaptertocentry dafür gesorgt, dass die Kapiteleinträge auch in diese neue Hilfsdatei geschrieben werden. Für diese Erweiterung hätte man übrigens auch xpatch verwenden können. Mit \BeforeStartingTOC wird für dieses Verzeichnis außerdem tocdepth lokal geändert. Eigentlich ist das aber sogar überflüssig, weil ja ohnehin nur die Kapiteleinträge in dieses zweite Verzeichnis kopiert werden. Gleichzeitig wird aber die pagenumberbox-Eigenstellung für die Kapiteleinträge lokal via \BeforeStartingTOC nur für dieses Verzeichnis geändert, um dort die grauen Linien einzufügen. Die beiden Verzeichnisse sehen dann im Ergebnis so aus:

Kapitelübersicht

Inhaltsverzeichnis

Die verwendeten Befehle \BeforeStartingTOC, \addchaptertocentry, \DeclareNewTOC und \DeclareTOCStyleEntry sind in der KOMA-Script-Anleitung dokumentiert.

Permanenter link

beantwortet 22 Jan '18, 09:04

saputello's gravatar image

saputello
11.1k154365
Akzeptiert-Rate: 51%

bearbeitet 22 Jan '18, 14:42

@saputello Herzlichen Dank. Nebenbei: Als ich deinen Code in mein Dokument integriert habe klappt auch alles wunderbar, bis auf eine Aussnahme: Bei mir erscheint "Overview" in beiden Inhaltsverzeichnissen. Hast Du auf die schnelle eine Idee, woran das liegen könnte?

(22 Jan '18, 09:32) dzaic

@dzaic Als Überschrift des normalen Inhaltsverzeichnisses? Ich bin versucht zu behaupten, dass das gar nicht passieren kann. Aber wenn dem so wäre, würdest Du es ja nicht behaupten. Ich kann mir aber kaum einen Grund vorstellen. Verwendest Du eventuell bibintoc oder ein anderes Inhaltsverzeichnispaket, das in einem Widerspruch zur Verwendung von KOMA-Script steht?

(22 Jan '18, 12:11) saputello
1

@saputello Habe mich ungünstig ausgedrückt: "Overview" erscheint als Kapiteleintrag in beiden Verzeichnissen. Die Überschriften der Verzeichnisse sind beide korrekt, so wie in deinen Bilder dargestellt. Eventuell liegt es daran, dass ich listof = totoc in meiner Optionenliste der Dokumentenklasse scrreprt verwende. Werde es später ausprobieren, muss jetzt leider in eine Sitzung.

(22 Jan '18, 12:37) dzaic

@dzaic Deine Vermutung ist richtig. Wird im optionalen Argument von \DeclareNewTOC die Eigenschaft owner nicht explizit angegeben, dann wird float für diese verwendet. Mit listof=totoc werden aber alle Verzeichnisse mit dem owner float in das Inhaltsverzeichnis eingetragen. Entweder Du legst einen anderen owner für das Verzeichnis ovw fest oder Du fügst nach \DeclareNewTOC noch \unsettoc{ovw}{totoc} ein.

(22 Jan '18, 13:20) esdd

So gut wie jedes Inhaltsverzeichnis, dazu gehören auch das Abbildungs- und das Tabellenverzeichnis, verwendet eine externe Hilfsdatei. Das Einlesen dieser Hilfsdatei geschieht über die LaTeX-Kernanweisung \@starttoc. Als Nebeneffekt öffnet diese Anweisung die Hilfsdatei normalerweise auch unmittelbar zum Schreiben neu. Genau hier liegt das Problem mit mehreren Inhaltsverzeichnissen. Da die Hilfsdatei bereits neu zum Schreiben geöffnet ist, ist sie ab dann leer. Jedes weitere Lesen greift also auf eine leere Datei zu.

Ein Ansatz, ein Verzeichnis mehrfach auszugeben, könnte nun darin bestehen, die Datei bei allem Ausgaben außer der letzten eben nicht zum Schreiben zu öffnen. LaTeX bietet dazu auch bereits einen Ansatzpunkt. In \@starttoc wird nämlich \if@filesw verwendet. Ist dieser Schalter \iffalse, so wird die Datei nicht zum Schreiben geöffnet. Nun könnte man also einfach diesen Schalter mit \@fileswfalse entsprechend setzen. Das hätte aber den Nachteil, dass auch \addtocontents oder \addcontentsline-Anweisungen innerhalb des Verzeichnisses nicht mehr ausgeführt würden. Für den Fall, dass das doch geschehen soll, bietet es sich an, eine Kopie von \@starttoc zu schaffen, bei der lediglich das eine \if@filesw, das für das Neuanlegen der Hilfsdatei sorgt, durch \iffalse zu ersetzen:

Öffne in Overleaf
\LetLtxMacro{\@startoverview}{\@starttoc}
\xpatchcmd{\@startoverview}{\if@filesw}{\iffalse}{}{}

\LetLtxMacro ist dabei eine sicherere Variante von \let mit Hilfe des Pakets letltxmacro. In diesem Fall würde aber auch \let\@startoverview\@starttoc funktionieren.

Als nächstes muss man dafür sorgen, dass diese neue Anweisung auch verwendet wird. Definieren wir dazu einfach einen neuen Befehl:

Öffne in Overleaf
\newcommand*{\contentsoverview}{%
  \begingroup % Alle Änderungen lokal zur Anweisung halten.
    \LetLtxMacro{\@starttoc}{\@startoverview} % Verwende \@startoverview statt \@starttoc.
    % Hier können weitere Änderungen vorgenommen werden.
    \tableofcontents% Inhaltverzeichnis ausgeben
  \endgroup
}

Nun kann \contentsoverview vor \tableofcontents verwendet werden. Wichtig ist jedoch, dass auch immer \tableofcontents zum Einsatz kommt, weil sich sonst das Verzeichnis nie ändern wird.

Bis hier funktioniert das übrigens auch mit allen anderen Klassen, die \@starttoc verwenden. Natürlich funktioniert es nur, solange \@starttoc nicht so umdefiniert wird, dass \if@filesw darin nicht mehr enthalten ist. Leider machen ein paar Klassen und auch ein paar Pakete so etwas. In dem Fall muss man sich etwas tiefer wühlen, um die passende Anweisung zu finden. Teilweise findet man beispielsweise ein \orig@starttoc, das dann in obigem Code jeweils an Stelle von \@starttoc verwendet werden muss.

Natürlich soll das Verzeichnis auch eine andere Überschrift bekommen. Das geht, indem lokal \contentsname geändert wird. Wie man das sprachabhängig lösen kann, ist in der KOMA-Script-Anleitung oder im KOMA-Script-Buch zu finden.

Darüber hinaus willst du ja die Änderungen aus der Lösung zur vorherigen Frage. Auch diese kann man an der markierten Stelle einfach einbauen. Eine KOMA-Script spezifische Lösung könnte dann so aussehen:

Öffne in Overleaf
\documentclass{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage{blindtext}

\usepackage{xcolor}% Keine Farbe ohne Farbpaket.
\usepackage{xpatch}% Zum sauberen Patchen der duplizierten Anweisung.
\usepackage{letltxmacro}% Für eine saubere \let-Alternative

\makeatletter
% Zuerst machen wir uns aus \@starttoc eine Variante 
% \@startoverview, bei der die Datei nicht zum Schreiben
% geöffnet wird.
\LetLtxMacro{\@startoverview}{\@starttoc}
\xpatchcmd{\@startoverview}{\if@filesw}{\iffalse}{}{}

% Dann machen wir uns eine Variante von \tableofcontents,
% bei der statt \@starttoc das neue \@startoverview genutzt
% und noch ein paar Einstellungen geändert werden.
\newcommand*{\contentsoverview}{%
  \begingroup % Alle Änderungen lokal zur Anweisung halten.
    \LetLtxMacro{\@starttoc}{\@startoverview} % Verwende \@startoverview statt \@starttoc.
    \let\contentsname\overviewname% Verwende \overviewname statt \contentsname als Überschrift.
    \value{tocdepth}=\chaptertocdepth % Nur \part und \chapter anzeigen.
    \DeclareTOCStyleEntry[% Siehe http://texwelt.de/wissen/fragen/21272/wie-kann-ich-das-aussehen-des-inhaltsverzeichnisses-andern/21296
      pagenumberbox=\pagenumberboxandgrayline
    ]{chapter}{chapter}%
    \tableofcontents% Inhaltverzeichnis ausgeben
  \endgroup
}
\newcommand*{\pagenumberboxandgrayline}[1]{% Siehe http://texwelt.de/wissen/fragen/21272/wie-kann-ich-das-aussehen-des-inhaltsverzeichnisses-andern/21296
  \makebox[\@pnumwidth]{\hfill #1}\par\nobreak
  \vspace*{-\ht\strutbox}\hfill
  \llap{\textcolor{gray}{\rule{\textwidth}{.4pt}}}%
}
\makeatother
\newcommand*{\overviewname}{Chapter Overview}
\providecaptionname{english,american,USenglish,UKenglish}{\overviewname}{Chapter Overview}
\providecaptionname{german,ngerman,austrian,naustrian,swissgerman,nswissgerman}{\overviewname}{Kapitel\"ubersicht}

\begin{document}

\contentsoverview
\tableofcontents

% Dokument
\Blinddocument
\Blinddocument
\Blinddocument
\end{document}

Das Ergebnis könnte dann so aussehen:

Kapitelübersicht Inhaltsverzeichnis

Permanenter link

beantwortet 22 Jan '18, 08:58

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

@Ijon Tichy Deine Antwort ist klasse. Leider kann ich hier nicht beide Antworten als Lösung auswählen, sodass ich die Antwort von saputello als Lösung ausgewählt, da sich diese vorwiegend den Bordmitteln von KOMA-Script bedient. Bei Gelegenheit sei Dir eine Kiste Bier als Entschädigung für meine Wahl von mir gegönnt.

(22 Jan '18, 09:30) dzaic
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×130
×77

gestellte Frage: 22 Jan '18, 07:24

Frage wurde gesehen: 7,672 Mal

zuletzt geändert: 22 Jan '18, 14:42