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 警告。看起來好像隱形的某些部分before skip
位於第 1 頁的底部,儘管實際tcolorbox
本身完全位於第 2 頁上。
如果刪除該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}