You can use \filbreak
(The TeXbook, page 111).
The most interesting macro that plain TeX provides for page make-up is called \filbreak
. It means, roughly, “Break the page here and fill the bottom with blank space, unless there is room for more copy that is itself followed by \filbreak
.” Thus if you put \filbreak
at the end of every paragraph, and if your paragraphs aren’t too long, every page break will occur between paragraphs, and TeX will fit as many
paragraphs as possible on each page. The precise meaning of \filbreak
is
\vfil\penalty-200\vfilneg
according to Appendix B; and this simple combination of TeX’s primitives produces the desired result: If a break is taken at the \penalty-200
, the preceding \vfil
will fill the bottom of the page with blank space, and the \vfilneg
will be discarded after the break; but if no break is taken at the penalty, the \vfil
and \vfilneg
will cancel each other and have no effect.
Here's an implementation.
\documentclass{article}
\usepackage{lipsum} % for mock text
\newenvironment{abs}[2]
{% #1 = title, #2 = author
\par\vspace{\bigskipamount}\filbreak
{\centering\textbf{#1}\par\vspace{1ex}\textit{#2}\par\vspace{1ex}}%
}
{\par}
\begin{document}
\begin{abs}{A title}{John Doe}
\lipsum*[1][1-3]
\end{abs}
\begin{abs}{A title}{John Doe}
\lipsum*[2][1-3]
\end{abs}
\begin{abs}{A title}{John Doe}
\lipsum*[3]
\end{abs}
\begin{abs}{A title}{John Doe}
\lipsum*[3]
\end{abs}
\begin{abs}{A title}{John Doe}
\lipsum*[1][1-3]
\end{abs}
\begin{abs}{A title}{John Doe}
\lipsum*[2][1-3]
\end{abs}
\begin{abs}{A title}{John Doe}
\lipsum*[3]
\end{abs}
\begin{abs}{A title}{John Doe}
\lipsum*[3-5]
\end{abs}
\end{document}
minipages
.