如果缺少参数,函数调用应该改变结果(〜重载)

如果缺少参数,函数调用应该改变结果(〜重载)

我拥有的

\documentclass{article}
\usepackage{pdftexcmds}
\makeatletter
\newcommand\foo[2]{%
  \ifnum\pdf@strcmp{\unexpanded{#2}}{}=0 %
     \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
    {TRUE}
    {FALSE}%
}
\makeatother
\begin{document}

\foo{1}{}

\end{document}

当且仅当调用 \foo{someargument}{} 时,结果才为 True。我需要的是:当且仅当调用 \foo{someargument} 时,结果才为 True(因此有人省略了第二个参数)。最后,我将用两个不同的函数调用替换 True 和 False。

我怎样才能做到这一点?

答案1

你可以诱使 TeX 做类似的事情,但我强烈反对这样做。这不是常见的 (La)TeX 语法,从长远来看,它可能会导致比它解决的问题更多的问题。

\documentclass{article}

\usepackage{amsgen}% for \new@ifnextchar

\makeatletter
\newcommand\foo[1]{%
   \new@ifnextchar\bgroup{\fooB{#1}}{\fooA{#1}}%
}
\newcommand{\fooA}[1]{Only one: `#1'.}
\newcommand{\fooB}[2]{You've got two: `#1' and `#2'.}
\makeatother

\begin{document}

\foo{1}

\foo{a}{b}

However: \foo{a}{}

\foo{a} {\bfseries This shouldn't do any harm.}

\end{document}

在此处输入图片描述

答案2

如果声明带有参数的命令,则可以省略{}但不能省略参数。

在此处输入图片描述

\documentclass{article}
\usepackage{pdftexcmds}
\makeatletter
\newcommand\foo[2]{%
  \ifnum\pdf@strcmp{\detokenize{#2}}{\noexpand\par}=0 %
     \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
    {TRUE}
    {FALSE}%
}
\makeatother
\begin{document}

\foo{1}{2}

\foo34

\foo{1}

\end{document}

在这里的第三次调用中,第二个参数没有丢失,它是空白行,报告为\par

如果省略空行,第二个参数是,\end 那么 latex 将排版document并在*提示时等待您输入\end{document}以停止运行。

当然,您可以\end在宏中检测并返回\end到输入,但这样的输入{\foo{1}}总是会产生低级错误

! Argument of \foo has an extra }.

您可以通过不声明命令有两个参数来避免该问题,如另一个答案所示,但这会使您远离标准 LaTeX 语法,其中可选参数由[]not分隔{}

相关内容