D. Knuth 评论中的 \let 和 \def 微分 (纯 TeX)

D. Knuth 评论中的 \let 和 \def 微分 (纯 TeX)

在 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 在行尾放置一个具有\crcsname 含义的活动字符,而不是一个具有扩展为 的宏含义的活动字符\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

相关内容