使用 \clearpage 重新定义 \section 和 titlesec 会导致目录中出现多余的条目

使用 \clearpage 重新定义 \section 和 titlesec 会导致目录中出现多余的条目

以下 MWE 显示,每当我\clearpage在 的重新定义中发出 时\section,它都会在目录中生成一个附加条目。为什么会发生这种情况?我应该如何修复它?我想保留explicit的键titlesec,并且我仍然希望能够在 的重新定义期间进行分页\section

\documentclass{extbook}
\makeatletter
\RequirePackage[explicit]{titlesec}%
\titleformat{name=\section}{}{}{\z@}
  {\clearpage}
  [\clearpage]
\makeatother
\begin{document}
\tableofcontents
\section{First section}
\subsection{This is a section}
\subsection{This is another section}
\section{A section}
\subsection{Another section}
\subsection{One more section}
\end{document}

\documentclass{extbook}
\usepackage[explicit]{titlesec}%
\usepackage{changepage}
\makeatletter
\titleformat{name=\section}
  {}
  {}
  {\z@}
  {%
   \ifnum\c@page=1
     \thispagestyle{empty}%
     \clearpage
   \else
     \clearpage
     \checkoddpage
     \ifoddpage
       \null\clearpage
   \fi\fi
   \thispagestyle{empty}%
     {\Huge%
      #1}%
   \vskip10pt
   {\normalsize\itshape Some box}%
  }
  [\clearpage
  \null
  \vskip20pt
  ]
\titlespacing*{\section}{\z@}{\z@}{\z@}
\makeatother
\begin{document}
\tableofcontents
\section{Magnetism}
\subsection{This is a section}
\subsection{This is another section}
\section{The Hubbard Model}
\subsection{Another section}
\subsection{One more section}
\end{document}

答案1

要在节前添加分页符,您需要定义并将\sectionbreak的类设置为。然后从中删除命令。\sectiontop\clearpage\titleformat

\documentclass{extbook}
\makeatletter
\RequirePackage[explicit]{titlesec}%
\titleclass{\section}{top}
\newcommand{\sectionbreak}{\clearpage}
\titleformat{name=\section}{}{}{\z@}
  {#1}
  []
\makeatother
\begin{document}
\tableofcontents
\section{First section}
\subsection{This is a section}
\subsection{This is another section}
\section{A section}
\subsection{Another section}
\subsection{One more section}
\end{document}

但正如您所注意到的,这不允许您\clearpage在节标题后使用。我不知道为什么会出现这种情况(也许是 中的一个错误titlesec),但肯定有一个解决方法,即重新定义,\section以便在其后发出分页符。

\documentclass{extbook}
\makeatletter
\usepackage[explicit]{titlesec}%
\newcommand{\sectionbreak}{%
\ifnum\c@page=1
     \thispagestyle{empty}%
     \clearpage
   \else
     \clearpage
     \checkoddpage
     \ifoddpage
       \null\clearpage
   \fi\fi
}
\titleclass{\section}{top}
\usepackage{changepage}
\titleformat{name=\section}
  {}
  {}
  {\z@}
  {%
   \thispagestyle{empty}%
     {\Huge%
      #1}%
   \vskip10pt
   {\normalsize\itshape Some box}%
  }
  []
\titlespacing*{\section}{\z@}{\z@}{\z@}
\makeatother
\usepackage{letltxmacro}
\LetLtxMacro{\oldsection}{\section}
\renewcommand{\section}[2][]{%
   \if\relax\detokenize{#1}\relax
     \oldsection{#2}
   \else\oldsection[#1]{#2}
   \fi
   \vspace{\fill}\par\pagebreak\null\vskip20pt}
\begin{document}
\tableofcontents
\section[This is TOC]{Magnetism}
\subsection{This is a section}
\subsection{This is another section}
\section{The Hubbard Model}
\subsection{Another section}
\subsection{One more section}
\end{document}

答案2

处罚、标记等必须与分页符正确同步。这就是\sectionbreak存在的原因(以便在正确的位置发出它),以及page类,在标题前后有分页符:

\documentclass{extbook}
\RequirePackage[explicit]{titlesec}%
\titleclass{\section}{page}
\titleformat{name=\section}{}{}{0pt}{#1}

手册必须明确指出“之前”和“之后”不是惩罚的适当位置。但是 中有一个缺陷titlesec,但是 - 没有直接的方法来设置分页符后的空间(在新页面的顶部)或是否必须有一个空白页(它使用类设置openrightopenany)。

相关内容