宏:从参数到键,以及 Expl3:可选参数

宏:从参数到键,以及 Expl3:可选参数

当声明一个带有多个可选参数的新命令时,例如

\NewDocumentCommand{\mycmd}{ o o o }{}

#2一个是隐式排除了在没有 的情况下传递 值的选项#1,即\mycmd[][2]会失败\IfNoValueT{#1}。这可以通过使用来补救\tl_if_blank:nTF,请参阅\IfNoValueTF - 如果参数没有值(有括号但不存在),如何强制“无值”。然而,有时这不是一个选择(在我的特殊情况下,xparse支持tcolorbox仅限于检查-NoValue-)。

除其他事项外,这让我想将一些命令(或在我的例子中是tcolorboxes)重新编程为键值系统。我的方法是为原始命令提供\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}

MWE 的输出

相关内容