Período en TOC pero no en referencia

Período en TOC pero no en referencia

Quiero que los números de las secciones romanas vayan seguidos de un punto en el TOC y en los títulos de las secciones. Aquí está el MWE.

\documentclass{book}
\renewcommand{\thesection}{\Roman{section}.}
\begin{document}
 \tableofcontents
 \section{First section\label{l}}
 This is Section \ref{l}.
\end{document}

Esto resulta en

Periodo extra en ref.

Aparece un punto extra en la referencia. Sin embargo, si elimino el período final de

\renewcommand{\thesection}{\Roman{section}.},

los puntos en TOC y la etiqueta de la sección desaparecen con él.

Sin punto en TOC y etiqueta de sección

¿Como puedo resolver esto? Gracias.

Respuesta1

Se debe evitar la escritura del punto .en el archivo para la etiqueta, por lo que el truco está en atacar a la hora de escribir ..aux\@currentlabel\p@section

Esto devora el punto \thesectioncambiando \p@sectiony escribe \Roman{section}nuevamente para las referencias, pero mantiene el I.formato para la ToC y los encabezados.

No hay otra clase o paquete involucrado, la desventaja es que \thesectionse debe recordar la definición de.

VerEscribir condiciones de teoremas con numeración y etiquetas automáticas.para otra aplicación de este 'truco'.

\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}

ingrese la descripción de la imagen aquí

Respuesta2

La forma más sencilla es cambiar de clase. scrbook del paquete KOMA tiene una función de "punto automático" que agrega el punto solo en los lugares apropiados:

\documentclass{scrbook}
\renewcommand{\thesection}{\Roman{section}}

\begin{document}
 \tableofcontents
 \section{First section\label{l}}
 This is Section \ref{l}.
\end{document}

ingrese la descripción de la imagen aquí

Respuesta3

Aquí hay una solución que funciona con la bookclase de documento. (a) utiliza el tocloftpaquete y (b) restablece la macro LaTeX de bajo nivel \@seccntformatpara las entradas a nivel de sección.

\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}

Respuesta4

Puedes usar titlesecy titletoc. Pero luego se agrega un punto a los números de todos los niveles de sección.

\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}

ingrese la descripción de la imagen aquí


Aquí hay una sugerencia adicional de KOMA-Script que agrega el punto solo al nivel de la sección:

\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}

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

información relacionada