"고급 섹션/하위 섹션" 사용자 정의 명령으로 인해 예기치 않은 번호 매기기 동작이 발생함

"고급 섹션/하위 섹션" 사용자 정의 명령으로 인해 예기치 않은 번호 매기기 동작이 발생함

"고급 섹션/하위 섹션"에 대한 새 명령을 만들려고 합니다(교과서에서 볼 수 있는 것과 유사합니다. 여기서 "별표 섹션"은 고급 주제 또는 처음 읽을 때 건너뛸 수 있는 섹션을 나타냅니다.)

지금까지 문서 자체와 ToC 모두에서 섹션/하위 섹션 번호 옆에 별표를 배치하는 명령을 함께 엮었습니다. 그러나 다음과 같은 이상한 부작용이 있습니다.

  1. "고급 섹션" 명령을 사용한 후 다음 하위 섹션에 하위 섹션 번호가 표시되지 않습니다.

  2. "고급 하위 섹션" 명령을 사용한 후 다음 섹션에는 항상 "쓸모 없는" 하위 섹션 번호 .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코드가 예상대로 작동합니다.

관련 정보