4

我正在尝试创建一个带有两个参数的 LaTeX 命令,其中一个是可选的。通常我会这样做

\newcommand{\whatever}[2][default]{first #1 second #2}

其中default是第一个参数的默认值。但是对于这个命令,我希望将第二个参数的值用作第一个参数的默认值——也就是说,我想要

\whatever{blah}
\whatever{foo}
\whatever[lol]{rofl}

相当于

\whatever[blah]{blah}
\whatever[foo]{foo}
\whatever[lol]{rofl}

有谁知道如何做到这一点?如有必要,我可以下拉到纯 TeX。

4

3 回答 3

6

LaTeX 内核有一个内置的方法可以做到这一点,尽管它没有被广泛使用。这是一个例子:

\makeatletter
\newcommand\@foo[2][]{[1: #1, 2: #2.] }
\newcommand\foo{\@dblarg\@foo}
\makeatother

\foo{same}
\foo[hello]{world}

显然,如果您在or文件中\makeatletter执行此操作,则可以删除命令。.sty.cls

于 2009-04-01T21:40:13.267 回答
2

一个丑陋的黑客:

\usepackage{ifthen}

...

\newcommand{\whatever}[2][uniquenonesense]{
   ... 
   \ifthenelse{\equal{#2}{uniquenonesense}}{#1}{#2}
   ...
}

大概你想要更干净的东西,但这就是我所拥有的。

根据您的语义,uniquenonesense可能为空。

于 2009-04-01T20:26:13.380 回答
0
    \newcommand{\haha}[2]{\backslash whatever \left[ #1 \right] 
    \left[   #1     \right] }

    \begin{document}
    $\haha{blah}{blah}$\\
    $\haha{stupid}{Idiot}$
    \end{document} % This works very well.
于 2016-11-05T10:54:42.707 回答