Ich habe ähnliche Anforderungen wie bei der Frage »Inhaltsverzeichnis anpassen: Kapitel geht von Seite x bis y«. Allerdings gibt es bei mir ein paar Unterschiede:

  • Die Seiten sollen nicht kapitelsweise, sondern fortlaufend nummeriert werden.

  • Das Ende der Seitenbereiche im Inhaltsverzeichnis soll nicht automatisch, sondern manuell durch ein Label im Text markiert werden.

Außerdem habe ich das Problem, dass der Code aus der dortigen Antwort von Ijon Tichy bei mir nicht funktioniert.

gefragt 29 Jan '21, 09:37

FloTeX's gravatar image

FloTeX
2613
Akzeptiert-Rate: 0%

bearbeitet 29 Jan '21, 10:24

gast3's gravatar image

gast3
(ausgesetzt)

Beim Compilieren des Codes von Ijon Tichy erhalte ich die Fehlermeldung, dass {\undefined} nicht als Argument akzeptiert wird. Dies sowohl in einem bestehenden Dokument als auch in einem extra neu aufgesetzten Dokument, in das nur der Beispielcode einkopiert wurde. Trotz der sehr ausführlichen Beschreibung des Codes setzt dessen Verständnis doch tiefere Einblicke in die TeX-Engine voraus, als ich (trotz langjähriger Anwendung) habe. Deshalb habe ich versucht, den Code soweit wie möglich herunterzubrechen und insbesondere das automatische Setzen von Labels herauszunehmen. Allerdings ohne Erfolg

(29 Jan '21, 10:40) FloTeX

Durch die Erläuterungen bin ich zu dem Schluss gekommen, dass sich der gesamte Aufwand sehr reduzieren würde, wenn man eigenständig am Ende einer Sektion ein Label setzt und dies brauche ich auch, da sich die Seitenzahlen in einer statischen Berechnung viel zu willkührlich ändern, als dass ein Rechner Anfang und Ende jeweils erkennen könnte.

(29 Jan '21, 10:40) FloTeX

Das sind mehrere Fragen auf einmal. Befassen wir uns einzeln damit:

Die Seiten sollen nicht kapitelweise, sondern fortlaufend nummeriert werden.

Wie in meiner früheren Antwort ausführlich erklärt, ist für die kapitelweise Nummerierung der Codeabschnitt

\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

im dortigen Beispiel verantwortlich. Bis auf \usepackage{xpatch] kann man diesen einfach komplett löschen. Das Paket xpatch darf man deshalb nicht entfernen, weil dessen Anweisung \xpretocmd auch noch im nachfolgenden Code verwendet wird.

Wie dort ebenfalls erklärt wird, werden von dem soeben gelöschten Code u. a. zwei Anweisungen \usepageperchaptertrue und \usepageperchapterfalse bereitgestellt, mit denen die kapitelweise Nummerierung ein- und ausgeschaltet werden kann. Man muss also auch die Anweisung \usepageperchapter im Dokument selbst löschen. Man erhält so:

\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}

\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

\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}

Und schon sieht das Inhaltsverzeichnis so aus:

fortlaufende Seitenzahlen im Inhaltsverzeichnis

Statt den genannten Code zu löschen, hätte man natürlich auch einfach die Information verwenden können, dass mit \usepageperchapterfalse die kapitelweise Nummerierung abgeschaltet werden kann, bzw. mit \usepageperchaptertrue erst aktiviert werden muss. Damit hätte es also genügt, die Anweisung \usepageperchaptertrue, die im Originalcode nach \tableofcontents zu finden ist, zu entfernen oder auszukommentieren. Damit hätte man das oben gezeigte Ergebnis ebenfalls ganz einfach und ohne Änderung an den Definitionen erhalten.

Das Ende der Seitenbereiche im Inhaltsverzeichnis soll nicht automatisch, sondern manuell durch ein Label im Text markiert werden.

Wie meiner früheren Antwort ausführlich erklärt wird, wird die neu definierte Anweisung \generatesectionendlabel für das Label am Ende der Abschnitte verwendet. Die Hauptschwierigkeit dabei ist weniger, dieses Label zu setzen. Die Hauptschwierigkeit besteht in der ursprünlichen Lösung darin, das automatisch zu tun. Dazu wird an den Anfang von \section und \chapter mit

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

eben die Ausführng von \generatesectionpagelabel gepatcht. Hier kommt es übrigens genau dann zu einer Fehlermeldung, dass \undefined nicht definiert ist, wenn \section oder \chapter nicht existieren. Das sollte bei Verwendung der Klasse scrreprt wie im Originalcode, aber auch bei Verwendung der Klasse scrbook niemals auftreten. Unabhängig von der KOMA-Script-Version bin ich sicher, dass es mit keiner bisher erschienen Version der genannten Klassen auftreten kann.

Zusätzlich wird mit

\AtEndDocument{\generatesectionendpagelabel}

dafür gesorgt, dass auch am Ende des Dokument noch ein solches Label erzeugt wird. Entfernt man die beiden Patches und die \AtEndDocument-Anweisung, so werden keine automatischen Labels mehr gesetzt.

Das von \generatesectionpagelabel generierte Label hat übrigens die Form section.endpage.to.section.entry.NUMMER, wobei NUMMER die Nummer des gesetzten Labels ist. Diese wird nicht von \generatesectionpagelabel erhöht, sondern durch

\xpretocmd{\addsectiontocentry}{%
  \stepcounter{sectionentry}%
  \gdef\thesectionentry{\arabic{sectionentry}}%
}{}{\undefined}

jedes Mal, wenn ein neuer Inhaltsverzeichniseintrag der Ebene section (in der Regel innerhalb der \section-Anweisung) erzeugt werden. Auch hier kommt es nur dann zu einer Fehlermeldung wegen einer nicht definierten Anweisung \undefined, wenn \addtosectiontocentry nicht existiert. In KOMA-Script eistiert diese Anweisung seit Version 3.10 und damit bereits seit über 9 Jahren. Support für ältere TeX-Distributionen ist weder erstrebenswert noch mit vertretbarem Aufwand möglich.

In der Ausgabe der Seitenzahlen im Inhaltsverzeichnis wird per

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

als Format \pagenumberrange festgelegt. In dieser Anweisung wird ebenfalls ein Zähler erhöht und dann mit

  \Ifundefinedorrelax{r@section.endpage.to.section.entry.\therefsectionentry}{}{}

abgefragt, ob ein zugehöriges Label tatsächlich existiert und nur dann ein Seitenbereich im Inhaltsverzeichnis ausgegeben.

Daher wir nach dem Löschen der oben genannten Patches zum automatischen Ausführung von \generatesectionendpagelabel:

\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}

\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}{}
\xpretocmd{\addsectiontocentry}{%
  \stepcounter{sectionentry}%
  \gdef\thesectionentry{\arabic{sectionentry}}%
}{}{\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.
  }%
}
\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}

zunächst überhaupt kein Seitenbereich im Inhaltsverzeichnis mehr ausgegeben:

Inhaltsverzeichnis ohne Seitenbereiche

da die Labels ja, wie erwähnt nun nicht mehr gesetzt werden. Aber natürlich können wir an beliebiger Stelle im Dokument selbst \generatesectionendpagelabel aufrufen:

\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}

\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}{}
\xpretocmd{\addsectiontocentry}{%
  \stepcounter{sectionentry}%
  \gdef\thesectionentry{\arabic{sectionentry}}%
}{}{\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.
  }%
}
\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
\generatesectionendpagelabel% Achtung: Bewusst falsch platzierte Generierung des Endseiten-Labels!
\lipsum
\section{Section 3}
\lipsum

\end{document}

Hier wird nun im Inhaltsverzeichnis für Abschnitt »2.2 Section 2« ein – wenn auch aufgrund der falschen Platzierung der Anweisung mitten im Abschnitt falscher – Seitenbereich ausgegeben:

falscher manueller Seitenbereits für Abschnitt »2.2 Section 2«

Wie an diesem Beispiel zu sehen ist, sinkt der Implementierungsaufwand durch weglassen des Automatismus nur wenig. Dafür erhöht sich die Gefahr, dass falsche Seitenbereiche im Inhaltsverzeichnis ausgegeben werden erheblich. Aus diesem Grund rate ich von einem solchen Vorgehen generell ab.

Permanenter link

beantwortet 29 Jan '21, 11:34

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

bearbeitet 29 Jan '21, 11:35

@FloTeX Ja, aber ich habe jetzt keine Zeit mehr dafür. Genau deshalb wollte ich, dass du deine Frage präzisierst und insbesondere für den Fall, dass du eben nicht mit meinem Orignalbeispiel, sondern mit einer Abwandlung davon ein Problem hast, dazu eine konkrete Folgefrage mit vollständigem Minimalbeispiel erstellst. So habe ich jetzt über eine Stunde Zeit verschwendet und muss mich erst einmal anderen Dingen widmen. Ich werde ja hier nicht bezahlt.

(29 Jan '21, 12:17) gast3

WOW!

Vielen Dank, funktioniert einwandfrei!!!

Ganz großes Kino!!

Alles gut, Du hast Deine Zeit nicht verschwendet! Das war sehr wertvoll!!! Vielen Dank nochmal!

Und ja, ich finde auch, jeder von Euch Helfern sollte gleich eine Adresse angeben, wo man eine Flasche Wein hin verschicken kann!

(29 Jan '21, 12:18) FloTeX

Auch wenn du mit der Antwort jetzt klar gekommen bist, empfehle ich, die von mir verlinkten Seiten und möglichst auch die verwendeten Anweisungen noch einmal nachzulesen. So richtig schwer zu verstehen, sollte das eigentlich nicht sein. Es ist aber auch nicht tragisch, wenn man nicht alles sofort versteht, sondern erst einmal nur einen Überblick erhält.

Danke geht hier übrigens mit Daumen hoch und ggf. Haken. Wein muss nicht sein.

Ohne LaTeX oder KOMA-Script wäre die Antwort nicht möglich gewesen.

(29 Jan '21, 14:02) gast3
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:

×78
×49
×25

gestellte Frage: 29 Jan '21, 09:37

Frage wurde gesehen: 3,361 Mal

zuletzt geändert: 29 Jan '21, 14:03