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