Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

how to avoid page breaks in LaTeX list items

5,654 views
Skip to first unread message

Erik Quaeghebeur

unread,
Dec 22, 2011, 5:12:24 PM12/22/11
to
Hi,


I'd like to have a LaTeX list for which no page breaks occur within any
item. Additionally, it would be nice to have something like a \vfill
after every item.

I'm already using the enumitem package (fiddling with midpenalty was not
successful), but compatible suggestions outside of it are also welcome.


Thanks,

Erik

Enrico Gregorio

unread,
Dec 22, 2011, 5:54:53 PM12/22/11
to
\documentclass[a4paper]{article}
\usepackage{enumitem,lipsum}

\begin{document}
\lipsum[2]
\begin{enumerate}[itemsep=1\itemsep plus 1fill]\interlinepenalty10000
\item \lipsum*[2]
\item \lipsum*[2]
\item \lipsum*[2]
\item \lipsum*[2]
\item \lipsum*[2]
\end{enumerate}
\lipsum[3]
\end{document}

Ciao
Enrico

Erik Quaeghebeur

unread,
Dec 23, 2011, 3:15:15 PM12/23/11
to
> Erik Quaeghebeur<use...@equaeghe.nospammail.net> wrote:
>
>> I'd like to have a LaTeX list for which no page breaks occur within any
>> item. Additionally, it would be nice to have something like a \vfill
>> after every item.

Op 22-12-11 23:54, Enrico Gregorio schreef:
>
> \documentclass[a4paper]{article}
> \usepackage{enumitem,lipsum}
>
> \begin{document}
> \lipsum[2]
> \begin{enumerate}[itemsep=1\itemsep plus 1fill]\interlinepenalty10000
> \item \lipsum*[2]
> \item \lipsum*[2]
> \item \lipsum*[2]
> \item \lipsum*[2]
> \item \lipsum*[2]
> \end{enumerate}
> \lipsum[3]
> \end{document}

Sadly enough (and yes, one may assume every item is smaller than a page):

\documentclass[a4paper]{article}
\usepackage{enumitem,lipsum}

\begin{document}
\lipsum[2]
\begin{enumerate}[itemsep=1\itemsep plus 1fill]\interlinepenalty10000
\item \lipsum*[2]
\item \lipsum*[2]
\item \lipsum*[2]
\begin{itemize}
\item \lipsum*[2]
\item \lipsum*[2]
\end{itemize}
\end{enumerate}
\end{document}

Enrico Gregorio

unread,
Dec 23, 2011, 4:09:05 PM12/23/11
to
I don't understand: you want that the "itemize" environment isn't
split between pages? Put it into a minipage:

\begin{enumerate}[itemsep=1\itemsep plus 1fill]\interlinepenalty10000
\item \lipsum*[2]
\item \lipsum*[2]
\item \lipsum*[2]\\*[\topsep]
\begin{minipage}{\linewidth}
\begin{itemize}
\item \lipsum*[2]
\item \lipsum*[2]
\end{itemize}
\end{minipage}
\end{enumerate}


Ciao
Enrico

Peter Flynn

unread,
Dec 23, 2011, 4:30:50 PM12/23/11
to
No, I think he said "no page breaks occur within any item".

///Peter

Enrico Gregorio

unread,
Dec 23, 2011, 4:48:54 PM12/23/11
to
Another solution:

\documentclass[a4paper]{article}
\usepackage{enumitem,lipsum}

\makeatletter
\def\adjustpenalty{\@beginparpenalty\@M \@itempenalty\@M}
\makeatother


\begin{document}
\lipsum[2]
\begin{enumerate}[itemsep=1\itemsep plus 1fill]\interlinepenalty10000
\item \lipsum*[2]
\item \lipsum*[2]
\item \lipsum*[2]
\begin{itemize}\adjustpenalty
\item \lipsum*[2]
\item \lipsum*[2]
\end{itemize}
\end{enumerate}
\end{document}

Ciao
Enrico

Erik Quaeghebeur

unread,
Dec 24, 2011, 4:50:00 AM12/24/11
to
>>>>> Erik Quaeghebeur<use...@equaeghe.nospammail.net> wrote:
>>>>>
>>>>>> I'd like to have a LaTeX list for which no page breaks occur within any
>>>>>> item. Additionally, it would be nice to have something like a \vfill
>>>>>> after every item.

>>> Erik Quaeghebeur<use...@equaeghe.nospammail.net> wrote:
>>>>
>>>> \documentclass[a4paper]{article}
>>>> \usepackage{enumitem,lipsum}
>>>>
>>>> \begin{document}
>>>> \lipsum[2]
>>>> \begin{enumerate}[itemsep=1\itemsep plus 1fill]\interlinepenalty10000
>>>> \item \lipsum*[2]
>>>> \item \lipsum*[2]
>>>> \item \lipsum*[2]
>>>> \begin{itemize}
>>>> \item \lipsum*[2]
>>>> \item \lipsum*[2]
>>>> \end{itemize}
>>>> \end{enumerate}
>>>> \end{document}

>> On 23/12/11 21:09, Enrico Gregorio wrote:
>>>
>>> I don't understand: you want that the "itemize" environment isn't
>>> split between pages?

Indeed, because it is contained in the first-level item (i.e., of the
enumerate). I should have been clearer.

> Peter Flynn<peter...@m.silmaril.ie> wrote:
>
>> No, I think he said "no page breaks occur within any item".

Well, Enrico was right, but you are too (after the 'no') ;-).

Op 23-12-11 22:48, Enrico Gregorio schreef:
>
> Another solution:
>
> \documentclass[a4paper]{article}
> \usepackage{enumitem,lipsum}
>
> \makeatletter
> \def\adjustpenalty{\@beginparpenalty\@M \@itempenalty\@M}
> \makeatother
>
>
> \begin{document}
> \lipsum[2]
> \begin{enumerate}[itemsep=1\itemsep plus 1fill]\interlinepenalty10000
> \item \lipsum*[2]
> \item \lipsum*[2]
> \item \lipsum*[2]
> \begin{itemize}\adjustpenalty
> \item \lipsum*[2]
> \item \lipsum*[2]
> \end{itemize}
> \end{enumerate}
> \end{document}

Thanks! This is very promising, but it still breaks after adding extra
material within an item. No assumptions may be made about what content
is in the list's items, apart from the fact that it fits on a page and
contains no page breaking commands. Moreover, I want to avoid having to
add code within an item.

\documentclass[a4paper]{article}
\usepackage{enumitem,lipsum}

\makeatletter
\def\adjustpenalty{\@beginparpenalty\@M \@itempenalty\@M}
\makeatother

\begin{document}
\lipsum[2]
\begin{enumerate}[itemsep=1\itemsep plus 1fill]\interlinepenalty10000
\item \lipsum*[2]
\item \lipsum*[2]
\item \lipsum*[2]
\begin{center}
\lipsum*[2]
\end{center}
\begin{itemize}\adjustpenalty
\item \lipsum*[2]
\end{itemize}
\end{enumerate}
\end{document}

I guess I'll have to investigate your minipage suggestion more closely
(thanks for that as well).


Erik

Enrico Gregorio

unread,
Dec 24, 2011, 5:51:54 AM12/24/11
to
The center environment adds a break point that you should suppress.
You might try adding \@beginparpenalty\@M (that is 10000) to the
outer environment.

Ciao
Enrico
0 new messages