是否存在一个命令(我将其称为\newpageoptional
),其作用如下:
Text and code 1
\newpageoptional{
Text and code 2
}
Text and code 3
效果应该是:
- 如果“文本和代码 2”可以容纳在当前页面上,则无效果。
- 如果“文本和代码 2”无法在当前页面上容纳,则全部“文本和代码 2”将移动到下一页。
答案1
看到人们如此容易忘记做事的好方法,真是令人难过……说真的,这个问题(就像其他的我已经在 TeX.SX 上看到过)看起来像一个经典问题,在第 111 页进行了讨论和解决。TeXbook,其中\filbreak
介绍了命令。引用自:
纯 TeX 提供的用于页面排版的最有趣的宏称为
\filbreak
。它的意思是,大致意思是“在此分页并用空白填充底部,除非还有空间容纳后面跟着 的更多副本\filbreak
。”因此,如果你在每个段落的末尾都加上 \filbreak,并且段落不是太长,那么每个分页符都会出现在段落之间,TeX 会在每页上容纳尽可能多的段落。 的确切含义\filbreak
是
\vfil\penalty-200\vfilneg
根据附录 B;TeX 基元的这种简单组合产生了所需的结果……
这个\filbreak
宏在 LaTeX 中也有定义(在 中ltplain.dtx
),定义和 的附录 B 完全相同。TeXbook:
\def\filbreak{\par\vfil\penalty-200\vfilneg}
因此,您只需在文档中使用它,而无需加载任何包:
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{lipsum}
\begin{document}
\lipsum[1]\filbreak
\lipsum[2]\filbreak
\lipsum[3]\filbreak
\lipsum[4]\filbreak
\lipsum[5]\filbreak
\lipsum[6]\filbreak
\lipsum[7]\filbreak
\lipsum[8]\filbreak
\end{document}
这按预期工作;但有人可能会反对,因为它要求\filbreak
在每个段落末尾输入内容。当然,这可以自动完成:
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{lipsum}
\makeatletter
\def\filbreak{\@@par\vfil\penalty-200\vfilneg}
\makeatother
\begin{document}
\begingroup
\let\par\filbreak
\lipsum[1-32]
\endgroup
\end{document}
显然,需要重新定义\filbreak
为调用\@@par
,而不是\par
,以避免无限递归。
答案2
\documentclass[paper=A6]{scrartcl}
\usepackage{needspace}
\usepackage{blindtext}
\newsavebox\TBox
\newcommand\newpageoptional[1]{%
\savebox\TBox{\parbox{\linewidth}{#1}}% to get the height of the text
\needspace{\dimexpr\ht\TBox+\dp\TBox}% totalheight
#1}
\begin{document}
\blindtext
\newpageoptional{%
Text and code 2 with blindtext
\blindtext
}
Text and code 3
\end{document}
答案3
你可能想要,\raggedbottom
这意味着当一个页面中没有空间容纳某些内容时,会打开一个新页面,而无需冲洗内容对齐到底部。再加上一个{minipage}
环境(不会跨页)。只需放入\raggedbottom
序言并使用
\newcommand\newpageoptional[1]
{\par\noindent\xdef\svparindent{\the\parindent}%
\begin{minipage}[t]{\linewidth}\parindent\svparindent
#1\par\xdef\svprevdepth{\the\prevdepth}%
\end{minipage}\par\prevdepth\svprevdepth}
(有关所有这些额外命令的信息minipage
这里。