我到处读书(例如https://en.wikibooks.org/wiki/TeX/let)\let
将一个命令的内容复制到一个新命令中。
我的问题是,为什么我们期望\let\comdwithtwoargs\@gobble
\comdwithtwoargs 有一个参数?
\makeatletter
\newcommand{\cmd}[3]{%
#1 #2 #3
\let\cmd\@gobble
}
\makeatother
\cmd{abcdef} \cmd{abc}
在上面的例子中,如果我删除 ,代码将无法运行。我不明白和\let\cmd\@gobble
的效果以及它们如何工作。\let
\@gobble
答案1
在评论中已经解释了发生了什么,所以让我借此机会展示 tex 如何显示它正在做什么、打开什么\tracinngmacros
(\tracingonline
因此它记录在终端上而不仅仅是在日志中)
\documentclass{article}
\begin{document}
aaa % just to get font setup out of the way
{
\tracingonline=1
\tracingmacros=1
\makeatletter
\newcommand{\cmd}[3]{%
#1 #2 #3
\let\cmd\@gobble
}
\makeatother
\cmd{abcdef} \cmd{abc}
}
\end{document}
产生终端输出
\cmd #1#2#3->#1 #2 #3 \let \cmd \@gobble
#1<-abcdef
#2<-\cmd
#3<-abc
\cmd #1#2#3->#1 #2 #3 \let \cmd \@gobble
#1<-a
#2<-b
#3<-c
因此,在第一次调用中,\cmd
三个参数是abcdef
,\cmd
和abc
因此 abcdef 被排版然后#2
#3
是\cmd abc
因此 tex 然后记录第二次调用,\cmd
这一次三个参数是a
,b
因此c
它排版a b c
然后定义\cmd
为\@gobble
(两次)但是重新定义的\cmd
从未被调用。