我正在尝试设置一个宏\MyCommand{#1}{#2}
,它接受两个输入,一个是键值列表,然后创建一个基于输入和键名命名的标记列表,并将赋予该键的值作为标记列表的内容。
到目前为止,我尝试使用l3keys
如下方法,将的内容#1
存储在一些\l__dai_temp_tl
以及中,但这似乎在的点.tl_set:c = { l_dai_ \tl_use:N \l__dai_temp_tl _tl }
使用了的值。\l__dai_temp_tl
\keys_define:nn
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \l__dai_temp_tl
\keys_define:nn { daikeys } {
foo .tl_set:c = { l_dai_ \tl_use:N \l__dai_temp_tl _tl },
}
\NewDocumentCommand \MyCommand { m m } {
\tl_set:Nn \l__dai_temp_tl { #1 }
\keys_set:nn { daikeys } { #2 }
}
\ExplSyntaxOff
\begin{document}
\MyCommand{bar}{foo=foobar}
\ExplSyntaxOn
\l_dai_bar_tl
\l_dai__tl
\ExplSyntaxOff
\end{document}
在上面的代码中,\l_dai__tl
值为foobar
而 为\l_dai_bar_tl
未定义,而我原本希望这会(定义并)设置\l_dai_bar_tl
为 的值foobar
。
答案1
你误会了.tl_set:c
。这是一个变体,.tl_set:N
因此转换为名称在定义点而不是在使用时。在定义中,\l__dai_temp_tl
是空的,因此你得到的结果\l_dai__tl
正如你所观察到的。
如果你想动态创建变量,你需要自己动手
\keys_define:nn { daikeys } {
foo .code:n =
{
\tl_clear_new:c { l_dai_ \tl_use:N \l__dai_temp_tl _tl }
\tl_set:cn { l_dai_ \tl_use:N \l__dai_temp_tl _tl } {#1}
},
}