我以为我知道这个问题的答案,但我无法理解以下纯 TeX 代码:
\noindent\hskip1pt\ifdim\lastskip=0pt lastskip was 0pt\fi\par
\noindent\hskip1pt\showthe\lastskip
\bye
在第一段(以 开头\noindent
)中,我跳过了1pt
,但对最后一个跳过的测试得出0pt
。在第二段中,\showthe
显示最后一个跳过是1.0pt
。这里发生了什么?
(我之所以问这个问题,是因为我试图回答morbusg 的问题。
答案1
\relax
这里缺少一个:\ifdim
是可扩展的,因此\hskip
会继续扩展以寻找一个plus
。现在,它没有找到一个,但测试结果已经确定(true
)前发生\hskip
。在第二行中,\showthe
是不可展开的,因此在执行\hskip
之前停止并插入跳过。\showthe
正如 Hendrik 在评论中指出的那样,TeX 会扩展以寻找任意维度的可选空间。因此
\newskip\mydim
\mydim4pt\ifdim\mydim=4pt\else \ARG\fi
\showthe\mydim
\bye
给出的结果与
\newskip\mydim
\mydim4pt \ifdim\mydim=4pt\else \ARG\fi
\showthe\mydim
\bye
如在后一种情况下,空间在测试之前终止分配\ifdim
。
\hskip
然而,跳过(橡胶长度),而不是尺寸。因此,除了固定长度外,它还有可选的拉伸和收缩组件。因此,将原始代码修改为
\noindent\hskip1pt \ifdim\lastskip=0pt lastskip was 0pt\fi\par
\noindent\hskip1pt \showthe\lastskip
\bye
做不是改变结果。TeX 找到了 的可选空间1pt
,但继续扩展以寻找plus
或minus
。因此,赋值只能在第一行遇到 时进行l
,此时\ifdim
结果已经确定。