Я пытаюсь создать новые команды для «расширенных разделов/подразделов» (похожие на те, что вы можете увидеть в учебнике, где «отмеченный звездочкой раздел» обозначает расширенную тему или раздел, который можно пропустить при первом чтении).
До сих пор я сколотил команды, которые помещают звездочку рядом с номером раздела/подраздела как в самом документе, так и в 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
ваш код будет работать так, как и ожидалось.