我制作了一个切换开关,用于切换 KOMA-Script 中各章节的行为,以便将它们放在同一页上(有点像章节)。我希望标题和章节之间有一致的分隔,但似乎有所不同。我使用 来patchcmd
截取clearpage
部分\scr@startchapter
并注入切换开关,并使用 vspace 控制章节之间的分隔。对于从新页面开始的章节,我以为这\gdef\chapterheadstartvskip{\vspace*{19pt}}
可以解决问题,但有时似乎不起作用。我注意到未应用间距的章节,标题是空白的——我认为这是因为前一章仍处于“活动”状态。
下面的 MWE。
\documentclass[letterpaper,twoside=false]{scrbook}
\usepackage{blindtext}
\usepackage[enable]{pagegrid}
\usepackage[headsepline]{scrlayer-scrpage}
\RedeclareSectionCommand[beforeskip=20pt]{chapter}
\def\chapterpagestyle{scrheadings}
\usepackage{xpatch}
\usepackage{etoolbox}
\newtoggle{ChapOnSamePage}
\gdef\chapterheadstartvskip{\vspace*{19pt}}
\makeatletter
\patchcmd{\scr@startchapter}{\if@openright\cleardoublepage\else\clearpage\fi}{%
\iftoggle{ChapOnSamePage}{\vspace{2em}}{\if@openright\cleardoublepage\else\clearpage\fi}%
}{}{}
\makeatother
\begin{document}
\chapter{Space I want when chap starts new page}
Hi
\blindtext
\chapter{}
Hi
\toggletrue{ChapOnSamePage}
\chapter{Chaps on same page here and below}
Hi
\chapter{}
Hi
\chapter{}
Hi
\chapter{too close here}
\blindtext
\chapter{}
Hi
\chapter{}
Hi
\chapter{too close here too}
Hi
\chapter{}
Hi
\chapter{}
Hi
\chapter{}
Hi
\pagebreak
\chapter{pagebreak before me -- looks good}
Hi
\togglefalse{ChapOnSamePage}
\chapter{Chaps back on new page}
Hi
\chapter{}
Hi
\end{document}
答案1
KOMA-Script 的章节样式chapter
设计为从新页面开始。因此没有任何机制可以防止在\chapterheadstartvskip
章节标题和章节之间出现分页符。因此,在您的情况下,修补样式后,自动分页符有时会在垂直距离之前发生,但有时会在垂直距离之后发生。
例如,你可以使用包来阻止这种情况needspace
当您接近页面末尾时,强制分页:
\documentclass[letterpaper,twoside=false]{scrbook}
\usepackage{blindtext}
\usepackage[enable]{pagegrid}
\usepackage[headsepline]{scrlayer-scrpage}
\RedeclareSectionCommand[beforeskip=20pt]{chapter}
\def\chapterpagestyle{scrheadings}
\usepackage{xpatch}
\usepackage{etoolbox}
\newtoggle{ChapOnSamePage}
\usepackage{needspace}
\makeatletter
\patchcmd{\scr@startchapter}{\if@openright\cleardoublepage\else\clearpage\fi}{%
\iftoggle{ChapOnSamePage}{\needspace{4em}\vspace{2em}}{\if@openright\cleardoublepage\else\clearpage\fi}%
}{}{}
\makeatother
\begin{document}
\chapter{Space I want when chap starts new page}
Hi
\blindtext
\chapter{}
Hi
\toggletrue{ChapOnSamePage}
\chapter{Chaps on same page here and below}
Hi
\chapter{}
Hi
\chapter{}
Hi
\chapter{too close here}
\blindtext
\chapter{}
Hi
\chapter{}
Hi
\chapter{too close here too}
Hi
\chapter{}
Hi
\chapter{}
Hi
\chapter{}
Hi
\pagebreak
\chapter{pagebreak before me -- looks good}
Hi
\togglefalse{ChapOnSamePage}
\chapter{Chaps back on new page}
Hi
\chapter{}
Hi
\end{document}
但是,我不喜欢 行为不一致的想法\chapter
。通常,章节应该是章节,所有章节的行为都应该相同。如果某些章节不应该是章节,那么您应该使用并可能为这些章节定义另一个章节命令,恕我直言。
还要注意:因为这些补丁总是邪恶的,KOMA-Script 作者提出了另一种防止章节分页的想法。