改ページがない場合のみ垂直スペースを追加します

改ページがない場合のみ垂直スペースを追加します

リスト自体の前後に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オプションを指定しない限り、完全なリストは 1 ページに残ります。tcolorboxbreakable

ここに画像の説明を入力してください

関連情報