expl3:部分扩展一个参数

expl3:部分扩展一个参数

我希望\crefname用动态字符串来分配。使用\exp_args_generate:n { xVV },我最终得到了如下结果:

\exp_args:NxVV \crefname {\__my_countername: }
                         {\csname my@cref@\__my_countername:\csname\languagename ABBR\endcsname @name\endcsname}
                         {\csname my@cref@\__my_countername:\csname\languagename ABBR\endcsname @name@plural\endcsname}

这里\__my_countername:是计数器的名称,例如theorem。是从字符串到 的\csname\languagename ABBR\endcsname转换。englishEN

但是,这会将参数扩展得太深,以至于字符串不再根据上下文动态变化。为了清楚起见,我希望将参数扩展为:

\crefname {theorem }
          {\csname my@cref@theorem\csname\languagename ABBR\endcsname @name\endcsname}
          {\csname my@cref@theorem\csname\languagename ABBR\endcsname @name@plural\endcsname}

也就是说,\__my_countername:在保持\csname\languagename ABBR\endcsname原样的情况下进行扩展,因为它应该从上下文中接收\languagename。这可能吗?

我尝试使用\noexpand,但可能使用不当,导致出现没有警告文本的错误。

(请原谅我将 expl3 和 LaTeX2e 代码混杂在一起,我对 expl3 不太熟悉,如果使用一点 LaTeX2e 代码来完成某些任务会容易得多)

答案1

评论太长了:

如果您想要扩展\__my_countername:并且保持其他所有内容不扩展,那么您可以x在所有参数中使用扩展,并保持其他标记不被扩展\exp_not:N

\exp_args:Nxxx \crefname { \__my_countername: }
  { \exp_not:N \use:c { my@cref@ \__my_countername: \exp_not:N \use:c { \exp_not:N \languagename ABBR } @name } }
  { \exp_not:N \use:c { my@cref@ \__my_countername: \exp_not:N \use:c { \exp_not:N \languagename ABBR } @name@plural } }

(我\csname ... \endcsname用更多的expl3-y替换\use:c { ... })。

上面的代码只会扩展这三个\__my_countername:(听起来好像名字不对)。但这是做三次相同的工作,所以你可以定义一个辅助宏并\__my_countername:只扩展一次,这样代码会快一点,而且很多更容易理解:

\cs_new_protected:Npn \__my_crefname_aux:n #1
  {
    % In this macro, #1 is \__my_countername: expanded
    \crefname {#1}
      { \use:c { my@cref@#1 \use:c { \languagename ABBR } @name } }
      { \use:c { my@cref@#1 \use:c { \languagename ABBR } @name@plural } }
  }
% then use it as:
\exp_args:Nx \__my_crefname_aux:n { \__my_countername: }

相关内容