Hallo zusammen,

ich arbeite hin und wieder mit Latex und kam bisher ganz gut zurecht, allerdings wird jetzt ein Inhaltsverzeichnis mit folgendem Aufbau gefordert:

1 Kapitel 1
1.1 Section 1 || 1 - 1 bis 1 – 2

2 Kapitel 2

2.1 Section 1 || 2 - 1 bis 2 - 2

2.2 Section 2 || 2 - 3 bis 2 - 5

2.3 Section 3 || 2 - 1 bis 2 - 5

(leider kann ich keine Bilder einfügen, ich hoffe das Inhalsverzeichnis ist verständlich)

Das heißt:

  1. jedes chapter beginnt mit Seitenzahl 1
  2. vor der Seitenzahl im Inhaltsverzeichnis steht die Kapitelnummer
  3. im Inhaltsverzeichnis steht nicht nur die erste Seite des (Unter-)Kapitels sondern auch die letzte

Mein hauptsächliches Problem ist die Anpassung des Inhaltsverzeichnisses. Auch nach einiger Recherche konnte ich kein Beispiel o.Ä. finden, das mir weiterhelfen würde. Ist es möglich, das Inhaltsverzeichnis entsprechend meiner Vorgabe zu modifizieren? Befasst habe ich mich bisher mit den Paketen tocloft und etoc, konnte aber keine zufriedenstellende Lösung für mein Problem finden.

Ich freue mich über jegliche Hilfestellung, auch über Tipps, welche Pakete ich mir anschauen soll etc.

Mein Minimalbeispiel:

Öffne in Overleaf
\documentclass{scrreprt}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}

\usepackage{tocloft}

\usepackage{scrlayer-scrpage}
\renewcommand*\chapterpagestyle{scrheadings}
\ohead{Seite: \thechapter  \ - \pagemark \\Datum:\ \today}

\usepackage{titlesec}
\newcommand{\sectionbreak}{\clearpage}

\usepackage{lipsum}

\begin{document}
\tableofcontents

\chapter{Kapitel 1}
\setcounter{page}{1}
\section{Section 1}
\subsection{Subsection 1}
\lipsum
\chapter{Kapitel 2}
\setcounter{page}{1}
\section{Section 1}
\lipsum
\section{Section 2}
\lipsum
\section{Section 3}
\lipsum

\end{document}

gefragt 27 Nov '17, 14:26

Julia's gravatar image

Julia
2612
Akzeptiert-Rate: 0%

bearbeitet 27 Nov '17, 16:51

saputello's gravatar image

saputello
11.1k154365

1

Willkommen auf TeXwelt! Bitte beachte, dass wir hier vorzugsweise Markdown und nicht HTML für die Formatierung verwenden. Dann funktioniert es auch mit dem automatisch eingefügten Overleaf-Link über Codeblöcken (die bei der Eingabe durch Selektieren und Strg-k leicht erreicht werden können).

(27 Nov '17, 16:53) saputello
1

Die Verwendung von tocloft zusammen mit einer KOMA-Script-Klasse wird ausdrücklich nicht empfohlen! KOMA-Script enthält mit tocbasic bereits ein Paket, das von den Klassen automatisch verwendet wird und vielfältige Änderungen der Verzeichnisse erlaubt. Die gewünschte Änderung dürfte allerdings zusätzliche Eingriffe bei \addchaptertocentry, \addsectiontocentry aber auch \chapter und \section erfordern, um zusätzliche automatische \label einzufügen.

(27 Nov '17, 16:57) saputello
1

Off-Topic: Grundsätzlich sehe ich die kapitelweise Seitennummerierung sehr kritisch. Für den Leser ist das auf jeden Fall eher unpraktisch. Wenn ich beispielsweise einen Verweis auf Seite 5-7 habe und gerade auf Seite 2-11 bin, wie weit ist dann 5-7 schätzungsweise entfernt? 10 Seiten? 100 Seiten? 1000 Seiten? Die Seitenzahlen geben damit also nur noch innerhalb eines Kapitels eine Orientierung aber nicht mehr über Kapitel hinweg im Dokument, im Inhaltsverzeichnis sind sie komplett nutzlos. Der Aufwand für die bis-Angaben ist damit umsonst und ich habe auch keine Lust ihn auf mich zu nehmen.

(27 Nov '17, 16:59) saputello

Danke für die Rückmeldung, ich verstehe deine Kritik, ich fande dieses Vorgehen zuerst auch seltsam. Das Ziel ist jedoch, sehr einfach einen Überblick zu bekommen, welches Kapitel wie viele Seiten hat. Die Kapitel stehen relativ unabhängig voneinander, Verweise sind eher selten. Ich verstehe, dass das Problem sehr individuell ist und erwarte keine vorgefertige Lösung, aber mit ein paar Tipps, wo ich am besten ansetzte, wäre mir sehr geholfen.

(28 Nov '17, 08:39) Julia

Hallo @Julia, ein paar Tipps hat dir @saputello ja schon gegeben. Lies seinen zweiten Kommentar gerne nochmal. Wenn du dazu Fragen hast, stelle Sie gern. PS: Auch wenn die Seiten nicht kapitelweise nummeriert werden, wird für mich schnell klar, wieviele Seiten ein bestimmtes Kapitel hat.

(14 Jan '18, 22:57) sudo

So ganz einfach ist das in der Tat nicht.

Der einfachste Teil des Ganzen ist, die Seitenzahlen kapitelabhängig zu machen:

\usepackage{xpatch}
\makeatletter
\newif\ifusepageperchapter
\renewcommand*{\pagenumbering}[1]{%
  \global\c@page \@ne
  \gdef\thepage{%
    \ifusepageperchapter
      \ifnum \c@chapter>\z@ \thechapter-\fi
    \fi
    \csname @#1\endcsname\c@page
  }%
}%
\pagenumbering{arabic}
\xpretocmd{\addchaptertocentry}{%
  \ifusepageperchapter\setcounter{page}{1}\fi
}{}{\undefined}
\makeatletter

Zunächst wird ein Schalter \ifusepageperchapter definiert, so dass mit Hilfe von \usepageperchaptertrue und \usepackageperchapterfalse zwischen kapitelweiser und globaler Seitennummerierung umgeschaltet werden kann. Dann wird \pagenumbering so umdefiniert, dass es nicht nur den Nummerierungsstil der Seitenzahl selbst ändert, sondern im Falle der aktivierten kapitelweisen Nummerierung die Kapitelnummer mit anzeigt, falls diese größer als 0 ist (bei scrbook statt scrreprt würde man hier auch noch \if@mainmatter…\fi ergänzen, um das ganze auf den nummerierten Hauptteil zu beschränken).

Dann stellt sich noch die Frage, wann und wie man page mit jedem neuen Kapitel auf 1 setzt. Einfach \@addtoreset (oder chngcntr) kann man nicht verwenden, da das auf 0 statt auf 1 setzt. Außerdem könnte man dann das Zurücksetzen nicht mehr über \ifusepageperchapter steuern. Also wird im Code oben das Ganze einfach an die Ausführung von \addchaptertocentry gekoppelt. Das ist der Befehl, der Kapiteleinträge ins Inhaltsverzeichnis vornimmt.

Jetzt wird es schwieriger, denn man muss sich überlegen, wie man an die letzte Seite eines Abschnitts überhaupt heran kommt. Am einfachsten ist das, wenn man am Ende jedes Abschnitts ein Label setzt. Aber natürlich will man nicht manuell am Ende jedes Abschnitts einen \label-Befehl setzten. Automatisch kennen wir aber das Ende eines Abschnitts nicht wirklich. Stattdessen wissen wir nur, wo ein neuer Abschnitt beginnt. Ein erster Ansatz wäre also, beispielsweise mit:

\xpretocmd{\section}{%
  \generatesectionendpagelabel
}{}{\undefined}

noch bevor die neue Überschrift gesetzt wird, einen Befehl auszuführen, der so ein Label produziert. Im einfachsten Fall könnte \generatesectionendpagelabel als

\newcommand*{\generatesectionendpagelabel}{\label{\thesection}}

definiert werden. Allerdings haben wir bei Kapitelanfängen dann zwei Probleme:

  1. Das Label für den letzten Abschnitt des vorherigen Kapitels wird erst produziert, wenn \chapter bereits eine neue Seite begonnen hat, das Label referenziert also die falsche Seite.
  2. \thesection ist nicht mehr die Nummer des vorherigen Abschnitts, sondern Abschnitt Nummer 0 des neue begonnenen Kapitels.

Beide Probleme lassen sich lösen, indem ebenfalls vor einer neuen Kapitelüberschrift ein Label erzeugt wird:

\xpretocmd{\chapter}{%
  \generatesectionendpagelabel
}{}{\undefined}

\xpretocmd wird dabei übrigens von Paket xpatch bereitgestellt.

Würden wir diese Labels so erzeugen, würden wir außerdem feststellen, dass das Ende des letzten Abschnitts eines Dokuments nicht erfasst wird. Dafür brauchen wir zusätzlich:

\AtEndDocument{\generatesectionendpagelabel}

Jetzt müssen wir natürlich auch dafür sorgen, dass im Inhaltsverzeichnis auf den Inhalt dieser Labels zugegriffen wird. Normalerweise sieht ein Inhaltsverzeichniseintrag für einen Abschnitt in der .toc-Datei so aus:

\contentsline {section}{\numberline {<Abschnittsnummer>}<Überschrift>}{<Seite>}

Statt <Seite> wollen wir jetzt gerne <Startseite> -- <Endseite>. Erzeugt wird der Eintrag bei KOMA-Script mit \addsectiontocentry. An der Stelle könnten wir nun eingreifen und dafür sorgen, dass statt \thepage etwas wie \thepage\ -- \pageref{\thesection} als letzte Argument geschrieben wird. Allerdings erweist sich das als nicht so einfach, weil \addsectiontocentry gar kein explizites Argument für die Seitenzahl hat. Erschwerend kommt hier die asynchrone Ausgabe von LaTeX hinzu. Hier wäre es günstiger und einfacher, wenn stattdessen eine Referenz auf den n-ten section-Eintrag existieren würde, auf den dann einfach referenziert werden kann. Daher definieren wir die Erzeugung des Labels etwas aufwändiger als oben umrissen:

\newcounter{sectionentry}
\renewcommand*{\thesectionentry}{}
\makeatletter
\xpretocmd{\addsectiontocentry}{%
  \stepcounter{sectionentry}%
  \gdef\thesectionentry{\arabic{sectionentry}}%
}{}{\undefined}
\makeatother
\xpretocmd{\section}{%
  \generatesectionendpagelabel
}{}{\undefined}
\xpretocmd{\chapter}{%
  \generatesectionendpagelabel
}{}{\undefined}
\newcommand*\generatesectionendpagelabel{%
  \Ifstr{\thesectionentry}{}{}{%
    % Wir hatten uns eine Startseite gemerkt und erzeugen jetzt ein Label für
    % die Endseite
    \label{section.endpage.to.section.entry.\thesectionentry}%
    \gdef\thesectionentry{}% Gemerkte Seite vergessen.
  }%
}
\AtEndDocument{\generatesectionendpagelabel}

Es ist zu beachten, dass die Anweisung \Ifstr, die hier verwendet wird, um zu testen, ob aktuell eine Startseite gemerkt wurde, bis einschließlich KOMA-Script 3.27 mit kleinem i geschrieben wurde, also \ifstr.

Die ständige Umdefiniererei von \thesectionentry passiert nur, damit es zu keinen doppelten Labels kommt, weil ja sowohl \section also auch \chapter ein Label produzieren würde. Außerdem kann man so notfalls mit \generatesectionendpagelabel im Dokument auch manuell eingreifen.

Damit sind die Labels erzeugt. Jetzt muss man noch dafür sorgen, dass sie auch verwendet werden. Hier kann man ausnützen, dass KOMA-Script weitreichend konfigurierbare Eintragsstile mit Hilfe von tocbasic bereit stellt:

\RedeclareSectionCommand[%
  tocpagenumberformat=\pagenumberrange,% Format der Seitenzahlen im Inhaltsverzeichnis ändern.  
]{section}
\newcounter{refsectionentry}
\newcommand*{\pagenumberrange}[1]{%
  #1%
  \stepcounter{refsectionentry}%
  \Ifundefinedorrelax{r@section.endpage.to.section.entry.\therefsectionentry}{}{%
    \ --\ \pageref{section.endpage.to.section.entry.\therefsectionentry}%
  }%
}

So wie mit Zähler sectionentry schon die Anzahl der erzeugten section-Verzeichniseinträge gezählt wurden, werden hier die Anzahl der ausgegebenen section-Verzeichniseinträge gezählt, um ebenfalls auf das Label zugreifen zu können. Da LaTeX keinen Befehl bereitstellt um zu testen, ob ein Label existiert – nur dann existiert auch ein Seitenbereich – wird mit \Ifundefinedorrelax auf das interne Makro getestet, das ein existierendes Label repräsentiert. Es ist zu beachten, dass die Anweisung bis einschließlich KOMA-Script 3.27 \ifundefinedorrelax, also mit kleinem i am Anfang hieß.

Insgesamt ergibt sich dann also etwas wie:

\documentclass[headlines=2]{scrreprt}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}

\usepackage{scrlayer-scrpage}
\renewcommand*\chapterpagestyle{scrheadings}
\ohead{Seite: \pagemark \\Datum:\ \today}

\usepackage{xpatch}

% Seitenzahlen mit Kapitelpräfix versehen und bei jede Kapitel auf 1
% zurücksetzen.
\makeatletter
\newif\ifusepageperchapter
\renewcommand*{\pagenumbering}[1]{%
  \global\c@page \@ne
  \gdef\thepage{%
    \ifusepageperchapter
      \ifnum \c@chapter>\z@ \thechapter-\fi
    \fi
    \csname @#1\endcsname\c@page
  }%
}%
\pagenumbering{arabic}
\xpretocmd{\addchaptertocentry}{%
  \ifusepageperchapter\setcounter{page}{1}\fi
}{}{\undefined}
\makeatletter

\RedeclareSectionCommand[%
%  style=chapter,% Abschnitte sollten wie Kapitel auf einer neuen Seite beginnen.
  tocpagenumberformat=\pagenumberrange,% Format der Seitenzahlen im Inhaltsverzeichnis ändern.  
]{section}

% Bei jedem Verzeichniseintrag
\newcounter{sectionentry}
\renewcommand*{\thesectionentry}{}
\makeatletter
\xpretocmd{\addsectiontocentry}{%
  \stepcounter{sectionentry}%
  \gdef\thesectionentry{\arabic{sectionentry}}%
}{}{\undefined}
\makeatother
\xpretocmd{\section}{%
  \generatesectionendpagelabel
}{}{\undefined}
\xpretocmd{\chapter}{%
  \generatesectionendpagelabel
}{}{\undefined}
\newcommand*\generatesectionendpagelabel{%
  \Ifstr{\thesectionentry}{}{}{%
    % Wir hatten uns eine Startseite gemerkt und erzeugen jetzt ein Label für
    % die Endseite
    \label{section.endpage.to.section.entry.\thesectionentry}%
    \gdef\thesectionentry{}% Gemerkte Seite vergessen.
  }%
}
\AtEndDocument{\generatesectionendpagelabel}
\newcounter{refsectionentry}
\newcommand*{\pagenumberrange}[1]{%
  #1%
  \stepcounter{refsectionentry}%
  \Ifundefinedorrelax{r@section.endpage.to.section.entry.\therefsectionentry}{}{%
    \ --\ \pageref{section.endpage.to.section.entry.\therefsectionentry}%
  }%
}

% Jetzt benötigen im Inhaltsverzeichnis mehr Platz für die Seitenzahlen
\makeatletter
\renewcommand*{\@pnumwidth}{4.5em}
\renewcommand*{\@tocrmarg}{5em}
\makeatother

% Wir wollen im Inhaltsverzeichnis nur Kapitel und Abschnitte:
\setcounter{tocdepth}{\sectiontocdepth}
\usepackage{lipsum}

\begin{document}
\tableofcontents

\usepageperchaptertrue

\chapter{Kapitel 1}
\section{Section 1}
\subsection{Subsection 1}
\lipsum
\chapter{Kapitel 2}
\section{Section 1}
\lipsum
\section{Section 2}
\lipsum
\section{Section 3}
\lipsum

\end{document}

mit dem Inhaltsverzeichnis:

Inhaltsverzeichnis mit Seitenbereichen

Für den Fall, dass jeder Abschnitt eine neue Seite beginnen soll (was ich nicht empfehlen würde) ist ebenfalls eine auskommentierte Option bei \RedeclareSectionCommand zu finden. Für die nähere Erklärung diverser KOMA-Script-Befehle sei auf die KOMA-Script-Anleitung oder das KOMA-Script-Buch hingewiesen (das gerade in 6. Auflage neu erschienen ist). \xpretocmd ist der xpatch-Anleitung zu entnehmen. Die Originaldefinition von \pagenumbering findet sich in dokumentierten LaTeX-Quelltext source2e.pdf.

Es sei darauf hingewiesen, dass diese Lösung einige Grenzen hat. So sind \addchap und \addsec bisher nicht behandelt, wobei diese mit kapitelweiser Seitennummerierung ohnehin wenig sinnvoll sein dürften. Außerdem muss vor einem manuellen \clearpage ggf. auch \generatesectionendpagelabel aufgerufen werden, wenn mit dem \clearpage ein Abschnitt beendet wird. Für \clearpage innerhalb eines Abschnitts gilt das natürlich nicht, weshalb ich oben auch nicht mit \xpretocmd direkt ein \generatesectionendpagelabel an den Anfang von \clearpage gepatcht habe. Ich empfehle, bei Bedarf eine neue Anweisung, beispielsweise \sectionendclearpage, zu definieren.

Permanenter link

beantwortet 30 Mär '18, 14:36

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

bearbeitet 29 Jan '21, 10:33

Vielen Dank für die super ausführliche Antwort!! Die Schritte werde ich mir einzeln anschauen, das Endergebnis sieht aber auf jeden Fall sehr gut aus!

(30 Mai '18, 08:04) Julia
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:

×77
×16
×2

gestellte Frage: 27 Nov '17, 14:26

Frage wurde gesehen: 8,307 Mal

zuletzt geändert: 29 Jan '21, 10:33