在 TeX Book 的附录 B 中,我读到
\def\obeyspaces{\catcode`\ =\active}
{\obeyspaces\global\let =\space}
{%
\catcode`\^^M=\active % these lines must end with ‘%’
\gdef\obeylines{\catcode`\^^M=\active \let^^M=\par}%
\global\let^^M=\par % this is in case ^^M appears in a \write
}
\obeylines 宏表示“\let^^M=\par”而不是“\def^^M{\par}”,因为 \let 技术允许诸如“\let\par=\cr \obeylines \halign{...}”之类的构造,其中在对齐中不需要给出 \cr。
但我不明白该评论中建议的观点。有人能帮我吗?
答案1
出于(某些)目的,基元\halign
需要直接“看到”结束对齐单元格的&
和\cr
标记。您可以在 LaTeX 中看到这种效果,其中一些抓取单元格内容的软件包在最后一列中效果不佳,最后一列以 结尾\\
(其定义中是一个宏\cr
),而其他列则&
直接以 结尾。
通过如上所述使用\let
,最终结果是 TeX 在行尾放置一个具有\cr
csname 含义的活动字符,而不是一个具有扩展为 的宏含义的活动字符\cr
。
下面的示例产生了两种对齐,但是如果您更改\iffalse
为\iftrue
使用建议的定义进行第三次尝试,\def
而不是\let
使用,则会失败。
\def\test#1{[#1]}
\halign{\hfil\test{#}\cr
aaa\cr
bb\cr
c\cr}
{\let\par\cr\obeylines%
\halign{\hfil\test{#}
aaa
bb
c
}}%
\iffalse % this doesn't work
{%
\catcode`\^^M=\active % these lines must end with ‘%’
\gdef\obeylines{\catcode`\^^M=\active \def^^M{\par}}%
\global\def^^M{\par}% this is in case ^^M appears in a \write
}
{\let\par\cr\obeylines%
\halign{\hfil\test{#}
aaa
bb
c
}}%
\fi
\bye