我希望我的文档在有新章节时不开始新的页面。我的代码如下:
\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}