我拥有的
\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分隔{}
。