l3keys 中的奇怪行为

l3keys 中的奇怪行为

考虑以下使用的代码\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密钥,然后执行相应的代码。但是,没有密钥 ,我本以为会出现错误。但是,正如我们在 中看到的那样 ,密钥被转移到。key1module1\keys_set:nn {empty_module} {a_key}a_keyempty_modulea_key\l_tmpa_clistclist_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是键值列表,#4tl 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问题。

相关内容