\hfil
和之间有什么区别\hskip0cm plus 1fil
?在这两种情况下,都会创建一个跳过零但可拉伸性为 1fil 的胶水标记。如果使用\hbox spread 4cm{\hfil test \hskip0cm plus 1fil}
,您将得到一个水平盒子,中间有“test”,两边有 2cm 的空白空间(表明两个胶水共享空间)。在我测试的所有情况下,这两个完全相同(包括类似\hfil
和\hfill
的变体\vfil
)。
两者之间有什么区别?如果没有区别,为什么是\hfil
原语而不是宏\hskip0cm plus 1fil
?\hfil
总是可以与互换吗\hskip0cm plus 1fil
?
答案1
\hfil
并\hskip0cm plus 1fil
制作相同的胶水物品,以便测试(例如您的盒子示例)将以相同的方式相同,\hskip0cm plus 1fil
与相同\hskip 0 pt plus 1fil
,但它们作为标记和扫描方式不同。
当然值得注意的是,
\def\zzA{\hfil}
和
\def\zzB{\hskip0cm plus 1fil}
然后
\zzA look and \zzB look
表现出不同的行为,之后也类似
\def\gobble#1{}
\expandafter\gobble\zzA and \expandafter\gobble\ZZB
答案2
\hfil
插入的粘连与 插入的粘连完全相同\hskip 0pt plus 1fil
。唯一的区别是:
\hfil
是原语,因此它不必扫描输入文本以查找粘合规范,- 换句话说,
\hskip 0pt plus 1fil
做涉及扫描输入以查找胶水规范,这可能会导致有趣的差异,具体取决于之后的内容1fil
。
参见大卫卡莱尔(David Carlisle)的回答中的巧妙例子,或者甚至只是\hfil minus forty
对比\hskip 0pt plus 1fil minus forty
。
为什么\hfil
exist 是原语?由于 TeX 是现存最有文档记录的程序之一,我们实际上可以查找它。如果您调用texdoc errorlog
(或在线阅读),你会看到 1979 年 7 月 23 日的这条记录:
“E”表示为了“效率”而做出的改变。
在旧的(TeXbook 之前,以及 TeX78 的)TeX 手册中,该手册于 1979 年作为“TeX 和 METAFONT:排版的新方向”的一部分发布,在附录 X:TeX 的最新扩展(本书“TeX”部分第 201 页)中,它说:
新的控制序列
\hfil
、\hfilneg
、分别是、、\hss
的缩写,它们占用的 TeX 内存空间更少。垂直类似物为、和。\hskip 0pt plus 100000pt
\hskip 0pt plus -100000pt
\hskip plus 100000pt minus 100000pt
\vfil
\vfilneg
\vss
(那时, “无穷大”的fil
/ fill
/filll
单位和阶还不存在;那些是后来出现的:参见 1981 年 8 月 7 日的条目errorlog
。)
为了确认它\hfil
确实做了同样的事情,我们可以查看 TeX 程序源代码(上面提到的第 1058 节附近)(texdoc tex
或在线阅读):
(不幸的是,除非您熟悉 TeX 程序的特殊约定,否则上述内容很难理解,但主要的一点是\hskip
和\hfil
调用相同的内部函数(过程)append_glue
,除非在\hfil
粘合规范是硬编码的情况下fil_glue
,并且在使用的情况下\hskip
进行扫描scan_glue
。)