我的文档中有许多小节。每个小节都很短(每个小节由五到十行组成)。我希望每页有多个小节,但不希望小节分成两页。如果小节无法放在一页的剩余部分,我希望将其放在下一页。
\newpage
是否存在当页面某部分不适合时可自动执行的页面布局?
答案1
我无法想象这种没有从新页面开始的章节的样式。所以这里是:我们\clearpage
在所有\section
命令之前(第一个命令之后)和\filbreak
每个命令之前添加\subsection
。
\documentclass{article}
\usepackage{etoolbox}
\preto{\section}{\clearpageafterfirst}
\preto{\subsection}{\filbreak}
\newcommand{\clearpageafterfirst}{%
\gdef\clearpageafterfirst{\clearpage}%
}
\usepackage{lipsum} % to generate dummy text for the MWE
\begin{document}
\title{Title}
\author{author}
\maketitle
\section{A section}
\subsection{A subsection}\lipsum[1-2]
\subsection{A subsection}\lipsum[2]
\subsection{A subsection}\lipsum[3-4]
\subsection{A subsection}\lipsum[4]
\subsection{A subsection}\lipsum[5]
\subsection{A subsection}\lipsum[6]
\subsection{A subsection}\lipsum[7]
\subsection{A subsection}\lipsum[8]
\subsection{A subsection}\lipsum[9]
\subsection{A subsection}\lipsum[10]
\subsection{A subsection}\lipsum[11]
\section{B section}
\subsection{A subsection}\lipsum[12]
\subsection{A subsection}\lipsum[13]
\subsection{A subsection}\lipsum[14]
\subsection{A subsection}\lipsum[15]
\subsection{A subsection}\lipsum[16]
\subsection{A subsection}\lipsum[17]
\subsection{A subsection}\lipsum[18]
\subsection{A subsection}\lipsum[19]
\subsection{A long subsection}\lipsum[20-25]
\subsection{A subsection}\lipsum[26]
\end{document}
如果某个小节长度超过一页,它将毫无问题地转到下一个小节。
如果您不希望这些部分从新页面开始,则情况会稍微复杂一些:
\documentclass{article}
\usepackage{etoolbox}
\newtoggle{aftersection}
\preto{\section}{\filbreak\global\toggletrue{aftersection}}
\preto{\subsection}{\iftoggle{aftersection}{\global\togglefalse{aftersection}}{\filbreak}}
\newcommand{\clearpageafterfirst}{%
\gdef\clearpageafterfirst{\clearpage}%
}
\usepackage{lipsum} % to generate dummy text for the MWE
\begin{document}
\title{Title}
\author{author}
\maketitle
\section{A section}
\subsection{A subsection}\lipsum[1-2]
\subsection{A subsection}\lipsum[2]
\subsection{A subsection}\lipsum[3-4]
\subsection{A subsection}\lipsum[4]
\subsection{A subsection}\lipsum[5]
\subsection{A subsection}\lipsum[6]
\subsection{A subsection}\lipsum[7]
\subsection{A subsection}\lipsum[8]
\subsection{A subsection}\lipsum[9]
\section{B section}
\subsection{A subsection}\lipsum[12]
\subsection{A subsection}\lipsum[13]
\subsection{A subsection}\lipsum[14]
\subsection{A subsection}\lipsum[15]
\subsection{A subsection}\lipsum[16]
\subsection{A subsection}\lipsum[17]
\subsection{A subsection}\lipsum[18]
\subsection{A subsection}\lipsum[19]
\subsection{A long subsection}\lipsum[20-25]
\subsection{A subsection}\lipsum[26]
\end{document}
您可以享受\filbreak
在 TeXbook 中阅读的乐趣。另请参阅禁止在 titletoc 的 titlecontents* 块中使用分页符
答案2
一种方法是使用包在子节上方固定一个可变间距,titlesec
然后让 LaTeX 来做最好的处理。下面的 MWE 是从到,2.8ex
因此9ex
LaTeX 在可能的情况下使用间距3ex
,否则会或多或少地放大,甚至缩小到几乎不可察觉的程度,以获得最佳效果。
您还可以将其与可变段落跳过相结合以获得更好的结果(如 MWE 中所示)。
请注意,如果应用较大的间距范围,几乎可以完全避免段落/小节拆分,但我认为对于超过 3 或 4 行的情况,这不是一个好主意。您应该在最终文本中使用这些值来找到合理的范围,并在某些情况下允许段落分隔(即检查页面中几行之后没有难看的分页符)。另请参阅如何防止出现孤儿线?。
无论如何,请记住,您始终可以使用minipage
环境或\parblock
命令(手动进行一些最终调整或在宏中进行一般用途,如在 MWE 中)强制使用大型不可破坏的块。
\documentclass{article}
\usepackage{lipsum} % to generate dummy text for the MWE
\usepackage{titlesec}
\titlespacing*{\subsection}{0em}{3ex plus 9ex minus .2ex}{1ex plus .0ex minus .0ex}
\setlength{\parskip}{1ex plus 3ex minus 0ex}
\newcommand\monoliticsubsec[2]{
\noindent
\begin{minipage}{\textwidth}
\subsection{#1}#2
\end{minipage}}
\begin{document}
\section{A section}
\subsection{A subsection}\lipsum[1-2]
\subsection{A subsection}\lipsum[2]
\subsection{A subsection}\lipsum[3-4]
\subsection{A subsection}\lipsum[4]
\subsection{A subsection}\lipsum[5]
\monoliticsubsec{A unbreakable section}{\lipsum[1-3]}
\subsection{A subsection}\lipsum[6]
\subsection{A subsection}\lipsum[7]
\subsection{A subsection}\lipsum[8]
\subsection{A subsection}\lipsum[9]
\subsection{A subsection}\lipsum[10]
\subsection{A subsection}\lipsum[11]
\subsection{A subsection}\lipsum[12]
\subsection{A subsection}\lipsum[13]
\subsection{A subsection}\lipsum[14]
\subsection{A subsection}\lipsum[15]
\subsection{A subsection}\lipsum[16]
\subsection{A subsection}\lipsum[17]
\subsection{A subsection}\lipsum[18]
\subsection{A subsection}\lipsum[19]
\subsection{A long subsection}\lipsum[20-25]
\end{document}
答案3
如果你有一个相当一致的(最大)子节长度,那么一个基本的方法是使用needspace
包裹12\baselineskip
如果页面上可用的内容较少(比如说),则插入分页符。
\documentclass{article}
\usepackage{needspace}% http://ctan.org/pkg/needspace
\let\oldsubsection\subsection
\renewcommand{\subsection}{\needspace{12\baselineskip}\oldsubsection}
\newcommand{\lorem}{Lorem ipsum dolor sit amet, consectetur adipiscing elit.}
\newcommand{\dummytext}{\lorem{} \lorem{} \lorem{} \lorem{} \lorem}
\begin{document}
\section{A section}
\subsection{A subsection}\dummytext
\subsection{A subsection}\dummytext\dummytext
\subsection{A subsection}\dummytext\dummytext\dummytext
\subsection{A subsection}\dummytext\dummytext\dummytext
\subsection{A subsection}\dummytext\dummytext
\section{Another section}\dummytext
\subsection{A subsection}\dummytext
\subsection{A subsection}\dummytext
\subsection{A subsection}\dummytext\dummytext
\subsection{A subsection}\dummytext
\subsection{A subsection}\dummytext
\subsection{A subsection}\dummytext
\subsection{A subsection}\dummytext\dummytext\dummytext\dummytext
\subsection{A subsection}\dummytext\dummytext
\subsection{A subsection}\dummytext\dummytext\dummytext
\subsection{A subsection}\dummytext
\subsection{A subsection}\dummytext\dummytext
\subsection{A subsection}\dummytext
\subsection{A subsection}\dummytext\dummytext\dummytext\dummytext
\subsection{A subsection}\dummytext\dummytext\dummytext\dummytext
\subsection{A subsection}\dummytext\dummytext\dummytext\dummytext
\end{document}
12\baselineskip
是大约10 行常规段落文本加一个\subsection
标题。