我想定义一个宏,根据给定的(可选)参数数量执行不同的操作。这可能吗?怎么做?
\documentclass{standalone}
\usepackage{xparse}
\DeclareDocumentCommand{\MyCommand}{ g g g }{
% if 1 parameter
thing for 1 parameter #1
% else if 2 parameters
thing for 2 parameters #1 #2
% else if 3 parameters
thing for 3 parameters #1 #2 #3
}
\begin{document}
\MyCommand{one}
\MyCommand{one}{two}
\MyCommand{one}{two}{three}
\end{document}
答案1
简短的回答是是的.可以\IfNoValueTF
当作开关使用。
可能最好使用o
而不是g
。
我认为使用 的代码实际上更简洁\ExplSyntaxOn
。有些人可能会说更容易阅读(%
阅读起来并不那么令人分心)---其他人可能不这么认为。;)
\ExplSyntaxOn
您将必须使用它~
来留出空间。
\documentclass{article}
\usepackage{xparse}
\pagestyle{empty}
\ExplSyntaxOn
\NewDocumentCommand{\testing}{ ooo }
{
\IfNoValueTF {#1} { \texttt{Hello ~ World} }{
\IfNoValueTF {#2} { \textit{#1} }{
\IfNoValueTF {#3} { \textbf{#1}:\textsf{#2} }
{ \textbf{#3}:\textit{#2}:\textsf{#1} }
}}
}
\ExplSyntaxOff
\begin{document}
\testing[One][Two][Three]
\testing[One][Two]
\testing[One]
\testing
\end{document}
LaTeX3 解决方案
\documentclass{article}
\usepackage{xparse}
\pagestyle{empty}
\ExplSyntaxOn
\int_new:N \g__my_options_count_int
\int_gset:Nn \g__my_options_count_int {3}
\NewDocumentCommand{\testing}{ ooo }
{
\IfNoValueT {#3}{ \int_gdecr:N \g__my_options_count_int }
\IfNoValueT {#2}{ \int_gdecr:N \g__my_options_count_int }
\IfNoValueT {#1}{ \int_gdecr:N \g__my_options_count_int }
\int_case:nnn { \g__my_options_count_int }
{
{ 3 }{\textbf{#3}:\textit{#2}:\textsf{#1}}
{ 2 }{\textbf{#1}:\textsf{#2}}
{ 1 }{\textit{#1}}
}{
\texttt{Hello ~ World}
}
\int_gset:Nn \g__my_options_count_int {3}
}
\ExplSyntaxOff
\begin{document}
\testing[One][Two][Three]
\testing[One][Two]
\testing[One]
\testing
\end{document}