如何使用 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巨集的替換文字中沒有\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

這是一個解決方案。需要打1個補丁\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}

相關內容