在阅读文档时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
它将作为另一个命令定义中的尾随标记出现,该命令可能会吸收一个参数,因此即使不诉诸上述强制技巧,也可以找到空格标记。