“進階部分/小節”自訂指令會產生意外的編號行為

“進階部分/小節”自訂指令會產生意外的編號行為

我正在嘗試為“高級部分/小節”創建新命令(類似於您在教科書中可能看到的內容,其中“加星號的部分”表示高級主題或您可以在第一次閱讀時跳過的部分。

到目前為止,我已經拼湊了一些指令,將星號放在文件本身和目錄中的節/小節編號旁邊。然而,有一個奇怪的副作用:

  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您的程式碼將按預期工作。

相關內容