\@gobble
例如,您可以使用来限制宏的使用,如:
\documentclass{article}
\makeatletter
\newcommand*{\cmd}[1]{%
\textbf{#1}
\let\cmd\@gobble
}
\makeatother
\begin{document}
\cmd{Hello World!}
\cmd{Again...}%not desirable
\end{document}
但是,如果你有一个带有可选参数的命令,例如\newcommand{\cmd}[2][]{#1 #2}
,没有内核宏可以帮助你。当然,你可以定义类似
\newcommand{\@gobble@opt}[2][]{}
%\newcommand{\RG@gobble@opt}[2][]{}%alt: to avoid possible name clashes
这是通常的做法吗?一般来说,这样狼吞虎咽是不是太荒唐了?
答案1
\usepackage{letltxmacro}
\makeatletter
\newcommand*{\gobblemyopt}[2][]{\@bsphack\@esphack}
\makeatother
\newcommand*{\cmd}[2][]{%
#1 #2%
\GlobalLetLtxMacro\cmd\gobblemyopt
}
我有另一个解决方案,更简单并且不需要使用包:
\let\cmdnotyetrun=\iftrue
\newcommand*{\cmd}[2][]{\cmdnotyetrun%
#1#2%
\global\let\cmdnotyetrun=\iffalse\fi}%