私は、「高度なセクション/サブセクション」用の新しいコマンドを作成しようとしています (教科書で見られる「星印の付いたセクション」が高度なトピックまたは最初に読むときにスキップできるセクションを示すのと同様です)。
これまで、ドキュメント自体と目次の両方でセクション/サブセクション番号の横に星印を配置するコマンドをまとめてきました。ただし、次のような奇妙な副作用があります。
「高度なセクション」コマンドを使用した後、次のサブセクションにサブセクション番号が表示されない
「高度なサブセクション」コマンドを使用した後、次のセクションには常に「役に立たない」サブセクション番号 .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
。 上記のコードを記述できたので、おそらくこれがなぜ問題なのかがわかるでしょう。 4 つの出現箇所すべてを に変更すると、the##1
コードは期待どおりに動作します。