![更新](https://linux22.com/image/366742/%E6%9B%B4%E6%96%B0.png)
如何为带有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 列表(即Vn
或V
在示例中)吗?
更新(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
只列出条件原始定义中存在的后缀。