![什么是它们:它们在实践中何时使用?](https://linux22.com/image/245443/%E4%BB%80%E4%B9%88%E6%98%AF%E5%AE%83%E4%BB%AC%EF%BC%9A%E5%AE%83%E4%BB%AC%E5%9C%A8%E5%AE%9E%E8%B7%B5%E4%B8%AD%E4%BD%95%E6%97%B6%E4%BD%BF%E7%94%A8%EF%BC%9F.png)
这个问题是在围绕问题的讨论中提出的如何用相同大小的空块替换大块文本?,它基本上要求 的 vmode 模拟\phantom
。因此,我的问题仅关注垂直模式。
一种方法是将要隐藏的材料收集到一个垂直框中,然后剖析垂直框,用相同大小但没有内容的框替换每个有内容的框。TeX 为我们提供的唯一工具是\lastskip
和\unskip
用于跳过,\lastkern
和\unkern
用于字距,\lastpenalty
和\unpenalty
用于惩罚,以及\lastbox
(如\setbox0\lastbox
)用于框。特别是,没有办法删除由\write
、和产生的任何东西\special
。
- 哪些基元会产生 whatsits 节点?它们何时在真实文档中使用(在垂直模式下)?颜色变化?TikZ 绘图?
- (额外奖励)除了 skips、kerns、penalties、boxes 和 whatsits 之外,vmode 中还有其他类型的节点吗?哪些原语可以生成这些节点?它们在实践中何时出现?
答案1
是否恰当地命名是一个见仁见智的问题,因为我认为如果它们被称为;whatsits
它们会更适合 TeX 的语义 ,表示执行被延迟的命令或与特定设备或系统相关的特殊命令,并且不是 TeX 正常处理流程的一部分。afterallnodes
whatsits
研究 Knuth 引入它们的理由是很有趣的。会议1996 年 3 月 13 日与 NTG 成员会面 Knuth 在回答一个问题时说:
我试图使程序具有逻辑结构,并且易于添加新功能。但这种情况并没有像我想象的那么频繁,因为我认为人们对其所做工作的可互换性更感兴趣;一旦你有了自己的程序,其他人就没有了。不过,如果我是一家大型出版商,并且要接手特殊项目——百科全书、新版圣经之类的东西——我肯定会认为正确的做法是聘请一名优秀的程序员,并专门为该项目开发一个特殊的计算机系统。至少,这是我对人们这样做方式的看法。似乎这种情况很少发生,尽管我在布尔诺遇到了一名学生,他通过更改代码直接在 TeX 中生成 Acrobat 格式。而您提到的 Omega 系统,有 150,000 行更改文件 [笑声]。
我内置了钩子,这样每次 TeX 输出页面时,它都会到达 whatsit 节点,而 whatsit 节点在每个 TeX 版本中可能都完全不同。因此,当程序看到 whatsit 节点时,它会调用一个特殊例程,说“我如何排版这个 whatsit 节点?”它会查看子类型,子类型可能是作为演示放入的另一个子类型,也可能是一个全新的子类型。
可以whatsit
出现在水平或垂直列表中,没有维度。它表示应该延迟的操作,因为它不符合其普通方案。段落构建器和页面构建器扫描提交给它们的列表并执行某些类型的whatsit
。它们在与特定实现相关联时很有用。
更常见的whatsits
是与主垂直列表相关的:
(A)延时写入生成\write
。延迟的标记列表\write
是不是写出直到 a 周围的材料\write
进入\shipout
执行 a 的输出例程。因此,写入标记列表必须存储在主垂直列表中。
(二)特价商品使用该\special
命令。特殊命令的令牌列表与主垂直列表一起存储,因为令牌列表需要写入 dvi 文件。这种情况发生,就像在 shipout 时写入的情况一样。
实际实现可以在 postcript、pdf、颜色驱动程序和图形程序中找到。hyperref 手册总是值得一读。该包\specials
广泛用于实现 TeX 命令和 PDF 页面描述语言之间的接口。它们编写起来非常简单:
\immediate\special{!pdfpagelabels #2}%
总结一下,它是一个对所有钩子/接口都免费的钩子/接口。为什么叫这个名字 whatsit
——我猜是 Knuth (ala \fi
) whatisit
。这个简单无害的special
命令使 TeX 得以生存和适应多年,产生了从postcript
到的输出PDF
,并引入了颜色和图形。
答案2
我whatsit
经常使用节点来处理与 PDF 有关的所有事情。例如,我不使用 hyperref 包,而是自己做所有事情,因此需要一个 whatsit 来处理链接、颜色和规则。例如,请参阅我的 LuaTeX wiki 文章不使用 TeX\TeX
。
答案3
还有插入内容,请参阅此纯文本的日志:
编辑:并标记:添加\mark{foo}
到下面的测试
\tracingonline1000
\showboxbreadth=100
\showboxdepth=1
\setbox2=\hbox{b}
\setbox0=\vbox{
a
\write-1{hello}
$$b$$
\special{foo}
\topinsert
aa
\endinsert
c}
\showbox0
\bye
(./wh.tex
> \box0=
\vbox(47.30554+0.0)x469.75499
.\hbox(4.30554+0.0)x469.75499, glue set 444.75497fil []
.\write-{hello}
.\glue(\parskip) 0.0 plus 1.0
.\glue(\baselineskip) 12.0
.\hbox(0.0+0.0)x469.75499, glue set 449.75499fil []
.\penalty 10000
.\glue(\abovedisplayshortskip) 0.0 plus 3.0
.\glue(\baselineskip) 5.05556
.\hbox(6.94444+0.0)x4.29166, shifted 232.73167 []
.\penalty 0
.\glue(\belowdisplayshortskip) 7.0 plus 3.0 minus 4.0
.\special{foo}
.\insert253, natural size 16.30554; split(0.0,16383.99998); float cost 0 []
.\glue(\parskip) 0.0 plus 1.0
.\glue(\baselineskip) 7.69446
.\hbox(4.30554+0.0)x469.75499, glue set 445.31055fil []
! OK.
l.20 \showbox0