filbreak 和 multicols

filbreak 和 multicols

如何\filbreak与 协同工作\multicols

请参阅以下示例:

\documentclass[]{article}
\usepackage{lipsum}
\usepackage{multicol}
\begin{document}
    \lipsum[2-4]
    \filbreak
    \lipsum[1] % fits on same page, so previous \filbreak has no effect
    \filbreak
    \lipsum[2-4] % does not fit on same page, so preview \filbreak introduces page break
    \filbreak
    \begin{multicols}{2} % does not fit on page, but previous \filbreak does not introduce pagebreak
        \lipsum
    \end{multicols}
\end{document}

在此处输入图片描述 注意:两栏文本在第 3 页继续。

为什么第三行不\filbreak引入分页符,以便两列文本在新页面上开始?如何更改?

答案1

\filbreak虽然在 LaTeX 中定义,但实际上并没有实现 LaTeX 概念,而是提供了一种简单的机制(最初在纯 TeX 中定义)来处理“简单”的样稿材料。这里的重点是“简单”。

基本上,它\filbreak所做的就是添加一个垂直填充(可拉伸的空白),然后跟着一个惩罚,说“这是一个很好的休息位置”(-200确切地说),然后再进行一个负拉伸。

因此,正常的换行符(惩罚值为0)将不如用空白填充页面那么有吸引力。因此,对于普通文本,输出例程将优先考虑\filbreak位置而不是其他换行符,因此它通常会从一个换行符跳转到\filbreak下一个换行符。但是,已经有一个节标题可能会消除这种情况,因为它会-300默认添加惩罚值,因此根据距离底部有多近以及页面上有多少其他空白空间,可能会采用它代替点\filbreak

现在multicol这完全崩溃了,因为该环境的作用是:

  • 它测量页面上剩余的空间
  • 如果有足够的内容,它将暂时保存所有现有页面,然后开始收集 2 列或更多列的材料。
  • 当它有足够的材料来填充之前计算的剩余空间(或者在那之前结束时)时,它会制作列,然后将保存的材料与这些列合并在一页中并输出该页面。
  • 该材料末尾的“奇怪”的惩罚和延伸序列现在不再发挥任何作用,因为延伸被抵消了,并且惩罚不再被考虑。

您在上面问,当它无法获取此页面上的所有材料时,为什么它不在环境之前中断?答案是 a) 由于上述行为从简单到复杂的 OR 处理的变化,它没有收到任何中断信号;b) 因为即使它会以某种方式收到这样的信号,它也需要先处理整个环境(或至少是其中的大部分)以确定是否合适,而在决策点它根本没有这些数据。

multicol因此,归根结底,这两种方法根本无法协同工作,如果没有足够的空间容纳整个环境,就不可能轻松地更改处理以从新页面开始。

相关内容