有些空格似乎被\halign
原语忽略了。例如,
\setbox0=\vbox{\halign{ # \cr \space b \cr}}
\showbox0
表示 之前没有粘连b
,但 之后有两个空格。似乎前言中的空格在读取时会立即丢失,但我不能确定。
哪些空格(隐式空格、有趣的空格、扩展到空格的宏、其他空格)在哪里丢失了
\halign
?
答案1
我不知道隐式空格,但在&
或之后\cr
,标记会被扩展(寻找\omit
或\noalign
),直到找到不可扩展的标记。在两种情况下都会忽略空格。
答案2
当读取 的每一列前言的“u”部分\halign
(即将插入到单元格内容之前的部分)时,TeX 会忽略任何前导“间隔符”。在此上下文中,“间隔符”定义为类别代码为 10 的任何隐式或显式字符标记。@<Scan the template \<u_j>...@>=
对于了解 Pascal 代码的人,请参阅 tex.web。
在每个单元格的开头,即每个&
或\cr
(或\crcr
)之后,TeX 会完全展开标记并忽略“间隔符”。这是通过@<Get the next non-blank non-call token@>
在任何调用 之前调用 来完成的init_col
。
测试表明确实会忽略任意隐式空间标记:
% Define \sp as an implicit space token "q".
\lccode` =`q\def\\{\let\sp= }\lowercase{\\ }
% Store an \halign in a box. The \sp in the u-part
% preamble is completely ignored, directly when TeX
% stores the preamble. To prove this, we redefine
% \sp globally, and see that it doesn't appear at
% the next line.
%
\setbox0=\vbox{\halign{
\sp x # \cr
\sp \space A\gdef\sp{!} \cr
\space B \cr
}}
% Show the box. Leading spaces have all been ignored.
% Not trailing spaces.
\tracingall\showbox0