壊れやすい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 は underfull vbox の警告を出力しません。実際は 2 ページ目にあるbefore skipにもかかわらず、見えない部分の一部が 1 ページ目の下部にあるように見えます。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}

関連情報