![将字符串变量从 expl3 传递给命令](https://linux22.com/image/445599/%E5%B0%86%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%98%E9%87%8F%E4%BB%8E%20expl3%20%E4%BC%A0%E9%80%92%E7%BB%99%E5%91%BD%E4%BB%A4.png)
这有效(不需要进一步的任何东西,加载包并且代码工作得很好,当然它只是从词汇表 - 额外文档中复制粘贴):
\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,...)。