![Tcolorbox 未破损的盒子可防止下一个可破损的盒子破损](https://linux22.com/image/465309/Tcolorbox%20%E6%9C%AA%E7%A0%B4%E6%8D%9F%E7%9A%84%E7%9B%92%E5%AD%90%E5%8F%AF%E9%98%B2%E6%AD%A2%E4%B8%8B%E4%B8%80%E4%B8%AA%E5%8F%AF%E7%A0%B4%E6%8D%9F%E7%9A%84%E7%9B%92%E5%AD%90%E7%A0%B4%E6%8D%9F.png)
我认为我偶然发现了一个 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}