Gostaria de definir um novo listings
ambiente onde a listagem tenha um \hrule
antes 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 \hrule
passa para a próxima 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 \nopagebreak
antes \hrule
mas não resolveu o problema.
Responder1
Como indicadonos comentários de Jubobseu usariatcolorbox
por esta. O código a seguir imita o layout descrito na pergunta, mas com tcolorbox
layouts 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 breakable
opção tcolorbox
(precisa da breakable
biblioteca), a listagem completa permanecerá em uma página.