更新

更新

如何为带有T/F参数的函数生成变体?

例如,我想使 的第一个参数为\tl_if_eq:nn(TF)V我应该写以下内容吗:

\cs_generate_variant:Nn \tl_if_eq:nnT  { VnT }
\cs_generate_variant:Nn \tl_if_eq:nnF  { VnF }
\cs_generate_variant:Nn \tl_if_eq:nnTF { VnTF }

或者只是

\cs_generate_variant:Nn \tl_if_eq:nn { Vn }

顺便问一下,如果我只需要更改第一个参数,我应该写下整个 arg-spec 列表(即VnV在示例中)吗?

更新(2017-12-21)

现在有一个新的功能\prg_generate_conditional_variant:Nnn可以l3candidate实现这一点:

\prg_generate_conditional_variant:Nnn \tl_if_eq:nn { V } { T, F, TF }

答案1

一般来说,第二个参数\cs_generate_variant:Nn只能列出直到最后一个必须改变的参数类型。

因此

\cs_generate_variant:Nn \tl_if_eq:nnT  { V }
\cs_generate_variant:Nn \tl_if_eq:nnT  { Vn }
\cs_generate_variant:Nn \tl_if_eq:nnT  { VnT }

都是等价的。同样,如果想将第二个参数改为,比如说,x等效声明将是

\cs_generate_variant:Nn \tl_if_eq:nnT  { nx }
\cs_generate_variant:Nn \tl_if_eq:nnT  { nxT }

对于尾随参数的情况(TF),应生成所有不同的函数:

\cs_generate_variant:Nn \tl_if_eq:nnT  { V }
\cs_generate_variant:Nn \tl_if_eq:nnF  { V }
\cs_generate_variant:Nn \tl_if_eq:nnTF { V }

更新

随着 2017-12-16expl3代码的发布,可以将上述内容简化为

\prg_generate_conditional_variant:Nnn \tl_if_eq:nn { V } { T, F, TF }

更一般地,这也可能是

\prg_new_conditional:Nnn \my_conditional_exp:nn { p, T, F, TF }

\prg_new_protected_conditional:Nnn \my__conditional_notexp:nn { T, F, TF }

:Npnn当然也可以使用这种形式)因此可以这样做

\prg_generate_conditional_variant:Nnn \my_conditional_exp:nn { V } { p, T, F, TF }

\prg_generate_conditional_variant:Nnn \my_conditional_notexp:nn { V } { T, F, TF }

第三个参数应该\prg_generate_conditional_variant:Nnn只列出条件原始定义中存在的后缀。

相关内容