当 TeX 发现隐式字符无用时,是否会将其从标记列表中默默丢弃?

当 TeX 发现隐式字符无用时,是否会将其从标记列表中默默丢弃?

下面的源代码编译成功

\documentclass{article}
\begin{document}

\let\lbrace={ 
\let\rbrace=}

\def\hello#1{[Hello, #1!]}

\hello{Amy}

\hello\lbrace Bob

\def\hellol{\hello\lbrace}
\def\hellor{\rbrace}

\hellol David \hellor

\end{document}

输出如下:

[Hello, Amy!]
[Hello, !]Bob
[Hello, !]David

显然,BobDavid不会被评估为宏的参数\Hello,这表明隐式字符\lbrace\rbrace不能作为组工作,即使它们分别被允许用于 begingroup{和 endgroup }。此外,请注意,\hello\lbrace Bob由于没有匹配,因此形式上不平衡\rbrace,但我不明白为什么它确实可以正常工作并且没有错误,尽管结果与我最初的预期不同。

我认为 TeX 会将诸如\lbrace和 之类的控制序列吸收\rbrace到标记列表中,并且当 TeX 发现它们无用时,TeX 会将它们从列表中丢弃。这是真的吗?

答案1

您不能使用\lbraceand\rbrace来界定宏的参数。但它们可用于分组(这是与宏参数不同的概念)。没有“丢弃”。

如果你

\def\foo#1{X#1X}

并调用

\foo\lbrace a\rbrace

TeX 将采用\lbrace#1替换

X\lbrace Xa\rbrace

这是一个完整的纯 TeX 示例,其中我使用了\bgroup和,\egroup它们的格式如下:

\let\bgroup={ \let\egroup=}

\lbrace所以它们和你的相同\rbrace(顺便说一句,你正在重新定义现有的宏)。

\def\foo#1{X#1X}

\foo\bgroup a\egroup b

\foo\bgroup \it a\egroup b

\bye

在此处输入图片描述

你看,按照我一开始写的那样,那只是被限制在了宏扩展的结果\it组里面。\bgroup \it a\egroup

相关内容