\halign 到底忽略了哪些空格?

\halign 到底忽略了哪些空格?

有些空格似乎被\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

相关内容