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
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.
¿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 \thesection
cambiando \p@section
y 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 \thesection
se 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}
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}
Respuesta3
Aquí hay una solución que funciona con la book
clase de documento. (a) utiliza el tocloft
paquete y (b) restablece la macro LaTeX de bajo nivel \@seccntformat
para 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 titlesec
y 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}
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}