Me gustaría definir un nuevo listings
entorno donde el listado tenga un \hrule
antes 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 \hrule
pasa a la página siguiente:
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 \nopagebreak
antes \hrule
pero no resolvió el problema.
Respuesta1
Como se indicaen los comentarios de Jubobsyo usaríatcolorbox
para esto. El siguiente código imita el diseño descrito en la pregunta, pero tcolorbox
es 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 breakable
opción tcolorbox
(necesita la breakable
biblioteca), el listado completo permanecerá en una página.