我使用的tcolorbox
是嵌套的tcolorbox
es,上层的 es 是可破坏的。下面是一个例子。
\documentclass{article}
\usepackage{lipsum}
\usepackage{tcolorbox}
\tcbuselibrary{skins,breakable}
\tcbset{enhanced jigsaw}
\begin{document}
\begin{tcolorbox}[breakable,title=My breakable box]
\begin{tcolorbox}[title = box1]
\lipsum[1]
\end{tcolorbox}
\begin{tcolorbox}[title = box2]
\lipsum[1]
\end{tcolorbox}
\begin{tcolorbox}[title = box3]
\lipsum[1]
\end{tcolorbox}
\end{tcolorbox}
\end{document}
请注意第一页底部的大片空白。
现在,我想要类似的东西(我\vspace*{3cm}
在第一个和第二个框之间添加了一个丑陋的东西):
我认为,稍微好一点。
所以我的问题是:一旦断线算法决定了在哪里断线,是否有可能自动在内框之间tcolorbox
添加某种内容。\vfill
答案1
从美学角度来看,所有的解决方案都有些丑陋...选择最不丑陋的方案最终应该由你决定;-)
我们将您的问题描述称为第一个“解决方案”,即,可用空间放在第一个盒子部分之后。
第二种解决方案是将可用空间放在第一个框部分的内部但末尾。tcolorbox
使用以下选项支持此height fixed for
功能:
\documentclass{article}
\usepackage{lipsum}
\usepackage{tcolorbox}
\tcbuselibrary{skins,breakable}
\tcbset{enhanced jigsaw}
\begin{document}
\begin{tcolorbox}[breakable,title=My breakable box,
height fixed for=first and middle]
\begin{tcolorbox}[title = box1]
\lipsum[1]
\end{tcolorbox}
\vfill
\begin{tcolorbox}[title = box2]
\lipsum[1]
\end{tcolorbox}
\begin{tcolorbox}[title = box3]
\lipsum[1]
\end{tcolorbox}
\end{tcolorbox}
\end{document}
添加这个\vfill
只是为了好玩,以表明它在这里没有效果。
第三种解决方案尝试拉伸第一个盒子部分的内容以适应可用空间。为此,我使用选项补丁height fixed for
。请注意,如果外框有下部,这将无法正常工作。现在,开始\vfill
行动:
\documentclass{article}
\usepackage{lipsum}
\usepackage{tcolorbox}
\tcbuselibrary{skins,breakable}
\tcbset{enhanced jigsaw}
\makeatletter
\def\tcb@break@ch@fixed{%
\ifdim\tcb@natheight<\tcb@h@page\relax%
\tcbdimto\tcb@h@upper{\tcb@h@upper+\tcb@h@page-\tcb@natheight}%
\setbox\tcb@upperbox=\vbox to\tcb@h@upper\relax{\unvbox\tcb@upperbox}%
\tcbdimto\kvtcb@height@fixed{\tcb@h@page}%
\tcb@ch@fixed%
\else%
\tcb@ch@natural%
\fi%
}
\makeatother
\begin{document}
\begin{tcolorbox}[breakable,title=My breakable box,
height fixed for=first and middle]
\begin{tcolorbox}[title = box1]
\lipsum[1]
\end{tcolorbox}
\vfill
\begin{tcolorbox}[title = box2]
\lipsum[1]
\end{tcolorbox}
\begin{tcolorbox}[title = box3]
\lipsum[1]
\end{tcolorbox}
\end{tcolorbox}
\end{document}
当然,您可以将after={\par\vfill}
其用作内部框的选项,以摆脱手动添加\vfill
命令的麻烦。
答案2
嗯,你可以使用
\par\vskip .5\textheight minus .5\textheight
这使得
但这不是完全自动的,如果将自然尺寸设置得太大(例如.75\textheight
在这种情况下),它将填满整个页面并将下一个框推到下一页,如果将自然尺寸设置得太小,它就不会将框推到底部。
做更多的事情可能需要 Thomas 经过并在某处对 tcolorbox 内部进行一些探索 :-)