user52366
user52366

Reputation: 1137

prevent page break within \item in latex document

I have a long document consisting of an enumeration. Each item consists of several lines, and possibly also includes other elements such as graphics and lists. The document type requires that each of these items appears on a single page, with no page break within item. Unused white space at the bottom of the page is acceptable.

Here is an example

\documentclass[a5paper,12pt]{article}
\usepackage{blindtext}

\begin{document}
\begin{enumerate}
  \item \blindtext
  \item \blindtext % don't break this apart
  \item very long text here 
\end{enumerate}
\end{document}

I know of solutions with the samepage environment, and also with minipage. The problem is that I can't wrap the individual \items into these environments, which I would need.

needspace works, but then I need to determine the vertical extent of each item manually (at least that is what I think).

Upvotes: 15

Views: 18741

Answers (3)

user52366
user52366

Reputation: 1137

What I did in the end is use the enumitem package and break up the enumeration into parts which are in minipages:

\documentclass[a5paper,12pt]{article}
\usepackage{blindtext}
\usepackage{enumitem}           % modified itemize

\begin{document}
\begin{minipage}{\linewidth}
\begin{enumerate}[series=task,start=1,leftmargin=*,resume]
  \item \blindtext
\end{enumerate}
\end{minipage}

\begin{minipage}{\linewidth}
  \begin{enumerate}[resume*=task]
     \item \blindtext
  \end{enumerate}
\end{minipage}

\end{document}

I'd prefer something less complicated, but at least it worked without manual pagination.

Upvotes: 2

Werner
Werner

Reputation: 15065

You can issue a \clearpage with each \item via the following automation:

enter image description here

\documentclass[a5paper,12pt]{article}

\usepackage{blindtext}

\let\oldenumerate\enumerate% Store \begin{enumerate} in \begin{oldenumerate}
\let\endoldenumerate\endenumerate% Store \end{enumerate} in \end{oldenumerate}
\renewenvironment{enumerate}
  {\let\olditem\item% Store \item in \olditem
   \renewcommand{\item}{\clearpage\olditem}% Update \item
   \oldenumerate}% \begin{enumerate}
  {\endoldenumerate}% \end{enumerate}

\begin{document}

\begin{enumerate}
  \item \blindtext
  \item \blindtext % don't break this apart
  \item very long text here 
\end{enumerate}

\end{document}

The above code updates the enumerate environment in a way that changes the \item code to be equivalent to \clearpage\item instead. This ensures that each \item will start on a new page, possibly leaving blank space at the bottom.

Upvotes: 1

Gunee
Gunee

Reputation: 451

This may help you: resizing the margins of the enumerate environment so that the text does not get broken out of place.

Here is one answer on how to do this kind of manipulations on itemize environments: https://tex.stackexchange.com/questions/170525/itemize-left-margin

Upvotes: 0

Related Questions