깨지기 쉬운 tcolorbox로 인해 바닥이 울퉁불퉁해짐

깨지기 쉬운 tcolorbox로 인해 바닥이 울퉁불퉁해짐

tcolorbox옵션 과 함께 을 사용하면 breakable일부 특수한 상황에서 "바닥이 울퉁불퉁"해질 수 있습니다. 다음 MWE는 이 동작을 보여줍니다.

\documentclass[DIV=10, BCOR=10mm, twoside]{scrreprt}

\usepackage[ngerman]{babel}
\usepackage{lmodern}
\usepackage{amsmath}
\usepackage{microtype}
\usepackage{lipsum}

\usepackage{tcolorbox}
\tcbuselibrary{theorems, skins, breakable}
\newtcbtheorem[auto counter]{mytheo}{My Theorem}{
  enhanced, breakable, colback=white, colbacktitle=black!15, coltitle=black, fonttitle=\bfseries,
  before skip=15pt plus 4pt minus 2pt,
  after skip =15pt plus 4pt minus 2pt
}{th}

\begin{document}

\lipsum[1-5]

\begin{mytheo}{This is my title}{theoexample}
\lipsum[6]
\end{mytheo}

\lipsum[6-10]

\end{document}

너덜너덜한 바닥

스크린샷에서 볼 수 있듯이 첫 페이지 하단이 정렬되지 않았습니다. 그럼에도 불구하고 LaTeX는 가득 차 있지 않은 vbox 경고를 인쇄하지 않습니다. 실제 내용 은 완전히 2페이지에 있음에도 불구하고 보이지 않는 것의 일부가 before skip1페이지 하단에 위치한 것처럼 보입니다.tcolorbox

옵션 을 제거하면 breakable상자의 모양이 변경되지 않지만(어쨌든 상자가 깨지지 않았기 때문에) LaTeX는 예상대로 vbox가 가득 차 있지 않은 것에 대해 경고합니다.

깨지기 쉬운 상자를 버리지 않고도 이 문제를 해결할 수 있는 가능성이 있을까요?

답변1

다음 답변은 tcolorbox이전 버전 에 유효합니다 3.90 (2016/02/29). 해당 버전부터 before skip페이지 나누기가 발생할 때 옵션이 트랙을 남기지 않아야 합니다.

tcolorbox남은 높이를 계산하기 전에 특정 코드(건너뛰기 전 포함)를 삽입해야 합니다. 여기서 삽입된 건너뛰기는 자동으로 제거되지 않습니다.

에 부정적인 건너뛰기를 삽입하는 다음 '핫픽스'를 제공할 수 있습니다 \pagebreak. 현재로서는 이 패치가 미칠 수 있는 부정적인 영향을 더 자세히 조사할 시간은 없지만 before skip다음과 같은 경우에는 효과가 있는 것 같습니다.

\documentclass[DIV=10, BCOR=10mm, twoside]{scrreprt}

\usepackage[ngerman]{babel}
\usepackage{lmodern}
\usepackage{amsmath}
\usepackage{microtype}
\usepackage{lipsum}


\usepackage{tcolorbox}
\tcbuselibrary{theorems, skins, breakable}

%--- begin patch ---
\makeatletter

\def\tcb@undo@before{}

\tcbset{
  before skip/.style={before={%
    \ifnum\lastnodetype=-1\relax%
    \else%
      \par\ifvmode\nointerlineskip%
      \addvspace{\glueexpr#1-\parskip}%
      \def\tcb@undo@before{\addvspace{-\glueexpr#1}}%
      \fi%
    \fi%
    \lineskip=0pt\noindent%
    }},
}

\def\tcb@split@start{%
  \tcb@breakat@init%
  \tcb@comp@h@page%
  % height calculation
  \tcb@comp@h@total@standalone%
  %
  \let\tcb@split@next=\relax%
  \tcb@check@for@final@box%
  \iftcb@final@box%
    \tcb@drawcolorbox@standalone%
  \else%
    \iftcb@break@allowed%
      \ifdim\dimexpr\tcb@h@page-\tcb@h@padding-\tcb@h@padtitle<\kvtcb@breakminlines\baselineskip\relax%
        \tcb@undo@before\iftcb@multicol\columnbreak\else\pagebreak\fi%            
        \tcb@nobreak@warning%
        \tcb@enlbreak@init\tcb@break@allowedfalse%
        \tcb@comp@h@page%
        \tcb@check@for@final@box%
        \iftcb@final@box%
          \tcb@drawcolorbox@standalone%
        \else%
          \let\tcb@split@next=\tcb@split@first%
        \fi%
      \else%
        \let\tcb@split@next=\tcb@split@first%
      \fi%
    \else%
      \let\tcb@split@next=\tcb@split@first%
    \fi%
  \fi%
  \tcb@split@next%
}

\makeatother
%--- end patch ---

\newtcbtheorem[auto counter]{mytheo}{My Theorem}{
  enhanced,
  breakable,
  colback=white, colbacktitle=black!15, coltitle=black, fonttitle=\bfseries,
  before skip=15pt plus 4pt minus 2pt,
  %before=,
  after skip =15pt plus 4pt minus 2pt
}{th}

\begin{document}

\lipsum[1-5]

\begin{mytheo}{This is my title}{theoexample}
\lipsum[6]
\end{mytheo}

\lipsum[6-10]

\end{document}

관련 정보