tcolorbox 是否应强制内部盒子牢不可破?

tcolorbox 是否应强制内部盒子牢不可破?

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

相关内容