Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I have a document that includes text with block of source code interspersed. Here's a minimal example:

\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}

This keeps the source code together on a single column, preventing it from splitting across a column or page break. But what happens when it would normally split is the last line of text in the previous column (before the \vspace) is placed at the top of the new column, before the block of source code, and the previous column is stretched vertically, with extra space between paragraphs.

I want to eliminate that extra vertical space and just leave an empty space at the end of the previous column; it's ugly, but less ugly than the stretched text. As you can see above, I tried to add vertical fill, but that doesn't work. How can I get what I want?

share|improve this question
1  
Try changing \vspace*{\fill} into \filbreak –  egreg Sep 16 '12 at 15:15
    
That works perfectly. But it's not in Lamport's book, which is why I couldn't find it. Thank you. –  user448810 Sep 16 '12 at 15:23

1 Answer 1

up vote 5 down vote accepted

There's an undocumented feature in LaTeX which directly comes from Plain TeX:

\filbreak

This is an abbreviation for

\par\vfil\penalty-200\vfilneg

which does exactly what you need. First it issues \par to ensure vertical mode; then it issues \vfil and \penalty-200. A page break can be taken either at \vfil or at \penalty-200, but not at \vfilneg (because it's preceded by a penalty).

In any case, if the three items end together in a page, the two glues will cancel each other (and the penalty will do nothing). If instead a break is taken at the penalty, the \vfil will fill the page and the \vfilneg will disappear because it's at the top of a new page.

The -200 penalty denotes a good place where breaking a page.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.