Avoid page breaks in \lstlistings

Wrapping the lstlisting inside a minipage (of width \linewidth) boxes the content making it unbreakable and avoids breaking across the page boundary:

...
\begin{minipage}{\linewidth}
\begin{lstlisting}
static boolean abcde
(
abc_defg_hijk * const   lm
);
\end{lstlisting}
\end{minipage}
...

Depending on the location of usage, you may have to prepend the environment with \noindent to avoid any paragraph indentation.

A somewhat similar approach is followed if you load the float package and use

...
\begin{lstlisting}[float,floatplacement=H]
static boolean abcde
(
abc_defg_hijk * const   lm
);
\end{lstlisting}
...

More on the float placement H is discussed in How to influence the position of float environments like figure and table in LaTeX?


I'm using version 1.5 (2013) of the listings package. I use lstinputlisting to include the code from the file, and I just put float inside the options of the environment. It works fine.

For example, this goes in my preamble:

\lstdefinestyle{freefempp}{
  language=C++,
  basicstyle=\footnotesize\ttfamily,
  commentstyle=\itshape\color{violet},
  identifierstyle=\color{blue},
  morekeywords={ border, buildmesh, cos, dx, dy, fespace, fill, func,
    int2d, label, mesh, on, pi, plot, problem, sin, real, x, y},
  % float,
  frame=single,
  numbers=left
}

\lstset{style=freefempp}

And this goes in my document's body.

\lstinputlisting
  [caption=Solution to question 1, float, linerange={1-21}, firstnumber=1]
  {listings/ex1-1.edp}

However, the float option only works inside the lstinputlisting environment definition, not inside the style definition. Maybe this bug will be corrected in future versions.


I use a similar solution to the one proposed by werner. However I prefer to define the minipage with text instead of line width:

\begin{minipage}[c]{0.95\textwidth}
\begin{lstlisting}

\end{lstlisting}
\end{minipage}

"c" for centering and "0.95\textwidth" to make the listing a little bit smaller than the rest of the text.