Tcolorbox 未破损的盒子可防止下一个可破损的盒子破损

Tcolorbox 未破损的盒子可防止下一个可破损的盒子破损

我认为我偶然发现了一个 tcolorbox 错误:每当有两个连续的可破坏框时,它们都无法在当前页面中保持完整,并且第一个框的内容不可破坏(例如图像),而第二个框的内容可破坏(例如文本),则第一个框会按预期移动到下一页,但由于某种原因,第二个框不会破坏并最终溢出页面。使第一个框不可破坏(由于它不能被破坏,因此基本上不会发生任何变化)可以解决问题,这让我认为这是由于 tcolorbox 以某种方式错误地将不破坏第一个框的决定应用于第二个框。

实际用例是一篇博士论文,其中每个图形、定理(以及事实、命题、评论等)和证明都位于一个可破坏的 tcolorbox 中。这个问题发生在意想不到的地方,因为图形会浮动而定理不会浮动,这使得手动将一些框设为不可破坏变得难以管理。

我看过可喙代码,尝试改变布尔值\tcb@break@allowedtrue并将\tcb@ignorenobreaktrue该框放在一个组中(以防止值更改泄漏到另一个框),但这没有效果。

\documentclass{article}
\usepackage[most]{tcolorbox}
\usepackage{afterpage}
\usepackage{lipsum}

\tcbset{enhanced}

\newcommand{\breakablecontent}{\lipsum[1-12]}
\newcommand{\nonbreakablecontent}{\rule{\columnwidth}{\columnwidth}}

\newcommand{\mytest}[1]{
  \lipsum[1-3]
  \afterpage{
    \begin{tcolorbox}[breakable=true]
      \breakablecontent
    \end{tcolorbox}
  }
  \begin{tcolorbox}[breakable=#1]
    \nonbreakablecontent
  \end{tcolorbox}
}

% Naive Attempt to fix this:
%\makeatletter
%\renewcommand{\mytest}[1]{
%  \lipsum[1-3]
%  \afterpage{
%    \tcb@break@allowedtrue\tcb@ignorenobreaktrue
%    \begingroup
%    \begin{tcolorbox}[breakable=true]
%      \breakablecontent
%    \end{tcolorbox}
%    \endgroup
%    \tcb@break@allowedtrue\tcb@ignorenobreaktrue
%  }
%  \tcb@break@allowedtrue\tcb@ignorenobreaktrue
%  \begin{tcolorbox}[breakable=#1]
%    \nonbreakablecontent
%  \end{tcolorbox}
%}
%\makeatother

\begin{document}

\section{Expected behavior}
\mytest{false}

\clearpage

\section{Unexpected behavior}
\mytest{true}

\end{document}

答案1

我认为,问题确实与\afterpage您将第一个放在哪里有关tcolorbox。没有这个,断点会按预期工作。我不确定你为什么需要这个。也许一个解决方法是\clearpage在以下内容之前放置一个简单的右键tcolorbox

梅威瑟:

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

\tcbset{enhanced}

\newcommand{\breakablecontent}{\lipsum[1-12]}
\newcommand{\nonbreakablecontent}{\rule{\columnwidth}{\columnwidth}}

\newcommand{\mytest}[1]{
  \lipsum[1-3]
  \clearpage
  \begin{tcolorbox}[breakable=true]
    \breakablecontent
  \end{tcolorbox}
  \clearpage
  \begin{tcolorbox}[breakable=#1]
    \nonbreakablecontent
  \end{tcolorbox}
}

\begin{document}

\section{Expected behavior}
\mytest{false}

\clearpage

\section{Unexpected behavior}
\mytest{true}

\end{document}

答案2

按照 Ulrike Fischer 的建议使用 magazine 库可以修复溢出问题,但不可破坏的内容莫名其妙地向下移动,超出了其框。使用浮动代替 afterpage 是可行的。

\documentclass{article}
\usepackage[most]{tcolorbox}
\usepackage{afterpage}
\usepackage{lipsum}

\tcbset{enhanced}

\newcommand{\breakablecontent}{\lipsum[1-12]}
\newcommand{\nonbreakablecontent}{\rule{\columnwidth}{\columnwidth}}

\newboxarray{a}

% Does not work weirdly
\newcommand{\mytest}[1]{
  \lipsum[1-3]\\
  \begin{tcolorbox}[breakable=true, reset and store to box array=a]
    \breakablecontent
  \end{tcolorbox}
  \afterpage{
    \consumeboxarray[a]{1}{}
    \consumeboxarray[a]{2}{}
    \consumeboxarray[a]{3}{}
  }
  \begin{tcolorbox}[breakable=#1]
    \nonbreakablecontent
  \end{tcolorbox}
}

% Works
\renewcommand{\mytest}[1]{
  \lipsum[1-3]\\
  \begin{tcolorbox}[breakable=true, reset and store to box array=a]
    \breakablecontent
  \end{tcolorbox}
  \begin{figure}[p]\consumeboxarray[a]{1}{}\end{figure}
  \begin{figure}[p]\consumeboxarray[a]{2}{}\end{figure}
  \begin{figure}[p]\consumeboxarray[a]{3}{}\end{figure}
  \begin{tcolorbox}[breakable=#1]
    \nonbreakablecontent
  \end{tcolorbox}
}

\begin{document}

\section{Expected behavior}
\mytest{false}

\clearpage

\section{Unexpected behavior}
\mytest{true}

\end{document}

相关内容