Discussion:
etoc-Frage
(zu alt für eine Antwort)
Carlo XYZ
2023-09-23 08:26:06 UTC
Permalink
Wir haben mehrere Kapitel und für jedes davon eine lokale TOC,
die mit etoc und \localtableofcontents erzeugt wird. Außerdem
gibt es eine große TOC ganz am Beginn des Buchs.

Es geht um das Literaturverzeichnis. Natürlich taucht es in
der großen TOC auf. In den lokalen TOCs kommt es nicht vor,
außer im letzten Kapitel. Weiß jemand zufällig, wie man es
verhindert, dass \localtableofcontents im letzten Kapitel
einen Eintrag erzeugt, der aufs Literaturverzeichnis verweist?

Unser Manuskript sieht insgesamt so aus:

\documentclass[graybox,envcountchap,sectrefs]{svmono} % Springer-Stil

...

\tableofcontents

\include{Chapter 1}

...

\include{Chapter n}

\begingroup
\setlength{\emergencystretch}{.5em}
\printbibliography[title={Literature},heading=bibintoc]
\markboth{Literature}{Literature}
\endgroup

... und das Problem tritt in Chapter n auf.
Carlo XYZ
2023-09-23 12:38:30 UTC
Permalink
Gelöst.

Das Problem steckt in Springers "svmono.cls" :-(
Die definieren Literatur standardmäßig (um) als "section-wise".
Ulrich D i e z
2023-09-23 19:23:50 UTC
Permalink
Post by Carlo XYZ
Gelöst.
Das Problem steckt in Springers "svmono.cls" :-(
Die definieren Literatur standardmäßig (um) als "section-wise".
Was heißt das jetzt - hast du das Problem gelöst oder dich damit
abgefunden?

Da es um etoc geht, könnte man vielleicht direkt vor und hinter
\printbibliography einen \etocsettocdepth.toc{...}-Befehl
oder \etocdepthtag.toc-Befehle und vor den \localtableofcontents- bzw
\tableofcontents-Befehlen jeweils \etocsettagdepth-Befehle so setzen,
dass die Inhaltverzeichnistiefe (nur) beim Setzen des Eintrags
fürs Literaturverzeichnis das Setzen eines Eintrags fürs
Literaturverzeichnis nicht mehr hergibt.

Mit deinem Code-Fragment kann man leider nicht spielen, um
auszuprobieren.

Mit freundlichem Gruß

Ulrich
Carlo XYZ
2023-09-23 21:53:08 UTC
Permalink
Post by Ulrich D i e z
Post by Carlo XYZ
Gelöst.
Das Problem steckt in Springers "svmono.cls" :-(
Die definieren Literatur standardmäßig (um) als "section-wise".
Was heißt das jetzt - hast du das Problem gelöst oder dich damit
abgefunden?
Da bin ich mir noch nicht ganz sicher. Sicher scheint
nur, dass ich mit svmono "herumspielen" muss.

Danke auf alle Fälle für deine Tipps zu etoc, die
könnten noch nützlich werden.
Post by Ulrich D i e z
Mit deinem Code-Fragment kann man leider nicht spielen, um
auszuprobieren.
Ja, sorry, ein MWE ist schwierig, weil die Chose von svmono
abzuhängen scheint. Ohne svmono geht's wie gewünscht:

\documentclass[a4]{book}
\usepackage{biblatex}
\usepackage{etoc}
\begin{document}
\author{Authors}
\title{MWE etoc}
\maketitle
\tableofcontents
\etocsettocstyle{\subsection*{Contents}}{\noindent\rule{\linewidth}{.4pt}}
\chapter{Introduction}
\localtableofcontents
\section{Motivation}
\section{Structure}
Citation \cite{1}.
\chapter{Conclusion}
\localtableofcontents
\section{Definitions}
\section{Results}
Citation \cite{2}.
\begin{thebibliography}{9}
\bibitem{1} An author:
\bibitem{2} Another author:
\end{thebibliography}
\addcontentsline{toc}{chapter}{Literature}
\end{document}
Carlo XYZ
2023-09-23 22:38:53 UTC
Permalink
Post by Ulrich D i e z
Post by Carlo XYZ
Gelöst.
Das Problem steckt in Springers "svmono.cls" :-(
Die definieren Literatur standardmäßig (um) als "section-wise".
Was heißt das jetzt - hast du das Problem gelöst oder dich damit
abgefunden?
Ja, ich denke, ich habe svmono.cls jetzt so weit
hingezwirbelt, dass das Gewünschte herauskommt.

Nicht dem Springer-Verlag verraten:-)
Ulrich D i e z
2023-09-24 17:07:45 UTC
Permalink
Post by Carlo XYZ
Wir haben mehrere Kapitel und für jedes davon eine lokale TOC,
die mit etoc und \localtableofcontents erzeugt wird. Außerdem
gibt es eine große TOC ganz am Beginn des Buchs.
Es geht um das Literaturverzeichnis. Natürlich taucht es in
der großen TOC auf. In den lokalen TOCs kommt es nicht vor,
außer im letzten Kapitel. Weiß jemand zufällig, wie man es
verhindert, dass \localtableofcontents im letzten Kapitel
einen Eintrag erzeugt, der aufs Literaturverzeichnis verweist?
Nach dem gestrigen "Vorgeplänkel" kann ich dir jetzt
(hoffentlich) vernünftig antworten.

Es kommt drauf an:

- Soll das Literaturverzeichnis eigentlich ein eigenständiges
(nicht unbedingt nummeriertes) Kapitel sein?
(Bei Einteilung mittels \frontmatter/\mainmatter/\backmatter
könnte das sinnvoll sein.)
- Soll das Literaturverzeichnis tatsächlich ein (womöglich noch
nummerierter) Abschnitt eines Kapitels sein?
Dann hättest du ein Kapitel-Inhaltsverzeichnis, in welchem
der Abschnitt mit dem Literaturverzeichnis nicht aufgelistet ist,
während er im Hauptinhaltsverzeichnis aufgelistet ist.
Das könnte befremdlich wirken.

Aber als erstes ein paar Vorbemerkungen.

- Wenn LaTeX den Quelltext eines Dokumentes verarbeitet, wird anhand
der Gliederungsbefehle \chapter, \section, \subsection etc
eine Datei mit der Dateinamenserweiterung .toc erstellt, die
der Reihe nach Einträge für alle Abschnittsüberschriften enthält.

Diese Einträge sind von der Form

\contentsline{<Gliederungsebene>}%
{<Eintrag, ggfs. mit Anweisungen für gepunktete Linie bis zur Seitenzahl>}%
{<Seitenzahl>}%
{<Im Falle, dass das hyerref-Paket geladen ist, Name des Sprungziels des Hyperlinks>}%

Der Befehl \tableofcontents bewirk im wesentlichen, dass eine
Überschrift, z-B. "Inhaltsverzeichnis" gesetzt und danach die
.toc-Datei eingelesen wird.

Wie dieses Erstellen der Datei mit den Dateinamenserweiterung .toc
genau erfolgt, ist eine interessante Angelegenheit für sich, die aber
im folgenden für das Verständnis nicht wichtig ist.

- Du verwendest die Dokumentklasse svmono. Diese Dokumentklasse
baut auf der Dokumentklasse book auf, die bei LaTeX standardmäßig
dabei ist.

Bei Sachen, die auf book aufbauen, ist es in der Regel so,
dass gesternte Abschnittsüberschriftsbefehle, also Sachen
wie \chapter*{...} und \section*{...} eine Abschrittsüberschrift
erzeugen, die weder nummeriert ist, noch im Inhaltsverzeichnis
erscheint.

- Du verwendest das Paket biblatex, um das Literaturverzeichnis
zu setzen und zwar mittels des Befehls \printbibliography.

Dieser Befehl hat ein optionales Argument, welches
key=value-Paare verarbeitet.

Mittels des key "heading", also
\printbiblioraphy[... , heading=<style>, ....]
kann man styles dafür angeben, wie die Überschrift des
Literaturverzeichnisses gesetzt werden soll - z.B. ob als
\chapter oder als \section.

So einen <style> kann man mittels \defbibheading definieren.

Keiner der im Paket biblatex oder in der Dokumentklasse
svmono bereits vordefinierten Styles setzt die Überschrift des
Literaturverzeichnisses als Kapitelüberschrift.

Wenn du das möchtest, musst du daür eigene Styles definieren und bei
\printbibliography verwenden.

Ein kurzer Blick in den Quellcode der Dokumentklase svmono.cls ergibt:

Bei dieser Dokumentklasse wird (fahrlässigerweise?) generell davon
ausgegangen, dass der Befehl \secbibl nicht definiert ist, wenn die Option
"sectrefs" nicht angegeben wurde, und dass er definiert ist, wenn
sie angegeben wurde. An Stellen im Quellcode, in denen es darum
geht, ob diese Option angegeben ist, wird einfach mittels
\ifx\secbibl\undefined ... \else ... \fi
geprüft, ob dieser Befehl definiert ist. (Fahrlässig deshalb,
weil böswillige User ihn selbst definieren könnten...)

Du kannst also bei Verwendung der Dokumentklasse svmono
für ¸\printbibliography z.B. einen heading-style
"BibUnnumberedInToc" wie folgt definieren:

\defbibheading{BibUnnumberedInToc}[\bibname]{%
\csname \ifx\secbibl\undefined chapter\else section\fi\endcsname*{#1}%
\markboth{#1}{#1}%
\ifx\secbibl\undefined
\addcontentsline{toc}{chapter}{#1}%
\else
\addcontentsline{toc}{section}{#1}%
\fi
}%

Dieser Style macht aus der Überschrift des Literaturverzeichnisses
ein \chapter* oder eine \section*, je nachdem, ob die Option
"sectrefs" angegeben ist oder nicht. Zusätzlich macht er einen
entsprechenden Eintrag ins Inhaltsverzeichnis.

In den unten folgenden Beispielen sind analog auch noch Styles
"BibNumberedInToc" und "BibUnnumberedNotInToc" definiert.

- Du verwendest das Paket etoc, um Unterinhaltsverzeichnisse zu
erzeugen.

Normalerweise stellt man die Tiefe des Inhaltsverzeichnisses über
einen Zähler "tocdepth" ein.

Wenn dank des Befehls \tableofcontents die .toc-Datei mit den
\contentsline{<Gliederungsebene>}{...}{...}{...}-Befehlen für
die Einträge der einzelnem Abschnittsüberschriften im Inhaltsverzeichnis
eingelesen wird, werden das <Gliederungsebene>-Argument und der
Wert des tocdepth-Zählers abgeprüft, um zu entscheiden, ob der
\contentsline-Befehl einen Eintrag im Inhaltsverzeichnis
bewirken soll oder nicht.

Der Clou ist: Den Wert des tocdepth-Zählers kann man auch innerhalb
der .toc-Datei noch setzen.
Z.B., mit der Anweisung
\addcontentsline{toc}{\setcounter{tocdepth}{-3}}
wird in die .toc-Datei die Anweisung
\setcounter{tocdepth}{-3}
hinein geschrieben.
Sie gilt dann für alle in der .toc-Datei danach noch folgenden
\contentsline-Einträge.

Dann hat die .toc-Datei z.B. eine Struktur der Art

\contentsline {chapter}{\numberline {1}Introduction}{3}%
\contentsline {section}{\numberline {1.1}Motivation}{3}%
\setcounter{tocdepth}{-3}%
\contentsline {section}{\numberline {1.2}Structure}{3}%
\setcounter{tocdepth}{2}%
\contentsline {chapter}{\numberline {2}Conclusion}{5}%
\contentsline {section}{\numberline {2.1}Definitions}{5}%
\contentsline {section}{\numberline {2.2}Results}{5}%
\contentsline {chapter}{Literature}{7}%

und die Anweisung

\contentsline {section}{\numberline {1.2}Structure}{3}%

wird nicht zu einem Eintrag im Inhaltsverzeichnis führen, da
während ihrer Abarbeitung der Wert von tocdepth negativ ist.

Das etoc-Paket erweitert diesen Mechanismus:

Anstatt \setcounter{tocdepth}{...}-Anweisungen in die .toc-Datei
zu schreiben, kann man mittels des Befehls

\etocdepthtag.toc{<Name des tag>}%

einen tag in die .toc-Datei schreiben.

Jeweils(!) vor(!) Aufruf von \tableofcontents bzw. \localtableofcontents
kann man mittels des Befehls

\etocsettagdepth{<Name des tag>}{<Wert für den tocdepth-Zähler>}%

festlegen, auf welchen Wert der tocdepth-Zähler gesetzt wird wenn
beim Einlesen der .toc-Datei das tag <Name des tag> verarbeitet wird.

Man kann also vor und nach \printbibliography jeweils mittels
\etocdepthtag.toc ein tag in die .toc-Datei setzen lassen und dann
jeweils vor Aufruf von \tableofcontents bzw. \localtableofcontents
mittels \etocsettagdepth festlegen, bis zu welcher Gliederungsebene
Abschnittsüberschriftseinträge, die nach dem tag in der .toc-Datei
stehen, zu Einträgen im Inhaltsverzeichnis führen.

Und auf diese Weise für die Überschrift des Literaturverzeichnisses
festlegen, bei welchen Inhaltsverzeichnissen sie auftaucht und bei
welchen nicht.


Bei den folgenden Minimalbeispielen wird mittels filecontents*-Umgebung
jeweils eine Dummy-.bib-Datei erzeugt. Ansonsten habe ich mich bemüht, so
wenig wie möglich an deinem Code zu ändern.


Es folgt nun ein Beispiel, bei dem das Literaturverzeichnis im Falle,
dass die Dokumentklassenoption "sectrefs" angegeben ist, als
\section/\section* gesetzt wird und im Falle, dass diese Option
nicht angegeben ist, als \chapter/\chapter* gesetzt wird:

Je nachdem, welchen der Befehle

\printbibliography[title={Literature},heading=BibUnnumberedInToc]%
\printbibliography[title={Literature},heading=BibUnnumberedNotInToc]%
\printbibliography[title={Literature},heading=BibNumberedInToc]%

man aktiviert, ist die Überschrift des Literaturverzeichnisses nummeriert
oder nicht und/oder erscheint
- ohne Angabe der Dokumentklassenoption "sectrefs" ggfs als
\chapter/\chapter* und ggfs. im Hauptinhaltsverzeichnis;
- mit Angabe der Dokumentklassenoption "sectrefs" ggfs als
\section/\section* und im Hauptinhaltsverzeichnis und in den
Kapitel-Unterverzeichnissen:


------ Schnippel -----------------------------------------------------

% Erzeugung der dummy-.bib-Dateien für bibTeX bzw bibLaTeX:
%
\begin{filecontents*}{\jobname.bib}
@Article{thingie1,
author = {A. N. Author},
title = {A title},
year = {2525},
journal = {A journal}
}
@Article{thingie2,
author = {Anothe R. Author},
title = {Another title},
year = {2525},
journal = {Another journal}
}
\end{filecontents*}

% Und jetzt mal ein Dokument basteln:
%
\documentclass[graybox,envcountchap]{svmono} % Springer-Stil

\usepackage[english]{babel}
\usepackage{csquotes}

% Paket biblatex und Einrichtung der durch biblatex bereitgestellten Infrastruktur:
\usepackage[backend=biber]{biblatex}
%-------------------------------------------------------------------------
% Styles fürs Setzen der Überschrift des Literaturverzeichnisses:
\makeatletter
\defbibheading{BibUnnumberedInToc}[\bibname]{%
\csname \ifx\secbibl\undefined chapter\else section\fi\endcsname*{#1}%
\markboth{\***@MakeMarkcase{#1}}{\***@MakeMarkcase{#1}}%
\ifx\secbibl\undefined
\addcontentsline{toc}{chapter}{#1}%
\else
\addcontentsline{toc}{section}{#1}%
\fi
}%
\defbibheading{BibNumberedInToc}[\bibname]{%
\csname \ifx\secbibl\undefined chapter\else section\fi\endcsname{#1}%
}%
\defbibheading{BibUnnumberedNotInToc}[\bibname]{%
\csname \ifx\secbibl\undefined chapter\else section\fi\endcsname*{#1}%
\markboth{\***@MakeMarkcase{#1}}{\***@MakeMarkcase{#1}}%
}%
\makeatother
%-------------------------------------------------------------------------
% biblatex soll die Daten für die im Dokument zu erzeugenden
% Quellenangaben aus der Datei \jobname.bib entnehmen:
%
\addbibresource{\jobname.bib}

% Paket eroc und Einrichtung der durch biblatex bereitgestellten Infrastruktur:
\usepackage{etoc}

% Paket hyperref und Einrichtung der durch biblatex bereitgestellten Infrastruktur:
%\usepackage{hyperref}

% Titel des Dokumentes:
\author{Authors}%
\title{MWE etoc}%

\begin{document}
\maketitle

\tableofcontents

\chapter{Introduction}
\etocsettocstyle{\subsection*{\contentsname}}{\noindent\rule{\linewidth}{.4pt}}%
\localtableofcontents

\section{Motivation}

\section{Structure}
Citation \cite{thingie1}.

\chapter{Conclusion}
\localtableofcontents

\section{Definitions}

\section{Results}
Citation \cite{thingie2}.

% Das Literaturverzeichnis mittels eines der selbstdefinierten
% Styles, die \chapter/\chapter* oder \section/\section*
% in Abhängigkeit von der Dokumentklassenoption "sectrefs"
% ausführen:
\begingroup
\setlength{\emergencystretch}{.5em}%
\printbibliography[title={Literature},heading=BibNumberedInToc]%
%\printbibliography[title={Literature},heading=BibUnnumberedInToc]%
%\printbibliography[title={Literature},heading=BibUnnumberedNotInToc]%
\endgroup

\end{document}

------ Schnappel -----------------------------------------------------



Es folgt nun ein Beispiel, bei dem zusätzlich das Literaturverzeichnis
allenfalls im Hauptinhaltsverzeichnis erscheint.

Je nachdem, welchen der Befehle

\printbibliography[title={Literature},heading=BibUnnumberedInToc]%
\printbibliography[title={Literature},heading=BibUnnumberedNotInToc]%
\printbibliography[title={Literature},heading=BibNumberedInToc]%

man aktiviert, ist die Überschrift des Literaturverzeichnisses nummeriert
oder nicht und/oder erscheint
- ohne Angabe der Dokumentklassenoption "sectrefs" ggfs als
\chapter/\chapter* und ggfs. im Hauptinhaltsverzeichnis;
- mit Angabe der Dokumentklassenoption "sectrefs" ggfs als
\section/\section* und im Hauptinhaltsverzeichnis, aber nicht
in den Kapitel-Unterverzeichnissen:

Ich habe mal spaßeshalber die Dokumentklassenoption "sectrefs"
mitangegeben, damit man sieht, wie seltsam es ist, das
Literaturverzeichnis, wenn es ein (gar noch nummerierter) Abschnitt
eines Kapitels ist, im Hauptinhaltsverzeichnis bzw. Kapitel-
Inhaltsverzeichnissen wegzulassen - insbesondere wenn es eine
eigene Abschnittsnummer hat:

------ Schnippel -----------------------------------------------------

% Erzeugung der dummy-.bib-Dateien für bibTeX bzw bibLaTeX:
%
\begin{filecontents*}{\jobname.bib}
@Article{thingie1,
author = {A. N. Author},
title = {A title},
year = {2525},
journal = {A journal}
}
@Article{thingie2,
author = {Anothe R. Author},
title = {Another title},
year = {2525},
journal = {Another journal}
}
\end{filecontents*}

% Und jetzt mal ein Dokument basteln:
%
\documentclass[graybox,envcountchap,sectrefs]{svmono} % Springer-Stil

\usepackage[english]{babel}
\usepackage{csquotes}

% Paket biblatex und Einrichtung der durch biblatex bereitgestellten Infrastruktur:
\usepackage[backend=biber]{biblatex}
%-------------------------------------------------------------------------
% Styles fürs Setzen der Überschrift des Literaturverzeichnisses:
\makeatletter
\defbibheading{BibUnnumberedInToc}[\bibname]{%
\csname \ifx\secbibl\undefined chapter\else section\fi\endcsname*{#1}%
\markboth{\***@MakeMarkcase{#1}}{\***@MakeMarkcase{#1}}%
\ifx\secbibl\undefined
\addcontentsline{toc}{chapter}{#1}%
\else
\addcontentsline{toc}{section}{#1}%
\fi
}%
\defbibheading{BibNumberedInToc}[\bibname]{%
\csname \ifx\secbibl\undefined chapter\else section\fi\endcsname{#1}%
}%
\defbibheading{BibUnnumberedNotInToc}[\bibname]{%
\csname \ifx\secbibl\undefined chapter\else section\fi\endcsname*{#1}%
\markboth{\***@MakeMarkcase{#1}}{\***@MakeMarkcase{#1}}%
}%
\makeatother
%-------------------------------------------------------------------------
% biblatex soll die Daten für die im Dokument zu erzeugenden
% Quellenangaben aus der Datei \jobname.bib entnehmen:
%
\addbibresource{\jobname.bib}

% Paket eroc und Einrichtung der durch biblatex bereitgestellten Infrastruktur:
\usepackage{etoc}

% Paket hyperref und Einrichtung der durch biblatex bereitgestellten Infrastruktur:
%\usepackage{hyperref}

% Titel des Dokumentes:
\author{Authors}%
\title{MWE etoc}%

\begin{document}
\maketitle

\etocsettagdepth{VorDemEintragDerUeberschriftDesLiteraturverzeichnisses}{\number\value{tocdepth}}%
\etocsettagdepth{NachDemEintragDerUeberschriftDesLiteraturverzeichnisses}{\number\value{tocdepth}}%
\tableofcontents

\chapter{Introduction}
\etocsettocstyle{\subsection*{\contentsname}}{\noindent\rule{\linewidth}{.4pt}}%
\localtableofcontents

\section{Motivation}

\section{Structure}
Citation \cite{thingie1}.

\chapter{Conclusion}
\etocsettagdepth{VorDemEintragDerUeberschriftDesLiteraturverzeichnisses}{-3}%
\etocsettagdepth{NachDemEintragDerUeberschriftDesLiteraturverzeichnisses}{\number\value{tocdepth}}%
\localtableofcontents

\section{Definitions}

\section{Results}
Citation \cite{thingie2}.

% Das Literaturverzeichnis mittels eines der selbstdefinierten
% Styles, die \chapter/\chapter* oder \section/\section*
% in Abhängigkeit von der Dokumentklassenoption "sectrefs"
% ausführen:
\begingroup
\setlength{\emergencystretch}{.5em}%
\etocdepthtag.toc{VorDemEintragDerUeberschriftDesLiteraturverzeichnisses}%
%\printbibliography[title={Literature},heading=BibNumberedInToc]%
\printbibliography[title={Literature},heading=BibUnnumberedInToc]%
%\printbibliography[title={Literature},heading=BibUnnumberedNotInToc]%
\etocdepthtag.toc{NachDemEintragDerUeberschriftDesLiteraturverzeichnisses}%
\endgroup

\end{document}

------ Schnappel -----------------------------------------------------


Mit freundlichem Gruß

Ulrich
Carlo XYZ
2023-09-24 19:46:37 UTC
Permalink
Post by Ulrich D i e z
Nach dem gestrigen "Vorgeplänkel" kann ich dir jetzt
(hoffentlich) vernünftig antworten.
Wow, da hast du dir echt toll viel Mühe gegeben, danke.
War zwar nach meinem Abwinken gestern nicht nötig, kann
aber ggfs. sehr hilfreich sein. Letzten Endes lief's
auf eine vernünftige (was immer das heißt) Kombination
von verschiedenen Parametern der Kommandos heraus. Bis
auf Weiteres. Wenn der Verlag uns nicht (nochmal) in
die Quere kommt. Das war nicht unser einziges Problem
mit svmono (ein anderes betraf die package shuffle).
Post by Ulrich D i e z
Mit freundlichem Gruß
Dito.

Lesen Sie weiter auf narkive:
Loading...