![tcolorbox 是否应强制内部盒子牢不可破?](https://linux22.com/image/291143/tcolorbox%20%E6%98%AF%E5%90%A6%E5%BA%94%E5%BC%BA%E5%88%B6%E5%86%85%E9%83%A8%E7%9B%92%E5%AD%90%E7%89%A2%E4%B8%8D%E5%8F%AF%E7%A0%B4%EF%BC%9F.png)
该tcolorbox
包提供了可破坏的盒子。此外,tcolorbox
可以嵌套在另一个 中tcolorbox
,甚至可以嵌套在可破坏的盒子中。但实际上并不支持将可破坏的盒子嵌套在可破坏的盒子中。内部盒子的可破坏性已关闭,但可以使用键将其重新打开breakable
。
回想起来,这个功能(打开内盒的可破碎性)对用户来说一直是一个永久的陷阱,因为很容易滥用密钥,breakable
如下例所示:
\documentclass[a4paper]{article}
\usepackage[many]{tcolorbox}
\usepackage{lipsum}
\newtcolorbox{redbox}{colframe=red,enhanced,breakable}
\newtcolorbox{bluebox}{colframe=blue,enhanced,breakable}
\begin{document}
\begin{redbox}
\lipsum[1-4]
\end{redbox}
\begin{bluebox}
\begin{redbox}% gives shattered boxes (until tcolorbox 3.04)
\lipsum[1-4]
\end{redbox}
\end{bluebox}
\end{document}
因此,我想breakable
完全禁用内盒密钥并消除这个陷阱。
我唯一担心的是失去向后兼容性。这就是提出这个问题的原因。在非常在受控情况下,当前功能可用于将可破坏的盒子放入可破坏的盒子中。但需要明确的是:正常使用时无法实现。
有什么反对宣布这一点的特征A不当行为因此将其删除?
答案1
考虑到所有有用的评论,我认为如果内盒被迫牢不可破,现有应用程序可能会停止像以前那样工作,这种情况不太可能发生,但仍然有可能。
因此,问题的答案是:是的,tcolorbox
应该强制内部盒子牢不可破,但旧的行为应该是可选的。
- 下一个版本
tcolorbox
(3.05 或 3.10)将禁用breakable
内盒按键。我期望这可以帮助许多用户避免麻烦。 - 将会有一个额外的
enforce breakable
键,允许将内盒设置为可破坏(如 3.04 或之前版本)。这是为了在极少数情况下需要使用旧行为。
对于当前版本 3.04,可以应用以下补丁:
% insert after tcolorbox v3.04 and the breakable library is loaded
% remove for tcolobox 3.05 or higher
\makeatletter
\def\tcb@layer@inc{%
\stepcounter{tcblayer}%
\ifnum\c@tcblayer>1%
\tcbset{breakable@true/.code=}%
\fi%
\ifnum\c@tcblayer>\tcb@managed@layers@max%
\tcbset{every box on higher layers}%
\else%
\expandafter\setbox\csname tcb@footnote@\romannumeral\c@tcblayer\endcsname\box\@mpfootins%
\csedef{tcb@footnote@cnt@\romannumeral\c@tcblayer}{\the\c@mpfootnote}%
\tcbset{every box on layer \number\c@tcblayer}%
\fi%
}
\def\tcb@layer@pushup{%
\stepcounter{tcblayer}%
\ifnum\c@tcblayer>1%
\tcbset{breakable@true/.code=}%
\fi%
\ifnum\c@tcblayer>\tcb@managed@layers@max%
\tcbset{every box on higher layers}%
\tcbset{every box on higher layers/.code=}%
\else%
\tcbset{every box on layer \number\c@tcblayer}%
\tcbset{every box on layer \number\c@tcblayer/.code=}%
\fi%
\addtocounter{tcblayer}{-1}%
}
\tcbset{enforce breakable/.code={%
\let\tcb@savebox=\tcb@vbox%
\let\endtcb@savebox=\endtcb@vbox%
\let\tcb@drawcolorbox=\tcb@drawcolorbox@breakable}}
\makeatother