TeX 框关闭后,其外观会改变吗?

TeX 框关闭后,其外观会改变吗?

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 元素。

相关内容