![TeX 框关闭后,其外观会改变吗?](https://linux22.com/image/359380/TeX%20%E6%A1%86%E5%85%B3%E9%97%AD%E5%90%8E%EF%BC%8C%E5%85%B6%E5%A4%96%E8%A7%82%E4%BC%9A%E6%94%B9%E5%8F%98%E5%90%97%EF%BC%9F.png)
Tex 框是否类似于位图图像,即在关闭时,其中的 TeX 代码就如同渲染一样,并且从那时起其外观就无法再改变,即使框内的代码所依赖的某些寄存器、参数或宏稍后会更改它们的值,而您对 TeX 框唯一能做的事情就是移动它、隐藏它,或者应用各种效果来统一改变框的外观,例如改变透明度?
答案1
摘自 TeXbook 第 279 页(垂直模式摘要):
•
}
。这个比较难,因为它取决于当前组。TeX 现在应该在以 开头的组上工作{
;并且它知道为什么启动该组。因此,它会执行适当的结束操作,撤消非全局分配的效果,然后离开该组。此时,TeX 可能会离开其当前模式并返回到之前有效的模式。
TeXbook 用}
类别 2 的显式或隐式字符标记表示({
相同,但类别代码为 1)。
当 TeX “离开模式”时,它总是将相应的列表转换为其内部表示(用户无法使用),由以下部分组成:节点。例如,在构建一个盒子时就是这种情况。最简单的例子是\hbox{...}
或\setbox<number>=\hbox{...}
本质上是等价的,唯一的区别是,在后一种情况下,转换后的列表存储在内存中,而在前一种情况下,它作为盒子项附加到当前列表中。
构建框在某种程度上与排版页面相同,因此结果基本上是不可修改的:宏已展开,原始命令已执行。例如,已选择字体,已插入字母之间的隐式字距,已设置粘连。
然而,存储在记忆中的盒子可以拆箱.此过程删除一个级别装箱。具体来说,顶层的粘合节点将恢复其可拉伸性或可收缩性,并且惩罚节点将在正在构建的列表中进行评估。
这是一个简单的例子:
\hsize=4cm
\setbox0=\hbox{a\hfill b\penalty-10000 c\hfill d}
\copy0
\unhbox0
\bye
第一行没有缩进,因为\copy0
不是水平命令,所以框被附加到主垂直列表中。之后,框被取消装箱,因此粘合节点和惩罚节点将产生影响。
尝试\it
在前面添加\unhbox0
:字体不会改变。
然而,
\newcount\foo
\foo=1000
\setbox0=\hbox{a\foo=100 b}
\unhbox0
之后存储在 中的值\foo
仍为 1000 \unhbox0
,因为赋值\foo=100
不会在正在构建的水平列表中产生节点(没有赋值会产生节点)。(本地)值 100 可用于构建框,但外部值将在组末尾恢复。
TeX 并不了解透明度。对盒子的影响是通过\special
命令和小东西实现的,设备驱动程序可以理解这些命令和小东西的作用(例如,包含在 中的 PDF 提取器pdftex
)。如果设备驱动程序能够修改存储的盒子,那么它也可以修改,但这超出了 TeX(程序)的范围。
答案2
框的内容(第 1 段)是固定的。从第 2 段可以看出,尝试重新格式化不会产生任何效果。但是,如果对该框应用 ,则可以通过格式化来操纵该框的内容(作为一个整体)\unhbox
(参见第 3 和第 4 段)。但是,内容本身无法更改,即使通过\unhbox
,因为这些\un...
命令不是可扩展的,而是 TeX 基元。也就是说,您不能应用\unhbox
然后恢复框中的各个标记。
编辑后添加了一个要点。字距调整和连字符在框边界处丢失,这是框是一个完整实体而不是标记集合的另一个指示。即使框未装箱,情况也是如此,如修订后的 MWE 所示。
\documentclass{article}
\usepackage{lipsum}
\parindent 0in
\parskip 1em
\begin{document}
\setbox0=\hbox{\lipsum[1]}
\copy0
\parbox{3in}{\copy0}
\parbox{3in}{\unhcopy0}
\parbox{4in}{\unhbox0}
\setbox0=\hbox{a}
T\unhbox0
Ta
\setbox0=\hbox{i}
f\unhbox0
fi
\end{document}
答案3
是的,盒子的外观在创建后可以改变。请考虑以下示例。
\documentclass{article}
\usepackage{xcolor}
\begin{document}
\color{red}%
%
\newbox\mybox%
\setbox\mybox\hbox{Hello, world!}%
\copy\mybox%
%
\color{blue}%
\copy\mybox%
\end{document}
生成以下 pdf:
当文档的默认颜色为红色时,该示例会创建一个框。然后,它将该框的一个副本插入到文档中。文本呈现为红色。然后,默认颜色更改为蓝色,并将同一框的另一个副本插入到文档中。这一次,文本呈现为蓝色。
要了解发生这种情况的原因,请在命令前添加以下几行\end{document}
:
\showboxbreadth=2147483647%
\showboxdepth=2147483647%
\showbox\mybox%
第三行将框的原始排版信息“转储”到日志文件,并导致编译停止并显示错误消息。前两行设置参数,以\showbox
确定转储应包含的细节级别。通过分配 TeX 可以处理的最高整数,我们表明我们希望获得最大程度的细节。
现在可以在日志文件末尾附近找到结果转储:
\hbox(6.94444+1.94444)x55.58344
.\OT1/cmr/m/n/10 H
.\OT1/cmr/m/n/10 e
.\OT1/cmr/m/n/10 l
.\OT1/cmr/m/n/10 l
.\OT1/cmr/m/n/10 o
.\OT1/cmr/m/n/10 ,
.\glue 3.33333 plus 2.08331 minus 0.88889
.\OT1/cmr/m/n/10 w
.\kern-0.27779
.\OT1/cmr/m/n/10 o
.\OT1/cmr/m/n/10 r
.\OT1/cmr/m/n/10 l
.\OT1/cmr/m/n/10 d
.\OT1/cmr/m/n/10 !
需要注意的重要一点是,转储不包含颜色信息。这意味着文本颜色将从 pdf 查看器呈现框内容时的 pdf 文档的图形状态推断出来。图形状态的这一方面可以通过命令设置\color
。
如果你通过在框内包含颜色规范来改变上面的例子:
\setbox\mybox\hbox{\color{red}Hello, world!}
颜色信息将包含在框发出的原始排版指令中:
\hbox(6.94444+1.94444)x55.58344
.\pdfcolorstack 0 push {1 0 0 rg 1 0 0 RG}
.\OT1/cmr/m/n/10 H
.\OT1/cmr/m/n/10 e
.\OT1/cmr/m/n/10 l
.\OT1/cmr/m/n/10 l
.\OT1/cmr/m/n/10 o
.\OT1/cmr/m/n/10 ,
.\glue 3.33333 plus 2.08331 minus 0.88889
.\OT1/cmr/m/n/10 w
.\kern-0.27779
.\OT1/cmr/m/n/10 o
.\OT1/cmr/m/n/10 r
.\OT1/cmr/m/n/10 l
.\OT1/cmr/m/n/10 d
.\OT1/cmr/m/n/10 !
因此框的文本颜色不会受到默认文档颜色的影响:
话虽如此,正如 egreg 和 Steven B. Segletes 指出的那样,框发出的原始排版指令基本上在框创建时就已固定。此外,这些指令始终以文字形式编写;它们永远不会引用宏、寄存器、变量或任何其他值可能发生变化的 TeX 元素。