如何使用 patchcmd 在 \chapter 之前插入 \clearpage 以避免页面断裂

如何使用 patchcmd 在 \chapter 之前插入 \clearpage 以避免页面断裂

我希望我的文档在有新章节时不开始新的页面。我的代码如下:

\documentclass{scrbook}
\usepackage{etoolbox}

\patchcmd{\chapter}{\clearpage}{}{}
\begin{document}

\chapter{Preliminary}
first chapter

\chapter{Discussion}
second chapter

{\let \clearpage \relax\chapter{Advanced}}
final chapter
\end{document}

此代码将为第一章和第二章开始新的页面,但不为第三章开始新的页面。

为何我的 \patchcmd 不工作?

答案1

首先,该行有一个语法错误\patchcmd,因为缺少一对括号:

\patchcmd{<macro>}{<search>}{<replace>}{<success>}{<failure>}

在这种情况下,这没有任何后果,因为补丁失败了,所以\begin由于失败而传递了第五个参数,因此这被吸收了。

主要原因:宏的替换文本中\chapter没有“no” ,\clearpage

\scr@startchapter{chapter}

必须\scr@startchapter修补

% scrbook.cls, line 4030:
\newcommand*{\scr@startchapter}[1]{%
  \if@openright\cleardoublepage\else\clearpage\fi
  \scr@ifundefinedorrelax{#1pagestyle}{}{%
    \ifstr{#1pagestyle}{}{}{%
      \thispagestyle{\@nameuse{#1pagestyle}}%
    }%
  }%
  \global\@topnum\z@
  \@afterindentfalse
  \expandafter\SecDef\csname @#1\expandafter\endcsname\csname @s#1\endcsname
}

在尝试修补宏之前,请务必检查其含义。

您可能想要删除\cleardoublepage\clearpage,因此

\makeatletter
\patchcmd{\scr@startchapter}
  {\if@openright\cleardoublepage\else\clearpage\fi}% search
  {}% replace
  {}{\ddt}
\makeatother

我发现添加类似 的内容很方便\ddt,它将使用 警告失败Undefined control sequence \ddt。当我确定补丁成功时,我会将其删除。

答案2

您可以使用 KOMA-Script 类\RedeclareSectionCommand来设置style=section章节标题。因此无需修补任何内容。

\documentclass{scrbook}[2015/10/03]

\RedeclareSectionCommand[
  style=section,
  indent=0pt
]{chapter}

\begin{document}
\chapter{Preliminary}
first chapter
\chapter{Discussion}
second chapter
\chapter{Advanced}
final chapter
\end{document}

在此处输入图片描述

答案3

这是一个解决方案。需要修补\scr@startchapter

\documentclass{scrbook}
\usepackage{etoolbox}

\makeatletter
\if@openright
\patchcmd{\scr@startchapter}{\cleardoublepage}{}{}{}
\else
\patchcmd{\scr@startchapter}{\clearpage}{}{}{}
\fi
\makeatother
\begin{document}

\chapter{Preliminary}
first chapter

\chapter{Discussion}
second chapter

\end{document}

相关内容