"고급 섹션/하위 섹션"에 대한 새 명령을 만들려고 합니다(교과서에서 볼 수 있는 것과 유사합니다. 여기서 "별표 섹션"은 고급 주제 또는 처음 읽을 때 건너뛸 수 있는 섹션을 나타냅니다.)
지금까지 문서 자체와 ToC 모두에서 섹션/하위 섹션 번호 옆에 별표를 배치하는 명령을 함께 엮었습니다. 그러나 다음과 같은 이상한 부작용이 있습니다.
"고급 섹션" 명령을 사용한 후 다음 하위 섹션에 하위 섹션 번호가 표시되지 않습니다.
"고급 하위 섹션" 명령을 사용한 후 다음 섹션에는 항상 "쓸모 없는" 하위 섹션 번호 .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
. 위의 코드를 작성할 수 있었으므로 이것이 왜 문제인지 알아낼 수 있을 것입니다. 네 가지 항목을 모두 변경하면 the##1
코드가 예상대로 작동합니다.