페이지 나누기가 없는 경우에만 세로 간격 추가

페이지 나누기가 없는 경우에만 세로 간격 추가

목록 자체의 전후가 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

여기에 이미지 설명을 입력하세요

관련 정보