O comando personalizado "Seção/subseção avançada" produz um comportamento de numeração inesperado

O comando personalizado "Seção/subseção avançada" produz um comportamento de numeração inesperado

Estou tentando criar novos comandos para "seções/subseções avançadas" (semelhante ao que você pode ver em um livro didático, onde uma "seção com estrela" indica um tópico avançado ou uma seção que você pode pular na primeira leitura).

Até agora, juntei comandos que colocam a estrela ao lado do número da seção/subseção no próprio documento e no ToC. No entanto, há um efeito colateral estranho onde:

  1. depois de usar o comando "seção avançada", a subseção a seguir não exibe o número da subseção

  2. depois de usar o comando "subseção avançada", as seções a seguir sempre exibem um número de subseção "inútil" de 0,0

Curiosamente, as entradas do ToC se comportam exatamente como esperado, sem problemas de numeração. Então, o que poderia estar causando esse comportamento inesperado no próprio documento?

Incluí abaixo um MWE ilustrando esse comportamento. (As numerosas seções/subseções têm como objetivo ilustrar diferentes permutações do uso de comandos de seção/subseção "regulares" e "avançados".)

\documentclass{book}

\usepackage{titlesec}
\usepackage{titletoc}
\usepackage{tocloft}

\makeatletter
\newcommand{\advsection}[2][section]{%
    \def\@seccntformat##1{\protect\llap{\large*}\csname the#1\endcsname\quad}%
    \addtocontents{toc}{%
        \let\protect\mtnumberline\protect\numberline%
        \def\protect\numberline{%
            \hskip0pt%
            \global\let\protect\numberline\protect\mtnumberline%
            \protect\llap{\normalfont\normalsize*}%
            \protect\mtnumberline%
        }%
    }%
    \csname #1\endcsname{#2}%
    \def\@seccntformat##1{\csname the#1\endcsname\quad}%
}
\newcommand{\advsubsection}[2][subsection]{%
    \def\@seccntformat##1{\protect\llap{\large*}\csname the#1\endcsname\quad}%
    \addtocontents{toc}{%
        \let\protect\mtnumberline\protect\numberline%
        \def\protect\numberline{%
            \hskip0pt%
            \global\let\protect\numberline\protect\mtnumberline%
            \protect\llap{\normalfont\normalsize*}%
            \protect\mtnumberline%
        }%
    }%
    \csname #1\endcsname{#2}%
    \def\@seccntformat##1{\csname the#1\endcsname\quad}%
}
\makeatother

\begin{document}
    \frontmatter
    \tableofcontents
    \newpage

    \mainmatter
    \chapter{My first chapter}
    \section{My first section}
    Blah
    \advsection{My second section}
    Blah
    \section{My third section}
    Blah
    \advsection{My fourth section}
    Blah
    \subsection{My first subsection}
    Blah
    \advsubsection{My second subsection}
    Blah
    \subsection{My third subsection}
    Blah
    \advsubsection{My fourth subsection}
    Blah
    \section{My fifth section}
    Blah
    \subsection{My first subsection}
    Blah
\end{document}

Uma captura de tela do índice Uma captura de tela da subseção sem número de subseção Uma captura de tela da seção com número de subseção inútil

Responder1

O problema é a linha onde você redefiniu o arquivo \@seccntformat. Seu código parece

\def\@seccntformat##1{\protect\llap{\large*}\csname the#1\endcsname\quad}

observe que você digitou a definição the#1em vez de the##1e da mesma forma para a definição que restaura a definição original de \@seccntformat. Como você conseguiu escrever o código acima, provavelmente poderá descobrir por que isso é um problema. Se você alterar todas as quatro ocorrências, the##1seu código funcionará conforme o esperado.

informação relacionada