Período no TOC, mas não na referência

Período no TOC, mas não na referência

Quero que os números das seções romanas sejam seguidos por um ponto final no sumário e nos títulos das seções. Aqui está o MWE.

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

Isto resulta em

Período extra na ref

Um ponto extra na referência aparece. No entanto, se eu remover o ponto final de

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

os pontos no sumário e no rótulo da seção desaparecem com ele.

Sem ponto final no sumário e no rótulo da seção

Como posso resolver isso? Obrigado.

Responder1

A gravação do ponto .no .auxarquivo para o rótulo deve ser evitada, então o truque é atacar \@currentlabelna hora de escrever \p@section.

Isso engole o ponto \thesectionalterando \p@sectione escrevendo \Roman{section}novamente para as referências, mas mantém o I.formato do sumário e dos títulos.

Não há nenhuma outra classe ou pacote envolvido, a desvantagem é que a definição de \thesectiondeve ser lembrada.

VerEscrevendo condições de teorema com numeração e rótulos automáticospara outra aplicação deste 'truque'.

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

insira a descrição da imagem aqui

Responder2

A maneira mais fácil é mudar de classe. scrbook do pacote KOMA possui um recurso "autodot" que adiciona o ponto apenas nos locais apropriados:

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

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

insira a descrição da imagem aqui

Responder3

Aqui está uma solução que funciona com a bookclasse document. Ele (a) usa o tocloftpacote e (b) redefine a macro LaTeX de baixo nível \@seccntformatpara entradas em nível de seção.

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

Responder4

Você pode usar titlesece titletoc. Mas então um ponto é adicionado aos números de todos os níveis de seção.

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

insira a descrição da imagem aqui


Aqui está uma sugestão adicional do KOMA-Script que adiciona o ponto apenas ao nível da seção:

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

insira a descrição da imagem aqui

insira a descrição da imagem aqui

informação relacionada