tcolorbox:可以存储可破坏的 tcolorbox 的各个部分以供日后使用吗?

tcolorbox:可以存储可破坏的 tcolorbox 的各个部分以供日后使用吗?

我想延迟可拆分 tcolorbox 某些部分的输出(我想将它们用于“注释列”,并尝试实现一种方法,如果它们对于一页来说太长,则可以拆分它们)。有人知道我如何存储以下 tcolorbox 的四个部分,然后按照 3、2、1、4 的顺序将它们输出到一页上的 2x2 网格中吗?

\documentclass[]{article}

\usepackage[many]{tcolorbox}
\usepackage{lipsum}

\begin{document}

\begin{tcolorbox}[
title=breakable,
watermark text=\arabic{tcbbreakpart},
enhanced jigsaw,
text width=4cm,
breakable,
break at=5cm/5cm/5cm/8cm]
\lipsum[1]
\end{tcolorbox}    
\end{document}

答案1

新答案(需要tcolorbox版本3.70 (2015/07/16)或更新版本:

从版本开始3.70 (2015/07/16),该tcolorbox软件包提供了一个新magazine库。该库的主要目的是将 tcolorbox 存储到框寄存器数组中以供以后使用。

store to box array选项将 tcolorbox 的中断序列的所有部分存储到框数组中。这是一个box registers稍后可以使用 、 等插入\useboxarray{1}\useboxarray{2}序列。

\documentclass{article}
\usepackage[many,magazine]{tcolorbox}
\usepackage{lipsum}

\begin{document}

\begin{tcolorbox}[
  title=breakable,
  height fixed for=first and middle,
  watermark text=\arabic{tcbbreakpart},
  enhanced jigsaw,
  text width=4cm,
  breakable,
  break at=5cm/5cm/5cm/8cm,
  reset and store to box array
  ]
\lipsum[1]
\end{tcolorbox}

\tabcolsep=1pt\relax
\begin{tabular}{cc}
\useboxarray{3} & \useboxarray{2}\\
\useboxarray{1} & \useboxarray{4}
\end{tabular}

\end{document}

在此处输入图片描述

旧答案(对tcolorbox之前的版本有用3.70):

这是图书馆的基础magazine

解决方案的核心是将破碎的箱体部件自动捕获到箱子中。因此需要一系列的箱子,称为盒装如下所示。default以下代码会创建一个盒子集,但可能会有多个盒子集。

捕获操作使用新选项完成。所有盒子部件都附加到现有盒子集。使用store to box set先前的存储操作清除可能的集合。reset box set

保存后,盒子组中的盒子可以被寻址为\tcbuseboxset{1}\tcbuseboxset{2}等。

\documentclass{article}
\usepackage[many]{tcolorbox}
\usepackage{lipsum}

\makeatletter

\def\newtcbboxset#1{%
  \global\csdef{tcb@boxset@#1@size}{0}%
  \global\csdef{tcb@boxset@#1@allocated}{0}%
}

\newtcbboxset{default}

\def\tcbstoretoboxset#1{%
  \tcbletboxsetsize[#1]\tcb@boxset@size%
  \numdef\tcb@boxset@size{\tcb@boxset@size+1}%
  \global\cslet{tcb@boxset@#1@size}{\tcb@boxset@size}%
  \letcs\tcb@boxset@allocated{tcb@boxset@#1@allocated}%
  \ifnum\tcb@boxset@allocated<\tcb@boxset@size\relax%
    \newbox\tcb@boxset@box\csxdef{tcb@boxset@#1@\tcb@boxset@size @box}{\the\tcb@boxset@box}%
    \global\cslet{tcb@boxset@#1@allocated}{\tcb@boxset@size}%
  \else%
    \letcs\tcb@boxset@box{tcb@boxset@#1@\tcb@boxset@size @box}%
  \fi%
  \edef\reserved@a{%
    \endgroup
    \global\setbox\tcb@boxset@box\hbox{%
      \begingroup\aftergroup}%
        \def\noexpand\@currenvir{\@currenvir}%
        \def\noexpand\@currenvline{\on@line}}%
  \reserved@a
    \@endpefalse
    \color@setgroup
      \ignorespaces}

\def\endtcbstoretoboxset{\unskip\color@endgroup}

\def\tcb@storetoboxset@begin#1#2[#3]{\begin{tcbstoretoboxset}{#1}}
\def\tcb@storetoboxset@end{\end{tcbstoretoboxset}}

\tcbset{
  store to box set/.code={%
    \def\kvtcb@float{S}\def\tcb@float@env@begin{\tcb@storetoboxset@begin{#1}}\def\tcb@float@env@end{\tcb@storetoboxset@end}},
  store to box set/.default=default,
  reset box set/.code={\tcbresetboxset[#1]},
  reset box set/.default=default,
  do not store to box set/.style={nofloat},
}

\newrobustcmd*{\tcbletboxsetsize}[2][default]{%
  \letcs#2{tcb@boxset@#1@size}%
  \ifdef{#2}{}{%
    \tcb@error{undefined box set '#1'}%
    {You have to say \string\newtcbboxset{#1}, before '#1' can be used as box set.}%
  }%
}

\newrobustcmd*{\tcbresetboxset}[1][default]{%
  \tcbletboxsetsize[#1]\tcb@boxset@size%
  \global\csdef{tcb@boxset@#1@size}{0}%
}

\newrobustcmd*{\tcbuseboxset}[2][default]{%
  \tcbletboxsetsize[#1]\tcb@boxset@size%
  \ifnum\numexpr#2>0\relax%
    \ifnum\numexpr#2>\tcb@boxset@size\relax%
    \else%
      \global\letcs\tcb@boxset@box{tcb@boxset@#1@#2@box}%
      \usebox{\tcb@boxset@box}%
    \fi%
  \fi%
}

\makeatother


\begin{document}

\begin{tcolorbox}[
  title=breakable,
  height fixed for=first and middle,
  watermark text=\arabic{tcbbreakpart},
  enhanced jigsaw,
  text width=4cm,
  breakable,
  break at=5cm/5cm/5cm/8cm,
  reset box set,
  store to box set,
  ]
\lipsum[1]
\end{tcolorbox}

\tabcolsep=1pt\relax
\begin{tabular}{cc}
\tcbuseboxset{3} & \tcbuseboxset{2}\\
\tcbuseboxset{1} & \tcbuseboxset{4}
\end{tabular}

\end{document}

请注意,方框与\global修改器一起保存,并将在当前 TeX 组中继续存在。如果大量使用,这可能会导致内存问题。

可以通过 查询当前存储在盒子集合内的盒子数量\tcbletboxsetsize{\mysize}。之后,\mysize包含当前大小。

答案2

这里,我将拆分\tcolorbox\vbox。这样做的效果是将其保留为一个垂直框,但它会正确放置分区编号(如果使用\hbox,则只会得到一个大页面“1”)。然后,我会\clipbox定期保存页面。

我首先从保存的底部剪掉 3pt,从顶部剪掉 1pt \vbox(即空白空间,可能是设置tcolorbox)。然后,垂直剪辑间隔比标称高度 5cm 少 5pt(我不知道为什么),而且,作为一个\vbox,我还必须从右侧边距进行修剪,在本例中,比 少 32pt \textwidth-4cm,以留出两侧的空白边框。

我过去常常stackengine将剪辑保存在盒子里,但简单的盒子\savebox \usebox也同样适用。

\documentclass[]{article}
\usepackage[many]{tcolorbox}
\usepackage{trimclip,stackengine}
\usepackage{lipsum}
\newsavebox\breakbox
\newlength\cliptop
\newlength\clipbot
\begin{document}

\setbox0=\vbox{%
\begin{tcolorbox}[
title=breakable,
watermark text=\arabic{tcbbreakpart},
enhanced jigsaw,
text width=4cm,
breakable,
break at=5cm/5cm/5cm/8cm]
\lipsum[1]
\end{tcolorbox}%
}
\savebox\breakbox{\clipbox{0pt 3pt 0pt 1pt}{\box0}}
\edef\dellength{\dimexpr5cm-5pt}
\def\rightclip{\dimexpr\textwidth-4cm-32pt}
%#1
\setlength\cliptop{0pt}
\setlength\clipbot{\dimexpr\ht\breakbox-\dellength\relax}
\savestack{\BoxA}{\clipbox{0pt {\clipbot} {\rightclip} {\cliptop}}{\usebox{\breakbox}}}
%#2
\addtolength\cliptop{\dellength}
\addtolength\clipbot{-\dellength}
\savestack{\BoxB}{\clipbox{0pt {\clipbot} {\rightclip} {\cliptop}}{\usebox{\breakbox}}}
%#3
\addtolength\cliptop{\dellength}
\addtolength\clipbot{-\dellength}
\savestack{\BoxC}{\clipbox{0pt {\clipbot} {\rightclip} {\cliptop}}{\usebox{\breakbox}}}
%#4
\addtolength\cliptop{\dellength}
\addtolength\clipbot{-\dellength}
\ifdim\clipbot<0pt\relax\setlength\clipbot{0pt}\fi
\savestack{\BoxD}{\clipbox{0pt {\clipbot} {\rightclip} {\cliptop}}{\usebox{\breakbox}}}
%
\tabcolsep=1pt\relax
\begin{tabular}{cc}
\BoxC & \BoxB\\
\BoxA & \BoxD
\end{tabular}
\end{document}

在此处输入图片描述

相关内容