“高级章节/小节”自定义命令产生意外的编号行为

“高级章节/小节”自定义命令产生意外的编号行为

我正在尝试为“高级章节/小节”创建新的命令(类似于您在教科书中看到的,其中“星号章节”表示高级主题或您可以在第一次阅读时跳过的章节。)

到目前为止,我已经拼凑了一些命令,将星号放在文档本身和目录中的章节/小节编号旁边。然而,有一个奇怪的副作用:

  1. 使用“高级部分”命令后,以下小节不显示小节编号

  2. 使用“高级子节”命令后,以下部分始终显示“无用”的子节编号 .0

有趣的是,目录条目的行为完全符合预期,没有编号问题。那么,是什么原因导致了文档本身出现这种意外行为呢?

我在下面附上了一个 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您的代码将按预期运行。

相关内容