带有和不带有 = 的 let 语法

带有和不带有 = 的 let 语法

在阅读文档时endnotes我发现了以下一行:

\let\footnote=\endnote

到目前为止,我写作时总是\let不带=,所以我会写

\let\footnote\endnote

这两种方法似乎都达到了相同的效果。那么使用有什么区别吗?=如果有,区别是什么?

答案1

语法\let

\let<control sequence><equals><one optional space><token>

因此解析时会消耗 = 和空格。这只有在你想让某个东西等于=或空格时才会产生影响,而你必须使用

\let\foo==

因为第一个=被丢弃

<equals>这是教科书语法,用于任意数量的可选空格,后面可选跟一个=

latex 格式有以下行将\let命令名称定义为空格标记

\def\:{\let\@sptoken= } \:  % this makes \@sptoken a space token

请注意,\:␣扩展为\let\@sptoken=␣␣并且 = 和一个可选项被丢弃,因此\@sptoken让 为

如果你刚刚去过

\let\@sptoken=  %

那么这两个会像往常一样被标记为一个空格,因此\let会将它们作为可选空格丢弃。

在此讨论中使用可见的方式表示空间)

答案2

=可选的,但有些地方需要明确使用它。

假设你想实现如下语法\bold{text in bold}。如果你看看这个Arsenau、Chen 和 Eijkhout 在 TUGboat 上发表的诙谐文章你会找到

在此处输入图片描述

让我们看看向导和大师的解决方案。两者都想删除括号,但如果用户说 ,第一个解决方案就会失败\bold x。使用大师解决方案不会发生这种情况,因为{是语法所必需的。

更一般地,当一个人想用这个\let\next技巧移除一个标记时,等号和空格是强制的。 考虑

\def\removeA{\let\next}
\def\removeB{\let\next=}
\def\removeC{\let\next= }

并尝试一下:

\removeA =xyz \show\next
\removeB =xyz \show\next
\removeC =xyz \show\next

在第一种情况下\next将是the character x,而不是紧跟在宏后面的标记。\removeB和之间有什么区别\removeC? 试试

\expandafter\removeA\space xyz \show\next
\expandafter\removeB\space xyz \show\next
\expandafter\removeC\space xyz \show\next

现在只有后者才\next成为blank space

请注意,最有可能的是,\removeC它将作为另一个命令定义中的尾随标记出现,该命令可能会吸收一个参数,因此即使不诉诸上述强制技巧,也可以找到空格标记。

相关内容