第 2 页底部的文本是红色的,尽管下面代码中的颜色变化源自\color{red}\normalcolor
内部multicols
,figure
并且不应该产生这样的影响。如果出现以下任一情况,则不会产生任何影响:
注释掉
\begin{multicols}
和\end{multicols}
行,注释掉
\begin{figure*}
和\end{figure*}
行。
我的问题是为什么会发生这种情况?(我希望听到一些whatsit
微妙的解释)。
有没有解决方法?(在我的上下文中,我在文本之前有,或多或少和这里一样,我无法改变这一点,所以解决方案不应该改变里面的任何内容\color{red}
,唯一的自定义可能性是在多列环境之前或之后或两者中添加额外的东西)。\normalcolor
multicols
更新大卫的提议在里面添加一个组或括号对multicols
可以解决问题(我最初以为我无法访问这些内容,但我忘记了自己的钩子),另一种方法是在里面添加\normalcolor
甚至(原文如此)\color{green}
figure*
在环境前环境multicols
。这第二种药物避免了必须在里面插入任何东西multicols
。
\documentclass{article}
\usepackage[paperheight=6cm]{geometry}
\usepackage{multicol}
\usepackage{color}
% COLOR LEAK IF COLOR WITHIN MULTICOLS WITHIN FIGURE
\begin{document}
Hello World World World World World World World
World World World World World World World
World World World World World World World
World World World World World World World
World World
World World World
World World World World World World World
World World World World World World World
World World World World World World World
World World World World World World World
World World
\begin{figure*}[ht!]
\begin{multicols}{2}
\color{red}\normalcolor
Hello. World World World
World World World World World World
World World World World World World
World World World World World World
World World World World World World
World World World World World World
World World World World
World World World World World World
World World World World World World
World World World World World World
World World World World World World
World World World World World\par
\end{multicols}
\end{figure*}
World World World
World World World World World World World
World World World World World World World
World World World World World World World
World World World World World World World
World World
World World World
World World World World World World World
World World World World World World World
World World World World World World World
World World World World World World World
World World
World World World
World World World World World World World
World World World World World World World
World World World World World World World
World World World World World World World
World I AM RED, WHY?
\end{document}
答案1
David 的怀疑是正确的:multicol
这里出了问题。当环境检测到它是在盒子内使用时(例如,在本例中是浮点数),它会将其材料收集在垂直盒子内,然后通过将盒子分成几列来应用其平衡例程。它通过使用\setbox
以下方式来实现这一点不是“颜色安全”。
因此,序列中的第一个颜色变化\color{red}\normalcolor
(或者更准确地说是倒数第二个颜色变化)将被周围的浮动环境误解为浮动之后要恢复的外部颜色,因为它仍保留在“颜色堆栈”上。
可能的补丁如下:
\usepackage{etoolbox}
\makeatletter
\patchcmd{\mult@@cols}{\vbox\bgroup}{\vbox\bgroup\color@setgroup}{}{\PATCHerror}
\patchcmd{\endmulticols}{\egroup}{\color@endgroup\egroup}{}{\PATCHerror}
\makeatother
但显然应该将其正确集成到multicol
包中。一个很好的例子是,这部分代码multicol
早于 LaTeX2e,而且很有趣的是,这个错误花了 20 年才浮出水面。
更新
仅供记录,此补丁已在 multicol 中集成了一段时间,因此此问题不再发生。
答案2
有趣的:-)
由于这是两者之间的互动color
,multicol
因此它可能与我或弗兰克的一些代码有关。显然我怀疑是弗兰克 :-)
现在没有时间调试,但这类问题通常可以通过添加额外的组来解决,而{}
像这里一样添加,可以在这种情况下解决问题。
\begin{multicols}{2}
{\color{red}\normalcolor
Hello. World World World
World World World World World World
World World World World World World
World World World World World World
World World World World World World
World World World World World World
World World World World
World World World World World World
World World World World World World
World World World World World World
World World World World World World
World World World World World\par}