在我的包中,有很多与语言相关的命令,它们被命名为..._ \languagename :n
。在某些情况下,它需要命令接收参数的值,为此需要:V
或形式。:x
通常我可以执行\exp_args:NV
或\exp_args:Nx
,但这里由于命令名称中有一个动态部分\languagename
,我必须使用类似于 的\cs_if_exist_use:cTF
命令,并且我不清楚\exp_args
在这种情况下我是否仍然可以使用。 有没有办法\exp_args
与:c
说明符一起使用?
答案1
我猜你指的是crefthe.sty
。让我们看看你对\exp_args:...
第一个例子
\exp_args:Nx \str_case:nn \l__crefthe_prep_mode_tl
{
{ - } { \tl_gset:Nn \g__crefthe_prep_once_tl { #4 } }
{ + } { \tl_gset:Nn \g__crefthe_prep_each_tl { #4 } }
}
是错误的,应该\str_case:Vn \l__crefthe_prep_mode_tl
第二个例子
\exp_args:Nnx \str_case_e:nnF { #1~\text_lowercase:n{ #2 } }
{
\tl_use:c { crefthe_contraction_rule_ \languagename _tl }
}
{ #1~\text_lowercase:n{ #2 } }
首先,\text_lowercase:n
实际上应该是\str_foldcase:n
,而你更希望
\prg_generate_conditional_variant:Nnn \str_case_e:nn { nv } { p, T, F, TF }
有空,\str_case_e:nvF
这样你就可以做
\str_case_e:nvF { #1~\str_foldcase:n{ #2 } }
{ g_crefthe_contraction_rule_ \languagename _tl }
{ #1~\str_foldcase:n{ #2 } }
参数v
类型代表V
:c
变量N
名称将从 csname 构造,然后V
应用于它。
请注意,我已将变量名称更改为具有前缀g_
;事实上你确实
\tl_gset:Nn \crefthe_contraction_rule_french_tl
{
{ à~le } { au }
{ à~les } { aux }
{ de~le } { du }
{ de~les } { des }
{ À~le } { Au }
{ À~les } { Aux }
{ De~le } { Du }
{ De~les } { Des }
}
但它应该是
\tl_gset:Nn \g_crefthe_contraction_rule_french_tl
{
{ à~le } { au }
{ à~les } { aux }
{ de~le } { du }
{ de~les } { des }
{ À~le } { Au }
{ À~les } { Aux }
{ De~le } { Du }
{ De~les } { Des }
}
其他变量也类似。