Ich möchte, dass auf römische Abschnittsnummern im Inhaltsverzeichnis und in Abschnittstiteln ein Punkt folgt. Hier ist das MWE.
\documentclass{book}
\renewcommand{\thesection}{\Roman{section}.}
\begin{document}
\tableofcontents
\section{First section\label{l}}
This is Section \ref{l}.
\end{document}
Das führt zu
Ein zusätzlicher Punkt in der Referenz erscheint. Wenn ich jedoch den nachfolgenden Punkt entferne aus
\renewcommand{\thesection}{\Roman{section}.}
,
die Punkte im Inhaltsverzeichnis und in der Abschnittsbeschriftung verschwinden dabei.
Wie kann ich das lösen? Danke.
Antwort1
Das Schreiben des Punktes .
in die Datei für das Label muss verhindert werden, der Trick besteht also darin , beim Schreiben .aux
anzugreifen .\@currentlabel
\p@section
Dadurch wird der Punkt \thesection
durch Änderung verschlungen \p@section
und \Roman{section}
die Referenzen werden erneut geschrieben, das I.
Format für das Inhaltsverzeichnis und die Überschriften wird jedoch beibehalten.
Es sind keine anderen Klassen oder Pakete beteiligt, der Nachteil besteht darin, dass die Definition \thesection
gespeichert werden muss.
SehenSchreiben von Theorembedingungen mit automatischer Nummerierung und Beschriftungfür eine andere Anwendung dieses „Tricks“.
\documentclass{book}
\renewcommand{\thesection}{\Roman{section}.}
\makeatletter
\def\remove@@dot\csname the#1\endcsname{\Roman{#1}}
\def\p@section{\remove@@dot}
\makeatother
\begin{document}
\tableofcontents
\section{First section\label{l}}
This is Section \ref{l}.
\end{document}
Antwort2
Am einfachsten geht das, indem man die Klasse ändert. scrbook aus dem KOMA-Bundle verfügt über eine „Autodot“-Funktion, die den Punkt nur an den entsprechenden Stellen einfügt:
\documentclass{scrbook}
\renewcommand{\thesection}{\Roman{section}}
\begin{document}
\tableofcontents
\section{First section\label{l}}
This is Section \ref{l}.
\end{document}
Antwort3
Hier ist eine Lösung, die mit der book
Dokumentklasse funktioniert. Sie (a) verwendet das tocloft
Paket und (b) setzt das Low-Level-LaTeX-Makro \@seccntformat
für Einträge auf Abschnittsebene zurück.
\documentclass{book}
\renewcommand{\thesection}{\Roman{section}}
\makeatletter
\def\@seccntformat#1{\@ifundefined{#1@cntformat}%
{\csname the#1\endcsname\quad}% default
{\csname #1@cntformat\endcsname}}% enable individual control
\newcommand\section@cntformat{\thesection.\quad} % for section-level entries
\makeatother
\usepackage[titles]{tocloft}
\renewcommand{\cftsecaftersnum}{.} % place "." after section-level "number"
\begin{document}
\tableofcontents
\section{First section\label{l}}
This is Section \ref{l}.
\end{document}
Antwort4
Sie können titlesec
und verwenden titletoc
. Allerdings wird dann den Nummern auf allen Abschnittsebenen ein Punkt hinzugefügt.
\documentclass{book}
\renewcommand{\thesection}{\Roman{section}}
\usepackage{titlesec}
\titlelabel{\thetitle.\enskip}
\usepackage[dotinlabels]{titletoc}
\begin{document}
\tableofcontents
\section{First section\label{l}}
Section \ref{l} contains new definitions.
\end{document}
Hier ist ein zusätzlicher KOMA-Script-Vorschlag, der den Punkt nur auf Abschnittsebene hinzufügt:
\documentclass[
numbers=noenddot
]
{scrbook}
\addtokomafont{disposition}{\rmfamily}
\renewcommand{\thesection}{\Roman{section}}
\usepackage{xpatch}
\xpatchcmd{\sectionformat}{\autodot}{.}{}{\PatchFailed}
\newcommand\sectionentrynumberformat[1]{\renewcommand\autodot{.}#1}
\RedeclareSectionCommand[
tocentrynumberformat=\sectionentrynumberformat
]{section}
\usepackage{blindtext}
\begin{document}
\tableofcontents
\section{First section\label{l}}
Section \ref{l} contains new definitions.
%
\blinddocument
\end{document}