我正在嘗試為“高級部分/小節”創建新命令(類似於您在教科書中可能看到的內容,其中“加星號的部分”表示高級主題或您可以在第一次閱讀時跳過的部分。
到目前為止,我已經拼湊了一些指令,將星號放在文件本身和目錄中的節/小節編號旁邊。然而,有一個奇怪的副作用:
使用「進階節」指令後,以下小節不顯示小節編號
使用「進階小節」指令後,以下部分始終顯示「無用」小節編號 .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
您的程式碼將按預期工作。