Точка в TOC, но не в ссылке

Точка в TOC, но не в ссылке

Я хочу, чтобы в 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}

введите описание изображения здесь

введите описание изображения здесь

Связанный контент