Пользовательская команда «Расширенный раздел/подраздел» приводит к неожиданному поведению нумерации

Пользовательская команда «Расширенный раздел/подраздел» приводит к неожиданному поведению нумерации

Я пытаюсь создать новые команды для «расширенных разделов/подразделов» (похожие на те, что вы можете увидеть в учебнике, где «отмеченный звездочкой раздел» обозначает расширенную тему или раздел, который можно пропустить при первом чтении).

До сих пор я сколотил команды, которые помещают звездочку рядом с номером раздела/подраздела как в самом документе, так и в ToC. Однако есть странный побочный эффект, когда:

  1. после использования команды «расширенный раздел» в следующем подразделе не отображается номер подраздела

  2. после использования команды «расширенный подраздел» в следующих разделах всегда отображается «бесполезный» номер подраздела .0

Интересно, что записи ToC ведут себя именно так, как и ожидалось, без проблем с нумерацией. Так что же может быть причиной этого неожиданного поведения в самом документе?

Ниже я привел MWE, иллюстрирующий это поведение. (Многочисленные разделы/подразделы призваны проиллюстрировать различные варианты использования «обычных» и «расширенных» команд раздела/подраздела.)

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

Скриншот оглавления Скриншот подраздела без номера подраздела Скриншот раздела с бесполезным номером подраздела

решение1

Проблема в строке, где вы переопределили \@seccntformat. Ваш код выглядит так

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

обратите внимание, что вы ввели определение the#1вместо the##1, и аналогично для определения, которое восстанавливает исходное определение \@seccntformat. Поскольку вы смогли написать код выше, вы, вероятно, можете понять, почему это проблема. Если вы измените все четыре вхождения на , the##1ваш код будет работать так, как и ожидалось.

Связанный контент