Agregue espacio vertical solo si no hay salto de página

Agregue espacio vertical solo si no hay salto de página

Me gustaría definir un nuevo listingsentorno donde el listado tenga un \hruleantes y un después del listado mismo. Para hacer esto, he definido este entorno:

\lstnewenvironment{haskell}[1][]
    {
        \vspace{0.4cm}
        \mathligsoff
        \hrule
        \lstset{language=haskell, basicstyle=\small, #1}
    }{
        \hrule
        \mathligson
        \vspace{0.4cm}
}

El problema es que a veces, cuando un listado termina al final de una página, el cierre \hrulepasa a la página siguiente:

Imagen que muestra la regla adicional al inicio de la nueva página.

Como puede ver, la regla resaltada terminó al comienzo de la nueva página, lo cual es simplemente feo.

¿Cómo puedo evitar que se produzca un salto de página entre el listado y la regla al final? Ya intenté agregar un \nopagebreakantes \hrulepero no resolvió el problema.

Respuesta1

Como se indicaen los comentarios de Jubobsyo usaríatcolorboxpara esto. El siguiente código imita el diseño descrito en la pregunta, pero tcolorboxes posible utilizar diseños mucho más sofisticados.

\documentclass{article}
\usepackage{tcolorbox,listings}
\tcbuselibrary{listings,xparse}
\tcbset{listing engine=listings}

\NewTCBListing{haskell}{O{}}{%
  % colors:
  colback = white , colframe = black , coltitle = black ,
  % rules:
  boxrule = 0pt , toprule = 1pt , bottomrule = 1pt , arc = 0pt ,
  % spacing:
  boxsep = 0pt , left = 0pt , right = 0pt ,
  % listing options:
  listing options = {
    language = haskell ,
    basicstyle = \small ,
    gobble = 2 ,%
    #1%
  } ,
  listing only
}

\begin{document}

\begin{haskell}
  sums = zipWith (\x y -> x + y) numbers1 numbers2
  products = zipWith (\x y -> x * y) numbers1 numbers2
  pairs = zipWith (\x y -> (x, y)) numbers1 numbers2
\end{haskell}

\end{document}

A menos que especifique la breakableopción tcolorbox(necesita la breakablebiblioteca), el listado completo permanecerá en una página.

ingrese la descripción de la imagen aquí

información relacionada