Cuando se utiliza tcolorbox
con la breakable
opción, esto puede causar un "fondo irregular" en algunas situaciones especiales. El siguiente MWE demuestra este comportamiento:
\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}
Como puede ver en la captura de pantalla, la parte inferior de la primera página no está alineada. Sin embargo, LaTeX no imprime ninguna advertencia de vbox insuficiente. Parece como si alguna parte de lo invisible before skip
se hubiera ubicado en la parte inferior de la página 1, aunque lo real tcolorbox
mismo esté completamente en la página 2.
Si elimina la breakable
opción, esto no cambia la apariencia del cuadro (ya que el cuadro no se ha roto de todos modos), pero LaTeX advierte sobre el vbox insuficientemente lleno como era de esperar.
¿Existe alguna posibilidad de solucionar este problema sin renunciar a las cajas rompibles?
Respuesta1
La siguiente respuesta es válida para
tcolorbox
versiones anteriores3.90 (2016/02/29)
. A partir de esa versión, labefore skip
opción no debería dejar pistas cuando se produce un salto de página.
tcolorbox
tiene que insertar cierto código (incluido el salto anterior) antes de que se pueda calcular la altura restante. En este caso, el skip insertado aparentemente no se elimina automáticamente.
Puedo ofrecer la siguiente 'revisión' que inserta un salto negativo en el archivo \pagebreak
. Actualmente, no tengo tiempo para investigar más a fondo los posibles impactos negativos de este parche, pero before skip
lo siguiente parece funcionar:
\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}