我有一个文档,其中包含穿插着源代码块的文本。这是一个简单示例:
\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
表示破页的好地方。