我希望我的文件在有新章節時不要開始新頁面。我的程式碼如下:
\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}