Adicione espaço vertical somente se não houver quebra de página

Adicione espaço vertical somente se não houver quebra de página

Gostaria de definir um novo listingsambiente onde a listagem tenha um \hruleantes e um depois da própria listagem. Para fazer isso, defini este ambiente:

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

O problema é que às vezes, quando uma listagem acaba no final de uma página, o fechamento \hrulepassa para a próxima página:

imagem mostrando a regra extra no início da nova página

Como você pode ver a regra destacada acabou no início da nova página, o que é simplesmente feio.

Como posso evitar a quebra de página entre a listagem e a regra no final? Já tentei adicionar um \nopagebreakantes \hrulemas não resolveu o problema.

Responder1

Como indicadonos comentários de Jubobseu usariatcolorboxpor esta. O código a seguir imita o layout descrito na pergunta, mas com tcolorboxlayouts muito mais sofisticados são facilmente possíveis.

\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 você especifique a breakableopção tcolorbox(precisa da breakablebiblioteca), a listagem completa permanecerá em uma página.

insira a descrição da imagem aqui

informação relacionada