Der benutzerdefinierte Befehl „Erweiterter Abschnitt/Unterabschnitt“ führt zu unerwartetem Nummerierungsverhalten

Der benutzerdefinierte Befehl „Erweiterter Abschnitt/Unterabschnitt“ führt zu unerwartetem Nummerierungsverhalten

Ich versuche, neue Befehle für „erweiterte Abschnitte/Unterabschnitte“ zu erstellen (ähnlich dem, was Sie vielleicht in einem Lehrbuch sehen, wo ein „mit einem Sternchen markierter Abschnitt“ ein fortgeschrittenes Thema oder einen Abschnitt anzeigt, den Sie beim ersten Lesen überspringen können).

Bisher habe ich Befehle zusammengeschustert, die den Stern sowohl im Dokument selbst als auch im Inhaltsverzeichnis neben der Abschnitts-/Unterabschnittsnummer platzieren. Es gibt jedoch einen seltsamen Nebeneffekt:

  1. nach Verwendung des Befehls „Erweiterter Abschnitt“ wird im folgenden Unterabschnitt die Unterabschnittsnummer nicht angezeigt

  2. nach der Verwendung des Befehls „erweiterter Unterabschnitt“ wird in den folgenden Abschnitten immer die „nutzlose“ Unterabschnittsnummer .0 angezeigt

Interessanterweise verhalten sich die Inhaltsverzeichniseinträge genau wie erwartet, ohne Nummerierungsprobleme. Was könnte also die Ursache für dieses unerwartete Verhalten im Dokument selbst sein?

Ich habe unten ein MWE eingefügt, das dieses Verhalten veranschaulicht. (Die zahlreichen Abschnitte/Unterabschnitte sollen verschiedene Permutationen der Verwendung von „normalen“ und „erweiterten“ Abschnitts-/Unterabschnittsbefehlen veranschaulichen.)

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

Ein Screenshot des Inhaltsverzeichnisses Ein Screenshot des Unterabschnitts ohne Unterabschnittsnummer Ein Screenshot eines Abschnitts mit einer nutzlosen Unterabschnittsnummer

Antwort1

Das Problem ist die Zeile, in der Sie neu definiert haben \@seccntformat. Ihr Code sieht so aus:

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

the#1Beachten Sie, dass Sie die Definition anstelle von eingegeben haben the##1, und das Gleiche gilt für die Definition, die die ursprüngliche Definition von wiederherstellt \@seccntformat. Da Sie den obigen Code schreiben konnten, können Sie wahrscheinlich herausfinden, warum dies ein Problem ist. Wenn Sie alle vier Vorkommen in ändern, the##1funktioniert Ihr Code wie erwartet.

verwandte Informationen