考虑以下使用的代码\keys_set_known:nnN
:
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\keys_define:nn {empty_module} {}
\keys_define:nn {module1}
{key1 .code:n = {\keys_set:nn {empty_module} {a_key}}}
\keys_set_known:nnN {module1} {key1} \l_tmpa_clist
\clist_show:N \l_tmpa_clist
\ExplSyntaxOff
\begin{document}
\end{document}
执行 时,在中找到\keys_set_known:nnN {module1} {key1} \l_tmpa_clist
密钥,然后执行相应的代码。但是,没有密钥 ,我本以为会出现错误。但是,正如我们在 中看到的那样 ,密钥被转移到。key1
module1
\keys_set:nn {empty_module} {a_key}
a_key
empty_module
a_key
\l_tmpa_clist
clist_show:N
我想知道这是一个错误还是预期的行为,正如(可能)所建议的interface3.pdf
:
\keys_set_known:nnN
可以嵌套使用,并具有正确的残差键值列表每个阶段都会返回。
答案1
我不确定这是否可以称为预期的行为,而是该功能的实现方式。
从中expl3-code.tex
,的定义\keys_set_known:nnN
是(加上包装器代码和其他一些东西):
\keys_set_known:nn {#2} {#3}
\tl_set:Nx #4 { \exp_not:o { \l__keys_unused_clist } }
其中#2
是模块,#3
是键值列表,#4
是tl var
用于存储未使用的键。 功能与 相同,\keys_set_known:nn
但它将 的内容保存\l__keys_unused_clist
在#4
。 所以让我们选择\keys_set_known:nn
。
目前的代码\keys_set_known:nn
执行以下操作:
\bool_set_true:N \l__keys_only_known_bool
\keys_set:nn {#1} {#2}
\bool_set_false:N \l__keys_only_known_bool
这基本上\keys_set:nn
与未知密钥的行为基本上不同。
(您可以在代码的某个地方l3keys
看到:
\bool_if:NTF \l__keys_only_known_bool
{ \__keys_store_unused: }
{
\cs_if_exist:cTF
{ \c__keys_inherit_root_tl \__keys_parent:o \l_keys_path_tl }
{ \__keys_execute_inherit: }
{ \__keys_execute_unknown: }
}
它将未知密钥存储在\l__keys_unused_clist
,要么尝试用密钥做其他事情,具体取决于 的值\l__keys_only_known_bool
。
因此,底线是:当您调用时,\keys_set_known:nnN
您会暂时禁用未知密钥检查代码,因此您预期看到的错误不会出现。相反,当发现未知密钥时,将\__keys_store_unused:
调用它a_key
并将其存储在最后的未使用列表中。
答案2
此问题现已在开发代码中修复:请参阅https://github.com/latex3/latex3/issues/526。下一次发布将在几天内发布,并将解决这个问题和其他l3keys
问题。