\keys_set:nn 时使用标记列表的值

\keys_set:nn 时使用标记列表的值

我正在尝试设置一个宏\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}
     },
}

相关内容