El comando personalizado "Sección/subsección avanzada" produce un comportamiento de numeración inesperado

El comando personalizado "Sección/subsección avanzada" produce un comportamiento de numeración inesperado

Estoy intentando crear nuevos comandos para "secciones/subsecciones avanzadas" (similar a lo que puede ver en un libro de texto, donde una "sección destacada" indica un tema avanzado o una sección que puede omitir en la primera lectura).

Hasta ahora, he improvisado comandos que colocan la estrella al lado del número de sección/subsección tanto en el documento como en el ToC. Sin embargo, existe un efecto secundario extraño que consiste en:

  1. después de usar el comando "sección avanzada", la siguiente subsección no muestra el número de subsección

  2. después de usar el comando "subsección avanzada", las siguientes secciones siempre muestran un número de subsección "inútil" de .0

Curiosamente, las entradas de ToC se comportan exactamente como se esperaba, sin problemas de numeración. Entonces, ¿qué podría estar causando este comportamiento inesperado en el documento?

He incluido a continuación un MWE que ilustra este comportamiento. (Las numerosas secciones/subsecciones están destinadas a ilustrar diferentes permutaciones del uso de comandos de sección/subsección "normales" y "avanzados").

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

Una captura de pantalla de la tabla de contenidos. Una captura de pantalla de la subsección sin número de subsección Una captura de pantalla de la sección con un número de subsección inútil

Respuesta1

El problema es la línea donde redefiniste \@seccntformat. Tu código se parece

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

tenga en cuenta que escribió la definición the#1en lugar de the##1y de manera similar para la definición que restaura la definición original de \@seccntformat. Como pudiste escribir el código anterior, probablemente puedas descubrir por qué esto es un problema. Si cambia en las cuatro apariciones, the##1su código funciona como se esperaba.

información relacionada