我想延迟可拆分 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}