仅当没有分页符时才添加垂直空间

仅当没有分页符时才添加垂直空间

我想定义一个新listings环境,其中列表\hrule本身有前后内容。为了做到这一点,我定义了这个环境:

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

问题是,有时当列表位于页面底部时,结束\hrule会移动到下一页:

图片显示了新页面开头的额外规则

正如您所看到的,突出显示的规则最终出现在新页面的开始处,这很丑陋。

如何避免在列表和最后的规则之间产生分页符?我\nopagebreak之前已经尝试添加\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选项,否则完整列表将保留在一页上。tcolorboxbreakable

在此处输入图片描述

相关内容