如何动态定义 l3keys

如何动态定义 l3keys

在学习如何正确区分 LaTeX3(和其他功能)中的不同函数签名时,我想尝试一个更复杂的动态生成 l3keys 的示例,因为它需要在不同的上下文中动态定义几个不同的东西。

我有以下 MWE 尝试动态生成密钥:

\documentclass[a4paper]{article}

\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn

\begin{document}

\NewDocumentCommand\definekey{mm}{
  \tl_new_local:N \l_examplea_mod_tl
  \tl_new_local:N \l_examplea_key_tl

  \tl_set:Nn \l_examplea_mod_tl {#1}
  \tl_set:Nn \l_examplea_key_tl {#2}

  \keys_define:nn { \l_examplea_mod_tl }
  {
    \l_examplea_key_tl .tl_set:N = \l_ \l_examplea_mod_tl _ \l_examplea_key_tl _tl
  }
}

\NewDocumentCommand\examplea{m}
  {
    \keys_set:nn { examplea } { #1 }
    \typeout{\l_examplea_foo_tl}
    \typeout{\l_examplea_baz_tl}
    \prop_put:NnV \l_examplea_main_prop {foo} \l_examplea_foo_tl
    \prop_put:NnV \l_examplea_main_prop {baz} \l_examplea_baz_tl
  }

\prop_new:N \l_examplea_main_prop

\definekey{examplea}{foo}
\definekey{examplea}{baz}

\examplea{foo=bar,baz=asdf}

\prop_show:N \l_examplea_main_prop

\end{document}

目标本质上是这样的。定义一个新键,如下所示:

\definekey{mymodule}{mykeya}
\definekey{mymodule}{mykeyb}

应改为:

\keys_define:nn { mymodule } {
  mykeya .tl_set:N = \l_mymodule_mykeya_tl
}
\keys_define:nn { mymodule } {
  mykeyb .tl_set:N = \l_mymodule_mykeyb_tl
}

其实际效果为:

\keys_define:nn { mymodule } {
  mykeya .tl_set:N = \l_mymodule_mykeya_tl
  mykeyb .tl_set:N = \l_mymodule_mykeyb_tl
}

我认为我还没有完全让它工作,可能犯了一些错误。我得到的错误是这样的:

! Undefined control sequence.
\definekey #1#2->\tl_new_local:N
                                 \l_examplea_mod_tl \tl_new_local:N \l_examp...
l.34 \definekey{examplea}{foo}

目标是动态定义中的键\keys_define:nn

答案1

您可以使用参数占位符和.tl_set:c来构建令牌列表名称。

\documentclass[a4paper]{article}

\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn

\begin{document}

\NewDocumentCommand\definekey{mm}
 {
  \keys_define:nn { #1 }
   {
    #2 .tl_set:c = { l_#1_#2_tl },
   }
 }

\NewDocumentCommand\examplea{m}
  {
    \keys_set:nn { examplea } { #1 }
    \typeout{\l_examplea_foo_tl}
    \typeout{\l_examplea_baz_tl}
    \prop_put:NnV \l_examplea_main_prop {foo} \l_examplea_foo_tl
    \prop_put:NnV \l_examplea_main_prop {baz} \l_examplea_baz_tl
  }

\prop_new:N \l_examplea_main_prop

\definekey{examplea}{foo}
\definekey{examplea}{baz}

\examplea{foo=bar,baz=asdf}

\prop_show:N \l_examplea_main_prop

\end{document}

相关内容