# How to prevent page breaks in lists? (“Exam” class)

I'm using the exam class to prepare a test.

Unfortunately, the package allows page breaks inside the solution list of a question. Considering this toy example:

\question Example of question. Choose a solution:
\begin{checkboxes}
\choice A
\choice B
\choice C
\CorrectChoice D
\end{checkboxes}


It could be that a pagebreak happens between \choice B and \choice C. How could I prevent that?

## Update

The solution proposed by Mico works unless we want to print the solutions to the test AND the last answer of a question is a \CorrectChoice.

Here's a MWE that reproduces the problem:

\documentclass[answers]{exam}
\usepackage[utf8]{inputenc}
\usepackage[a4paper]{geometry}
\usepackage{etoolbox}
\AtBeginEnvironment{checkboxes}{\par\medskip%
\begin{minipage}{\textwidth}}
\AtEndEnvironment{checkboxes}{%
\end{minipage}}

\CorrectChoiceEmphasis{}

\begin{document}

\begin{questions}

\question Random text for question 1
\begin{checkboxes}
\end{checkboxes}

\question Random text for question 2
\end{checkboxes}

\question Random text for question 3
\end{checkboxes}

\question Random text for question 4
\end{checkboxes}

\question Random text for question 5
\end{checkboxes}

\end{questions}

\end{document}


I've solved it by following the 2nd suggestion given here, that is, surround what you don't want to be broken by \parbox. (For the records, using \samepage didn't work.)

-
Welcome to TeX.SE. As opposed to providing code snippets, it is always best to compose a MWE that illustrates the problem including the \documentclass so that those trying to help don't have to recreate it. –  Peter Grill Oct 22 '11 at 22:38
Will remember for the next time. Thanks for the heads up! –  Jir Oct 23 '11 at 17:53

I suggest you modify the checkboxes environment to place them in a LaTeX minipage automatically, as is done in the following MWE. Note that the amount of vertical spacing introduced by the \medskip command can be changed, e.g., to \smallskip or \bigskip, or whatever amount you prefer.

Addendum, posted 10/25/2011: The OP has noted that my originally-provided answer causes a problem if the list of choices ends with a \CorrectChoice option. The answer below is updated to incorporate this possibility; the solution consists of adding the line

\if@correctchoice \endgroup \fi


to the code in \AtEndEnvironment{...}.

The full MWE is:

\documentclass[answers]{exam}
\usepackage{etoolbox}
\AtBeginEnvironment{checkboxes}{%
\par\medskip\begin{minipage}{\linewidth}}
\makeatletter
\AtEndEnvironment{checkboxes}{%
\if@correctchoice \endgroup \fi%
\end{minipage}}
\makeatother

\begin{document}
\begin{questions}

\question Random text for question 1.

Choose a solution:
\begin{checkboxes}
\choice A
\choice B
\choice C
\CorrectChoice D
\end{checkboxes}
\end{questions}
\end{document}


Observe that this solution implements Werner's suggestion to use the commands \AtBeginEnvironment and \AtEndEnvironment commands provided by the etoolbox package.

-
I think it is much cleaner to patch it using etoolbox - using something like \AtBeginEnvironment/\AtEndEnvironment rather than redefining the entire environment in virtually the same way. Have you tried that? –  Werner Oct 23 '11 at 1:07
Thanks, @Werner, for this suggestion. I've changed my answer. –  Mico Oct 23 '11 at 12:02
I removed the etoolbox tag from the question again. Tags should be about the question, not about the answers. As long etoolbox is not requested or mentioned by the question the tag should not be added. –  Martin Scharrer Oct 23 '11 at 16:58
Works like a charm. Thanks! –  Jir Oct 23 '11 at 17:54
Well... there are some problems when there is a \CorrectChoice as last choice and I want to print the solution sheet. It says ! Extra }, or forgotten \endgroup. \endminipage ...pagefalse \color@endgroup \egroup \expandafter \@iiiparbox \... l.60 \end{checkboxes} But I cannot see how to modify the environment to prevent that. –  Jir Oct 23 '11 at 19:09

If you wrap checkboxes in a minipage, that will stop pagebreaks

\begin{minipage}{\linewidth}
\begin{checkboxes}
\choice A
\choice B
\choice C
\CorrectChoice D
\end{checkboxes}
\end{minipage}


If you would like to allow pagebreaks between some choices, but not others, you might use the needspace package, which would allow code such as

\begin{checkboxes}
\choice A
\needspace{2\baselineskip}
\choice B
\choice C
\CorrectChoice D
\end{checkboxes}


This particular example would allow a break after choice A, but not between choice B and choice C

-
It works, thanks! I voted for the other option as it saves me from modifying all environments. –  Jir Oct 23 '11 at 17:55