为易碎的 tcolorbox 自动添加 \vfill

为易碎的 tcolorbox 自动添加 \vfill

我使用的tcolorbox是嵌套的tcolorboxes,上层的 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 内部进行一些探索 :-)

相关内容