\let 与 \@gobble 结合有何效果?

\let 与 \@gobble 结合有何效果?

我到处读书(例如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\cmdabc

因此 abcdef 被排版然后#2 #3\cmd abc因此 tex 然后记录第二次调用,\cmd这一次三个参数是ab因此c它排版a b c 然后定义\cmd\@gobble(两次)但是重新定义的\cmd从未被调用。

相关内容