%20in%20der%20Buchklasse%20voranstellen%20und%20umbrechen%3F%20.png)
Ich suche nach einer Möglichkeit, den Text „Kapitel“ als Präfix zur Kapitelnummerierung in ein Inhaltsverzeichnis für eine Buchklasse einzufügen UND den Kapiteltitel in der Inhaltsverzeichnisliste bis zum äußersten linken Rand zu umbrechen. Ich baue dies in eine gemeinsame Ressource ein, derzeit in zwei Teilen, einer als Klassendatei nur mit Paketen und der andere als Einstellungsdatei .tex, die in der Präambel \input ist. Ich habe zwei verschiedene Ansätze innerhalb der Einstellungsdatei ausprobiert. Der erste unten erfasst den erforderlichen Patch nicht richtig.
\documentclass{book}
\usepackage{xpatch}
\usepackage{hyperref}
\makeatletter
\xpatchcmd{\@chapter}
{\addcontentsline{toc}{chapter}{\numberline {#1}}}
{\addcontentsline{toc}{chapter}{\numberline {Chapter~\thechapter{}.~#1}}}
{\typeout{Success}}
{\typeout{Failed!}}
\makeatother
\begin{document}
\tableofcontents
\chapter{This is First}
Some day this will work.
\chapter{This is Second}
Perhaps soon!
\end{document}
Bei diesem zweiten Ansatz wird das Wort „Kapitel“ an die richtige Stelle im Inhaltsverzeichnis gesetzt, der Text im längeren Titel von Kapitel 2 wird in der Inhaltsverzeichniszeile jedoch nicht wie erforderlich umbrochen.
\documentclass{book}
\usepackage{tocloft}
\begin{document}
\newlength{\tocchapwidth}
\settowidth{\tocchapwidth}{\chaptername\ }
\addtolength{\cftchapnumwidth}{\tocchapwidth}
\renewcommand{\cftchappresnum}{\chaptername\ }
\renewcommand{\cftchapaftersnum}{.}
\renewcommand{\cftchapaftersnumb}{~}
\renewcommand{\cftchapdotsep}{\cftdotsep}
\tableofcontents
\chapter{This is First}
Some day this will work.
\chapter{This is Second, a Rather Long and Windy Road Leading to a Door Going to Nowhere Fast}
Perhaps soon!
\end{document}
Dies ist ein Versuch, die Formatierungsanforderungen für ein Dokument mit Abschlussarbeiten/Dissertationen zu erfüllen. Derzeit haben wir eine einfache Lösung: Wir geben den Kapiteltitel einschließlich des Präfixes ein, z. B. \chapter{Kapitel 2.~Dies ist das zweite ...} (und unterdrücken die Ausgabe der Kapitelnummer im Inhaltsverzeichnis mithilfe des Pakets titlesec).
Auch wenn ich es im zweiten Beispiel nicht einbinde, erfordert das Dokument das Hyperref-Paket. Aus einem separaten Posting schließe ich, dass ich möglicherweise den Hy@...-Kapitelbefehl patchen muss, aber selbst meine Versuche, dies zu tun, schlugen fehl.
Ich bin mit LaTeX3 nicht vertraut genug, werde solche Änderungen aber gerne einbauen. Schließlich hoffe ich, dass die angebotene Option auch problemlos mit Overleaf funktioniert, wo wahrscheinlich ein großer Teil der Benutzer des Pakets ihre Arbeit erledigen wird.
Antwort1
Ihr erster Ansatz bringt mehrere Probleme mit sich.
Erstens book.cls
fehlt bereits in der ursprünglichen Definition:
\addcontentsline{toc}{chapter}{\numberline {#1}}
in der Definition von \@chapter
, aber:
\addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}#1}
Es fehlt also \protect
ein richtiges Argument \numberline
und das erste Argument von \@chapter
wird ohne Klammern verwendet.
Das zweite Problem ist, dass nach dem Laden hyperref
der Definition \@chapter
Änderungen vorgenommen werden. Der Patch muss alsoVorWird geladen hyperref
.
Übrigens: Um die ursprüngliche Definition anzuzeigen, fügen Sie einfach \show\@chapter
„before“ hinzu \xpatchcmd
. Dadurch wird die aktuelle Definition vor dem Patchen \@chapter
in der log
-Datei ausgegeben.
Das dritte Problem ist, dass der Ersatz:
\addcontentsline{toc}{chapter}{\protect\numberline {Chapter~\thechapter{}.~#1}}
Würde nicht nur Chapter~<number>.
das Nummernargument, sondern auch den Titel einfügen. Also müsste es mindestens heißen:
\addcontentsline{toc}{chapter}{\numberline {Chapter~\thechapter{}.}#1}
Für diese Definition müsste jedoch auch \l@chapter
der Platz für die Nummer erhöht werden. Vielleicht möchten Sie stattdessen keinen Nummernplatz reservieren und stattdessen Folgendes verwenden:
\addcontentsline{toc}{chapter}{Chapter~\thechapter{}.~#1}
Also mit:
\documentclass{book}
\usepackage{xpatch}
\makeatletter
\xpatchcmd{\@chapter}
{\addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}#1}}
{\addcontentsline{toc}{chapter}{Chapter~\thechapter{}.~#1}}
{\typeout{Success}}
{\typeout{Failed!}}
\makeatother
\usepackage{hyperref}
\begin{document}
\tableofcontents
\chapter{This is First}
Some day this will work.
\chapter{This is Second}
Perhaps soon!
\end{document}
du erhältst:
Die Alternative mit der Verwendung von Chapter <number>.
als Argument \numberline
wäre beispielsweise:
\documentclass{book}
\usepackage{xpatch}
\makeatletter
\xpatchcmd{\@chapter}
{\addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}#1}}
{\addcontentsline{toc}{chapter}{\protect\numberline{Chapter~\thechapter{}.}#1}}
{\typeout{\string\@chapter\space patch success}}
{\typeout{\string\@chapter\space patch failed!}}
\xpatchcmd{\l@chapter}
{\setlength\@tempdima{1.5em}}
{\setlength\@tempdima{6em}}% increase reserved number width
{\typeout{\string\l@chapter\space patch success}}
{\typeout{\string\l@chapter\space patch failed!}}
\makeatother
\usepackage{hyperref}
\begin{document}
\tableofcontents
\chapter{This is First}
Some day this will work.
\chapter{This is Second}
Perhaps soon!
\end{document}
Das Ergebnis für einzeilige Einträge ist ähnlich wie beim ersten Vorschlag. Um einen Unterschied zu sehen, versuchen Sie Einträge mit mehr als einer Zeile, z. B.
\chapter{This is Second Chapter with very long Titel Needing more than one
Line in the Table of Contents}
Meiner bescheidenen Meinung nach ist mein zweiter Ansatz also genau das, was Sie wollen.
.
Dein Problem bei deinem zweiten Ansatz ist, dass du den Punkt und das Leerzeichen ~
nach der Zahl bei der Erhöhung nicht berücksichtigst \cftchapnumwidth
. Hier eine mögliche Korrektur deiner Einstellung:
\documentclass{book}
\usepackage{tocloft}
\begin{document}
\newlength{\tocchapwidth}
\renewcommand{\cftchappresnum}{\chaptername\ }
\settowidth{\tocchapwidth}{\cftchappresnum}
\renewcommand{\cftchapaftersnum}{.~}
\newlength{\tocchapafternumwidth}
\settowidth{\tocchapafternumwidth}{\cftchapaftersnum}
\addtolength{\cftchapnumwidth}{\tocchapwidth}
\addtolength{\cftchapnumwidth}{\tocchapafternumwidth}
\renewcommand{\cftchapdotsep}{\cftdotsep}
\tableofcontents
\chapter{This is First}
Some day this will work.
\chapter{This is Second, a Rather Long and Windy Road Leading to a Door Going to Nowhere Fast}
Perhaps soon!
\end{document}
Aber wenn Sie sich diesen Vorschlag genauer ansehen, ist er immer noch nicht korrekt, da Sie den Text in der aktuellen Dokumentschriftart messen und nicht in der Schriftart, die für die Kapiteleinträge verwendet wird. Der vorherige Code scheint also nur korrekt zu sein, ist es aber nicht. Für korrekten Code müssen Sie dies \cftchapfont
beim Messen der Textbreiten berücksichtigen. (Und jetzt müssen Sie die Breite nicht auch noch um das Leerzeichen erhöhen, wenn die Zahlenbreite ohne Präfix Chapter
und Postfix .
bereits ausreichend war.) Besserer Code wäre also etwa:
\documentclass{book}
\usepackage{tocloft}
\newlength{\tocchapwidth}
\newlength{\tocchapafternumwidth}
\renewcommand{\cftchappresnum}{\chaptername\ }
\renewcommand{\cftchapaftersnum}{.}
\renewcommand{\cftchapdotsep}{\cftdotsep}
\AtBeginDocument{% final font setup is done in \begin{document} so we delay all text measuring
\settowidth{\tocchapwidth}{\cftchapfont\cftchappresnum}%
\settowidth{\tocchapafternumwidth}{\cftchapfont\cftchapaftersnum}%
\addtolength{\cftchapnumwidth}{\tocchapwidth}%
\addtolength{\cftchapnumwidth}{\tocchapafternumwidth}%
}
\begin{document}
\tableofcontents
\chapter{This is First}
Some day this will work.
\chapter{This is Second, a Rather Long and Windy Road Leading to a Door Going to Nowhere Fast}
Perhaps soon!
\end{document}
Das Blinddarmproblem
Hinweis: Beide Beispiele sind nicht für Dokumente mit Anhang geeignet, da in diesem Fall Chapter
nicht der richtige Begriff im Anhang stehen würde.
Den empfohlenen Vorschlag ohne tocloft
Anhang passend für Dokumente zu machen, wäre einfach. Man muss nur das hartcodierte Chapter
durch ersetzen \@chapapp
und die Breite vergrößern:
\documentclass{book}
\usepackage{xpatch}
\makeatletter
\xpatchcmd{\@chapter}
{\addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}#1}}
{\addcontentsline{toc}{chapter}{\protect\numberline{\@chapapp~\thechapter{}.}#1}}
{\typeout{\string\@chapter\space patch success}}
{\typeout{\string\@chapter\space patch failed!}}
\xpatchcmd{\l@chapter}
{\setlength\@tempdima{1.5em}}
{\setlength\@tempdima{7em}}% increase reserved number width
{\typeout{\string\l@chapter\space patch success}}
{\typeout{\string\l@chapter\space patch failed!}}
\makeatother
\usepackage{hyperref}
\begin{document}
\tableofcontents
\chapter{This is First}
Some day this will work.
\chapter{This is Second}
Perhaps soon!
\appendix
\chapter{This is a Rather Long and Windy Road Leading to a Door Going
to Nowhere Fast}
\end{document}
Zur tocloft
Lösung könnten Sie beispielsweise Folgendes verwenden:
\documentclass{book}
\usepackage{tocloft}
\newlength{\tocchapwidth}
\newlength{\tocappwidth}
\newlength{\tocchapafternumwidth}
\renewcommand{\cftchappresnum}{\chaptername\ }
\renewcommand{\cftchapaftersnum}{.}
\renewcommand{\cftchapdotsep}{\cftdotsep}
\AtBeginDocument{%
\settowidth{\tocchapwidth}{\cftchapfont\chaptername}%
\settowidth{\tocappwidth}{\cftchapfont\appendixname}%
\ifdim\tocappwidth>\tocchapwidth
\addtolength{\cftchapnumwidth}{\tocappwidth}%
\else
\addtolength{\cftchapnumwidth}{\tocchapwidth}%
\fi
\settowidth{\tocchapafternumwidth}{\cftchapfont\cftchapaftersnum}%
\addtolength{\cftchapnumwidth}{\tocchapafternumwidth}%
}
\AddToHook{cmd/appendix/after}{%
\addtocontents{toc}{%
\protect\renewcommand{\protect\cftchappresnum}{\protect\appendixname{} }%
}%
}
\begin{document}
\tableofcontents
\chapter{This is First}
Some day this will work.
\chapter{This is Second, a Rather Long and Windy Road Leading to a Door Going to Nowhere Fast}
Perhaps soon!
\appendix
\chapter{A Rather Long Appendix Heading and Windy Road Leading to a Door Going to Nowhere Fast}
\end{document}