将文本与小页面放在一起;在上一页末尾留出空间

将文本与小页面放在一起;在上一页末尾留出空间

我有一个文档,其中包含穿插着源代码块的文本。这是一个简单示例:

\documentclass[twocolumn,twoside]{article}
\flushbottom

\begin{document}

... lots of text ...

To find the primes less than $n$, we use the
ancient Sieve of Eratosthenes:

\vspace*{\fill}
\begin{minipage}{\linewidth}\begin{verbatim}
(define (primes n)
  (let ((bits (make-vector (+ n 1) #t)))
    (let loop ((p 2) (ps (list)))
      (cond ((< n p) (reverse ps))
            ((vector-ref bits p)
              (do ((i p (+ i p))) ((< n i))
                (vector-set! bits i #f))
              (loop (+ p 1) (cons p ps)))
            (else (loop (+ p 1) ps))))))
\end{verbatim}\end{minipage}
\vspace{\baselineskip}

... more text ...

\end{document}

这样可以将源代码集中到一列中,防止其跨列或分页符拆分。但是,当它正常拆分时,会发生的情况是,前一列的最后一行文本(\vspace 之前)被放置在新列的顶部,源代码块之前,并且前一列被垂直拉伸,段落之间有额外的空间。

我想消除多余的垂直空间,只在前一列的末尾留一个空白;这很丑,但比拉伸的文本好看。如上所示,我尝试添加垂直填充,但没有成功。我怎样才能得到我想要的结果?

答案1

LaTeX 中有一个未记录的功能,它直接来自 Plain TeX:

\filbreak

这是

\par\vfil\penalty-200\vfilneg

这正是您需要的。首先,它发出\par以确保垂直模式;然后它发出\vfil和。可以在或处\penalty-200进行分页,但是\vfil\penalty-200不是\vfilneg(因为它之前有一个惩罚)。

无论如何,如果三项在一页中结束,则两个粘连将相互抵消(惩罚将不起作用)。相反,如果在惩罚处中断,则将\vfil填满页面,并且\vfilneg将消失,因为它位于新页面的顶部。

惩罚-200表示破页的好地方。

相关内容