Я хочу, чтобы в TOC и заголовках разделов после римских номеров разделов ставилась точка. Вот MWE.
\documentclass{book}
\renewcommand{\thesection}{\Roman{section}.}
\begin{document}
\tableofcontents
\section{First section\label{l}}
This is Section \ref{l}.
\end{document}
Это приводит к
Появляется лишняя точка в ссылке. Однако, если я уберу конечную точку из
\renewcommand{\thesection}{\Roman{section}.}
,
точки в оглавлении и метке раздела исчезают вместе с ним.
Как мне это решить? Спасибо.
решение1
Запись точки .
в .aux
файл для метки должна быть предотвращена, поэтому трюк заключается в атаке, \@currentlabel
когда дело доходит до записи \p@section
.
Это поглощает точку \thesection
путем изменения \p@section
и записывает \Roman{section}
заново ссылки, но сохраняет I.
формат оглавления и заголовков.
\thesection
Никакие другие классы или пакеты не задействованы, недостатком является необходимость помнить определение .
ВидетьЗапись условий теорем с автоматической нумерацией и меткамидля другого применения этого «трюка».
\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}
решение2
Самый простой способ — изменить класс. Scrbook из пакета KOMA имеет функцию «autodot», которая добавляет точку только в нужных местах:
\documentclass{scrbook}
\renewcommand{\thesection}{\Roman{section}}
\begin{document}
\tableofcontents
\section{First section\label{l}}
This is Section \ref{l}.
\end{document}
решение3
Вот решение, которое работает с book
классом документа. Оно (a) использует tocloft
пакет и (b) сбрасывает низкоуровневый макрос LaTeX \@seccntformat
для записей уровня раздела.
\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}
решение4
Можно использовать titlesec
и titletoc
. Но тогда к номерам всех уровней раздела добавляется точка.
\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}
Вот дополнительное предложение KOMA-Script, которое добавляет точку только на уровне раздела:
\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}