使用 \vsplit 对带有彩色文本的框进行颜色渗色

使用 \vsplit 对带有彩色文本的框进行颜色渗色

我想要\vsplit一个内容相当随意的盒子。如果内容发生一些颜色变化,就会发生奇怪的事情。

以下 MWE 演示了该问题。示例文本更改了第二段的字体和颜色。当此段被拆分时,红色溢出框外,请注意,inter text字体更改仅限于框内。

顺便说一句:将颜色设置为black之前会使inter text问题恶化,因为第三段和第二个框之后的所有内容都会被漆成红色。

我该如何调整\splitmytext宏(也许是\savemytext宏)以避免这种颜色渗色问题?

\documentclass{article}
\usepackage{xcolor,lipsum}

\newbox\mwebox
\newbox\firstbox

\newcommand{\savemytext}[2]{%
  \setbox\mwebox\vbox{\hsize=#1\relax#2}}

\newcommand{\splitmytext}[1]{%
  \setbox\firstbox\vsplit\mwebox to #1}

\begin{document}

\savemytext{10cm}{%
  \lipsum[1]
  {\itshape\bfseries\color{red}
  \lipsum[2]
  }
  \lipsum[3]
}

\splitmytext{7cm}

\fbox{\box\firstbox}

inter text

\fbox{\box\mwebox}

after text

\end{document}

在此处输入图片描述

答案1

首先,如果周围有颜色,你总是需要确保你的盒子是双分组的,这样

\setbox\mwebox\vbox{{\hsize=#1\relax#2\endgraf}}

不是

  \setbox\mwebox\vbox{\hsize=#1\relax#2}}

或者

  \setbox\mwebox\vbox{\color@begingroup\hsize=#1\relax#2\color@endgroup}

\endgraf为您添加了。

原因\color{red}

\driver-specific-set-color{red}\aftergroup\reset@color

\reste@color在 哪里\driver-specific-set-color{\currentcolor}或者\pop-current-color取决于后端驱动程序。

这使得颜色命令看起来像遵循 TeX 分组,就像字体命令一样。

如果没有双组,\color已保存框的顶层列表中的命令会导致字体设置保存在框中,但颜色恢复由\aftergroup 外部此设置会尝试在框保存时弹出颜色堆栈(此时堆栈中可能没有颜色)。通常使用 pdftex 时会忽略此问题(此时),使用早期 laserwiters 上的 dvips 时,打印机会崩溃,这就是为什么 latex 会努力确保在使用受支持的 latex 命令时不会发生这种情况(不包括 vbox 和 vsplit:-)

通过双重分组,颜色恢复位于盒子的末端,盒子内部。

但是,如果您随后对框进行 vsplit,则最终会在一半中出现颜色推送,而在另一半中出现颜色弹出。如果您知道(通过在宏层中维护额外状态)情况确实如此,您当然可以插入原始 pdftex 颜色命令,在第一半的末尾弹出颜色,并在第二半的开头重新声明颜色(而不进行颜色恢复)。

但是,如果内容是可能具有颜色命令的任意用户内容,那么您会遇到一个问题,即在经典 tex 中,您无法查询框列表以发现颜色特殊内容,因为一旦您找到什么,您就无法看到它过去(有等等,\unskip \unbox但没有\unwhatsit。此时,您开始想知道是否要切换到 luatex……

相关内容