当声明一个带有多个可选参数的新命令时,例如
\NewDocumentCommand{\mycmd}{ o o o }{}
#2
一个是隐式排除了在没有 的情况下传递 值的选项#1
,即\mycmd[][2]
会失败\IfNoValueT{#1}
。这可以通过使用来补救\tl_if_blank:nTF
,请参阅\IfNoValueTF - 如果参数没有值(有括号但不存在),如何强制“无值”。然而,有时这不是一个选择(在我的特殊情况下,xparse
支持tcolorbox
仅限于检查-NoValue-
)。
除其他事项外,这让我想将一些命令(或在我的例子中是tcolorbox
es)重新编程为键值系统。我的方法是为原始命令提供\mycmd
额外的强制参数,这些参数将保持为空,以确保任何空或非空可选参数的组合都是可能的。例如,\mycmd
上面的 Eg 将设置为
\NewDocumentCommand{\mycmd}{ o m o m o }{}
使用此版本,我可以将值传递给我的三个“真实”参数(可选参数)中的任何一个,而不需要任何其他参数,同时还可以调用\IfValueTF
其中任何一个。
接下来,我为每个可选参数定义键,例如
\keys_define:nn { mykeys } {
a .tl_set:N = \l_mykeys_a_tl,
b .tl_set:N = \l_mykeys_b_tl,
c .tl_set:N = \l_mykeys_c_tl
}
最后,我定义一个包装命令
\NewDocumentCommand{\wrapper}{ O{} }{
\keys_set:nn{mykeys}{#1}
\mycmd
\tl_if_empty:NTF \l_mykeys_a_tl {} { [\l_mykeys_a_tl] }
{}
\tl_if_empty:NTF \l_mykeys_b_tl {} { [\l_mykeys_b_tl] }
{}
\tl_if_empty:NTF \l_mykeys_c_tl {} { [\l_mykeys_c_tl] }
}
目的是使 eg\wrapper[a=13, c=2]
等同于\mycmd[13]{}{}[2]
。
最后这一点是我的方法完全失败的地方。我尝试使用\exp_not:n
或\use:n
,解释如下LaTeX3 接口,但无济于事。因此,任何帮助或指导都将不胜感激。谢谢!
完整 MWE:
\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{\mycmd}{ o m o m o }{
First ``real'' argument is \IfValueTF{#1}{#1}{not provided}.\par
Second ``real'' argument is \IfValueTF{#3}{#3}{not provided}.\par
Third ``real'' argument is \IfValueTF{#5}{#5}{not provided}.\par
}
\ExplSyntaxOn
\keys_define:nn { mykeys } {
a .tl_set:N = \l_mykeys_a_tl,
b .tl_set:N = \l_mykeys_b_tl,
c .tl_set:N = \l_mykeys_c_tl
}
\NewDocumentCommand{\wrapper}{ O{} }{
\keys_set:nn{mykeys}{#1}
\mycmd
\tl_if_empty:NTF \l_mykeys_a_tl {} { [\l_mykeys_a_tl] }
{}
\tl_if_empty:NTF \l_mykeys_b_tl {} { [\l_mykeys_b_tl] }
{}
\tl_if_empty:NTF \l_mykeys_c_tl {} { [\l_mykeys_c_tl] }
}
\ExplSyntaxOff
\begin{document}
\mycmd[13]{}{}[2]
\noindent\hrulefill
\wrapper[a=13, c=2]
\end{document}