我想要\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……