Добавляйте вертикальный интервал только в том случае, если нет разрыва страницы.

Добавляйте вертикальный интервал только в том случае, если нет разрыва страницы.

Я хотел бы определить новую listingsсреду, где листинг имеет \hruleдо и после самого листинга. Для этого я определил эту среду:

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

Проблема в том, что иногда, когда листинг оказывается внизу страницы, закрытие \hruleперемещается на следующую страницу:

изображение, показывающее дополнительное правило в начале новой страницы

Как вы видите, выделенное правило оказалось в начале новой страницы, что просто некрасиво.

Как мне избежать создания разрыва страницы между списком и правилом в конце? Я уже пытался добавить \nopagebreakbefore \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библиотека), полный список будет располагаться на одной странице.

введите описание изображения здесь

Связанный контент