![“高级章节/小节”自定义命令产生意外的编号行为](https://linux22.com/image/476064/%E2%80%9C%E9%AB%98%E7%BA%A7%E7%AB%A0%E8%8A%82%2F%E5%B0%8F%E8%8A%82%E2%80%9D%E8%87%AA%E5%AE%9A%E4%B9%89%E5%91%BD%E4%BB%A4%E4%BA%A7%E7%94%9F%E6%84%8F%E5%A4%96%E7%9A%84%E7%BC%96%E5%8F%B7%E8%A1%8C%E4%B8%BA.png)
我正在尝试为“高级章节/小节”创建新的命令(类似于您在教科书中看到的,其中“星号章节”表示高级主题或您可以在第一次阅读时跳过的章节。)
到目前为止,我已经拼凑了一些命令,将星号放在文档本身和目录中的章节/小节编号旁边。然而,有一个奇怪的副作用:
使用“高级部分”命令后,以下小节不显示小节编号
使用“高级子节”命令后,以下部分始终显示“无用”的子节编号 .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
您的代码将按预期运行。