下面的源代码编译成功
\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
显然,Bob
和David
不会被评估为宏的参数\Hello
,这表明隐式字符\lbrace
和\rbrace
不能作为组工作,即使它们分别被允许用于 begingroup{
和 endgroup }
。此外,请注意,\hello\lbrace Bob
由于没有匹配,因此形式上不平衡\rbrace
,但我不明白为什么它确实可以正常工作并且没有错误,尽管结果与我最初的预期不同。
我认为 TeX 会将诸如\lbrace
和 之类的控制序列吸收\rbrace
到标记列表中,并且当 TeX 发现它们无用时,TeX 会将它们从列表中丢弃。这是真的吗?
答案1
您不能使用\lbrace
and\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