Needspace
Needspace
v1.3e 2025/03/13
1 Documentation
This packages two commands, \needspace and \Needspace, for reserving space
to keep a certain amount of material from being split over a page break. If there
is not enough space, a \newpage is automatically inserted.
The \needspace⟨length⟩ macro reserves an approximate amount of space
⟨length⟩ for the material following to be kept on the same page. The accuracy
of its calculations depend on what penalties are in effect, but is efficient and
normally adequate. A short page will be ragged bottom even if \flushbottom is
in effect.
\Needspace{⟨length⟩} is less efficient but reserves the requested space ⟨length⟩
exactly. It should only be used between paragraphs. Short pages that are pro-
duced by \Needspace will be ragged bottom but short pages produced by
\Needspace*{⟨length⟩} will be flush bottom if \flushbottom is in effect.
2 Examples
Here, we request that we need next five lines on a single page/column:
\needspace{5\baselineskip}
The next five lines ...
1
In this case, the space is reserved more accurately:
\Needspace*{4\baselineskip}
The major principles are:
\begin{itemize}
\item ...
1 http://www.latex-project.org/lppl.txt
2
3 Implementation
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{needspace}[2025/03/13 v1.3e reserve vertical space]
\newcommand{\needspace}[1]{%
\ifhmode \ifinner \@LRmoderr \else \par \fi \fi
\begingroup
\@tempskipb \lastskip
\vskip -\@tempskipb
\setlength\dimen@{#1}%
\advance\dimen@\@tempskipb
\vskip\z@\@plus\dimen@
\penalty -100
\vskip\z@\@plus -\dimen@
\vskip\dimen@
\penalty 9999%
\vskip -\dimen@
\vskip\@tempskipb % reinsert \lastskip
\endgroup
}
\newcommand\Needspace{%
\ifhmode \ifinner \@LRmoderr \else \par \fi \fi
\@tempskipb \lastskip
\vskip -\@tempskipb
\penalty-100
\begingroup
\@ifstar{\@sneedsp@}{\@needsp@}%
}
\newcommand\@sneedsp@[1]{%
\setlength\dimen@{#1}%
\advance\dimen@\@tempskipb
\dimen@ii\pagegoal \advance\dimen@ii-\pagetotal
\ifdim \dimen@>\dimen@ii
\break
\else
\vskip\@tempskipb % reinsert \lastskip
\fi
\endgroup
}
3
\newcommand\@needsp@[1]{%
\setlength\dimen@{#1}%
\advance\dimen@\@tempskipb
\dimen@ii\pagegoal \advance\dimen@ii-\pagetotal
\ifdim \dimen@>\dimen@ii
\ifdim \dimen@ii>\z@
\vfil
\fi
\break
\else
\vskip\@tempskipb % reinsert \lastskip
\fi
\endgroup
}