可选的 newpage 命令

可选的 newpage 命令

是否存在一个命令(我将其称为\newpageoptional),其作用如下:

    Text and code 1

    \newpageoptional{
    Text and code 2
    }

    Text and code 3

效果应该是:

  1. 如果“文本和代码 2”可以容纳在当前页面上,则无效果。
  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 这里

相关内容