将字符串变量从 expl3 传递给命令

将字符串变量从 expl3 传递给命令

这有效(不需要进一步的任何东西,加载包并且代码工作得很好,当然它只是从词汇表 - 额外文档中复制粘贴):

\glsxtrnewglslike[hyper={false}]{idx.}{\idx}{\idxpl}{\Idx}{\Idxpl}%

我现在的问题是:当我假设idx存储在字符串变量中时\str_new:...(如果这毫无意义,我通常应该使用与假设的变量不同的变量类型),我该如何做与上面相同的事情?我不想写idx.\idx等等,我想要的是使用存储在字符串变量中的值自动执行此操作。

类似于这些内容(xparse):

\NewDocumentCommand{\Test}{m}{
    \glsxtrnewglslike[hyper={false}]{#1.}{\idx}{\idxpl}{\Idx}{\Idxpl}%
}

显然,这样\Test{idx}做与我的第一个代码相同。但我想要的是,所有这些东西{\idx}{\idxpl}{\Idx}{\Idxpl}也以某种方式被“ #1+however I do this”替换,这样我就可以\Test{...}多次使用不同的词汇表等。当然,我不希望它与和#1\NewDocumentCommand只是一个例子)一起使用,而是与包中存储的字符串变量idx(或任何在这里使用的变量)一起使用expl3

答案1

这应该可以:

\documentclass[]{article}

\usepackage{glossaries-extra}

\ExplSyntaxOn
\cs_new_protected:Npn \yumina_gls_from_str:n #1
  { \exp_args:Ne \__yumina_gls_from_str_aux:n { \tl_to_str:n {#1} } }
\cs_generate_variant:Nn \yumina_gls_from_str:n { V }
\cs_new_protected:Npn \__yumina_gls_from_str_aux:n #1
  {
    % the group is necessary to not let the build macros to `\relax`
    \group_begin:
    \exp_args:Nncccc \use:n { \group_end: \glsxtrnewglslike[hyper=false]{#1.} }
      { #1 }
      { #1pl }
      { \char_uppercase:N #1 }
      { \char_uppercase:N #1pl }
  }
\exp_args_generate:n { ncccc }

\str_new:N \l_yumina_tmp_str
\str_set:Nn \l_yumina_tmp_str {idx}
\yumina_gls_from_str:V \l_yumina_tmp_str

% or shorter:
\yumina_gls_from_str:n { etc }
\ExplSyntaxOff

\begin{document}
Some document doing stuff.
\end{document}

解释:

  • \exp_args:N...在函数看到参数之前扩展该函数的参数,这里使用的不同扩展类型是:

    • n不执行任何操作,仅执行括号中的普通参数

    • e完全扩展事物(使用\tl_to_str:n它将其参数变成字符串,不能进一步扩展)

    • c根据参数的内容构建一个控制序列名称(在某种程度上完全扩展,但我们的参数是一个字符串,因此只需将其转换为控制序列名称)

  • \char_uppercase:N将字符串中的第一个字符转换为大写形式

  • \cs_generate_variant:Nn将创建一个可以扩展其参数的宏版本,我们使用:

    • V获取变量的内容(作为n-type 参数,因此用括号括起来)
  • \exp_args_generate:n\exp_args:N...从论点中构建出一个新的变体。

  • 使用字符串化\yumina_gls_from_str:n是因为它获取了一个n-type 参数,可能是用户提供的一些不一定是字符串的代码。目前我们还不知道我们是否将其用于字符串变量的内容,这只是稍后添加的\cs_generate_variant:Nn(理论上也可以获取标记列表变量的内容,或者 int,或者 dimen,...)。

相关内容