\lastskip 和 \ifdim 如何工作?

\lastskip 和 \ifdim 如何工作?

我以为我知道这个问题的答案,但我无法理解以下纯 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,但继续扩展以寻找plusminus。因此,赋值只能在第一行遇到 时进行l,此时\ifdim结果已经确定。

相关内容