Я хотел бы определить новую listings
среду, где листинг имеет \hrule
до и после самого листинга. Для этого я определил эту среду:
\lstnewenvironment{haskell}[1][]
{
\vspace{0.4cm}
\mathligsoff
\hrule
\lstset{language=haskell, basicstyle=\small, #1}
}{
\hrule
\mathligson
\vspace{0.4cm}
}
Проблема в том, что иногда, когда листинг оказывается внизу страницы, закрытие \hrule
перемещается на следующую страницу:
Как вы видите, выделенное правило оказалось в начале новой страницы, что просто некрасиво.
Как мне избежать создания разрыва страницы между списком и правилом в конце? Я уже пытался добавить \nopagebreak
before \hrule
, но это не решило проблему.
решение1
Как указанов комментариях JubobsЯ бы использовалtcolorbox
для этого. Следующий код имитирует макет, описанный в вопросе, но с tcolorbox
гораздо более причудливыми макетами легко возможны.
\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}
Если вы не укажете breakable
опцию tcolorbox
(требуется breakable
библиотека), полный список будет располагаться на одной странице.