在学习如何正确区分 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}