\hfil 和 \hskip0cm 加 1fil 有什么区别?

\hfil 和 \hskip0cm 加 1fil 有什么区别?

\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


为什么\hfilexist 是原语?由于 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在线阅读):

1058 1060

(不幸的是,除非您熟悉 TeX 程序的特殊约定,否则上述内容很难理解,但主要的一点是\hskip\hfil调用相同的内部函数(过程)append_glue,除非在\hfil粘合规范是硬编码的情况下fil_glue,并且在使用的情况下\hskip进行扫描scan_glue。)

相关内容