有没有办法将 \cs_if_exist_use 和 \exp_args 结合起来?

有没有办法将 \cs_if_exist_use 和 \exp_args 结合起来?

在我的包中,有很多与语言相关的命令,它们被命名为..._ \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类型代表Vc变量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 }
  }

其他变量也类似。

相关内容