Ich habe ein Dokument mit nicht nummerierten und nummerierten Kapiteln. Die Kapitel ohne Nummer sind nicht weiter unterteilt, aber alle nummerierten Kapitel sind noch in Abschnitte gegliedert.

Die Einträge der Kapitel im Inhaltsverzeichnis

alt text

sollen nun wie folgt verändert werden:

  • Für die Kapitel ohne Nummerierung soll der Abstand zwischen Text und Seitenzahl mit einer Punktlinie gefüllt sein.
  • Für Kapitel mit Nummer soll die Seitenzahl entfernt werden. Dafür soll es dann natürlich auch keine Linie mit Füllpunkten geben.

Code für das Beispiel:

Open in Online-Editor
\documentclass{scrbook}
\usepackage[ngerman]{babel}
\usepackage{blindtext}

\begin{document}
\tableofcontents
\addchap{Einleitung}
\addchap{Hinweise}
\blinddocument
\end{document}

gefragt 06 Jun '16, 14:52

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%


Ich finde die Anforderung zwar ziemlich inkonsistent, aber es ist auch kein wirklich großes Problem, das umzusetzen:

Open in Online-Editor
\documentclass{scrbook}[2016/05/10]
\usepackage[ngerman]{babel}
\usepackage{blindtext}

\DeclareTOCStyleEntry[%
  level=\chaptertocdepth,
  indent=0pt,
  numwidth=1.5em,
  linefill=\TOCLineLeaderFill,
]{chapter}{xchapter}
\makeatletter
\RedeclareSectionCommand[%
  tocpagenumberbox=\@gobble
]{chapter}
\CheckCommand*{\addchaptertocentry}[2]{%
  \addtocentrydefault{chapter}{#1}{#2}%
  \if@chaptertolists
    \doforeachtocfile{%
      \iftocfeature{\@currext}{chapteratlist}{%
        \addxcontentsline{\@currext}{chapteratlist}[{#1}]{#2}%
      }{}%
    }%
    \@ifundefined{float@addtolists}{}{\scr@float@addtolists@warning}%
  \fi
}
\renewcommand*{\addchaptertocentry}[2]{%
  \IfArgIsEmpty{#1}{%
    \addtocentrydefault{xchapter}{#1}{#2}%
  }{%
    \addtocentrydefault{chapter}{#1}{#2}%
  }%
  \if@chaptertolists
    \doforeachtocfile{%
      \iftocfeature{\@currext}{chapteratlist}{%
        \addxcontentsline{\@currext}{chapteratlist}[{#1}]{#2}%
      }{}%
    }%
    \@ifundefined{float@addtolists}{}{\scr@float@addtolists@warning}%
  \fi
}
\makeatother

\begin{document}
\tableofcontents
\addchap{Einleitung}
\addchap{Hinweise}
\blinddocument
\end{document}

alt text

Der Trick dabei ist, dass über die Umdefinierung von \addchaptertocentry für nicht nummerierte Einträge, also dann, wenn das erste Argument leer ist, nicht mehr ein Eintrag der Ebene chapter sondern der Ebene xchapter erzeugt wird. Dieser Eintrag der Ebene xchapter kann unabhängig von den Einträgen der Ebene chapter mit \DeclareTOCStyleEntry deklariert werden.

Die Originaldefinition von \addchaptertocentry habe ich scrbook.cls entnommen. Natürlich könnte man das Patchen auch mit etoolbox oder xpatch erledigen:

Open in Online-Editor
\documentclass{scrbook}[2016/05/10]
\usepackage[ngerman]{babel}
\usepackage{blindtext}
\usepackage{xpatch}
\DeclareTOCStyleEntry[%
  level=\chaptertocdepth,
  indent=0pt,
  numwidth=1.5em,
  linefill=\TOCLineLeaderFill,
]{chapter}{xchapter}
\makeatletter
\RedeclareSectionCommand[%
  tocpagenumberbox=\@gobble
]{chapter}
\xpatchcmd{\addchaptertocentry}{%
  \addtocentrydefault{chapter}{#1}{#2}%
}{%
  \IfArgIsEmpty{#1}{%
    \addtocentrydefault{xchapter}{#1}{#2}%
  }{%
    \addtocentrydefault{chapter}{#1}{#2}%
  }%
}{}{\PatCHFaiLED}
\makeatother

\begin{document}
\tableofcontents
\addchap{Einleitung}
\addchap{Hinweise}
\blinddocument
\end{document}

Es sei noch darauf hingewiesen, dass es \DeclareTOCStyleEntry offiziell erst ab KOMA-Script v3.20 gibt. Das funktioniert derzeit also noch nicht im Online-Editor, aber sehr wohl mit TeX Live 2016 und mit einem aktuell gehaltenen MiKTeX.

Permanenter link

beantwortet 06 Jun '16, 16:23

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 06 Jun '16, 18:58

Danke, die Möglichkeit, dass chapteratlists verwendet wird, hätte ich vergessen und der Befehl \chaptertocdepth ist mir auch neu.

(07 Jun '16, 00:04) esdd

@esdd: \chaptertocdepth gibt es seit KOMA-Script 3.15 und wurde wohl auch in das \DeclareTOCEntryStyle-Zeitalter hinüber gerettet, wo es auch indirekt in einem Nebensatz dokumentiert und in einem Beispiel gezeigt ist. Natürlich hätte man da auch einfach 0 einsetzen können. Auf Einzug und Nummernbreite gibt es keinen Zugriff auf Benutzerebene. Deshalb habe ich es unterlassen, dort \scr@tso@chapter@indent und \scr@tso@chapter@numwidth einzusetzen.

(07 Jun '16, 07:47) saputello

@saputello Eigentlich kenne ich die Doku ja ganz gut, aber das ist nicht nur wirklich indirekt sondern auch noch an einer Stelle dokumentiert, die sich ausdrücklich an Entwickler und nicht Anwender wie mich richtet. Dabei würden sich die Befehle auch gut eignen, um tocdepth zu setzen, also zum Beispiel für \setcounter{tocdepth}{\sectiontocdepth}

(07 Jun '16, 10:26) esdd
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:

×131
×117
×78
×5

gestellte Frage: 06 Jun '16, 14:52

Frage wurde gesehen: 15,643 Mal

zuletzt geändert: 07 Jun '16, 10:26