如何使用 \newcommand 指定可选的最终参数?

如何使用 \newcommand 指定可选的最终参数?

我正在编写我的第一个包,并试图弄清楚如何创建一个带有可选最终参数的新命令。在这种情况下,如果省略参数,则默认为空白。这是有问题的,因为它假设在这种情况下传递的两个参数是#2#3

\newcommand{\sfsx}[3][]{\wrapper{#1}{#2}{#3}}

不幸的是,我希望反过来,如果只给出两个参数,则假定它们是#1#2。有没有一种简单的方法可以做到这一点而不调用其他包?

\wrapper在这种情况下,它只是另一个根据包选项而呈现各种形式的命令)。

答案1

尝试新的xparse包,它建立在 LaTeX3 之上。使用此包,您可以指定强制参数和可选参数的任意组合。这种情况很简单,

\DeclareDocumentCommand \sfsx { m m o } { \wrapper{#1}{#2}{#3} }

如果您想要拥有自己的默认值,请使用O{value}而不是o

答案2

这不能\newcommand直接使用。一种方法是读取第一个强制参数,将它们存储在临时宏中,然后调用另一个只有一个可选参数的宏,并从临时宏中读取其他参数。更简单的方法是使用xparse允许在任何位置使用多个可选参数的包(参见 Andrey 的回答)。

\documentclass{article}

\makeatletter
\newcommand{\sfsx}[2]{%
    \def\sfsx@args{{#1}{#2}}%
    \sfsx@
}
\newcommand{\sfsx@}[1][]{%
    \expandafter\wrapper\sfsx@args{#1}%
}
\makeatletter

\newcommand{\wrapper}[3]{%
    I got (#1), (#2) and (#3).
}

\begin{document}

\sfsx{A}{B}

\sfsx{A}{B}[C]

\end{document}

\@testopt如果直接使用 LaTeX 用来测试可选参数的内部宏,则可以提高效率:

\documentclass{article}

\makeatletter
\newcommand{\sfsx}[2]{%
    \@testopt{\sfsx@{#1}{#2}}{}%
}
\def\sfsx@#1#2[#3]{%
    \wrapper{#1}{#2}{#3}%
}
\makeatletter

\newcommand{\wrapper}[3]{%
    I got (#1), (#2) and (#3).
}

\begin{document}

\sfsx{A}{B}

\sfsx{A}{B}[C]

\end{document}

相关内容