expl3:\keys_set_groups:nnn 和未知密钥

expl3:\keys_set_groups:nnn 和未知密钥

\keys_set_groups:nnn仅用它来处理密钥列表的子集。问题是,在这种情况下,未知密钥不会引发错误,因此很容易忽略拼写错误。

我可以通过将每个键放在“已知”组中并\keys_set_filter:nnn首先使用来解决这个问题,但我想知道是否还有更好的方法......

\documentclass[]{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\keys_define:nn {test} 
{
 keya .code:n =   {keya=#1~},
 keya .groups:n = {A, known},
}

%This recognize the typo keyA
\keys_set_filter:nnn {test} { known }
 {keya=test, keyA=XXX}

%this not 
\keys_set_groups:nnn {test} { A }
 {keya=abc, keyA=XXX}

\ExplSyntaxOff 
\end{document}

答案1

您可以定义自己的,例如。因此我复制了from\keys_set_groups_filter:nnn的定义,并用 替换了。瞧,这就是您想要的错误。\keys_set_groups:nnnexpl3-code.tex\keys_set:nn {#1} {#3}\keys_set_filter:nnn {#1} {known} {#3}

在内层您还可以使用\keys_set_known:…它来忽略未知的键而不是引发错误。

\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn

\cs_new_protected:Npn \keys_set_groups_filter:nnn #1#2#3
  {
    \bool_set_true:N \l__keys_selective_bool
    \bool_set_false:N \l__keys_filtered_bool
    \seq_set_from_clist:Nn \l__keys_selective_seq {#2}
    \keys_set_filter:nnn {#1} {known} {#3}
    \bool_set_false:N \l__keys_selective_bool
  }
\cs_generate_variant:Nn \keys_set_groups_filter:nnn { nnV , nnv , nno }

\keys_define:nn {test} 
 {
  keya .code:n =   { keya=#1~ },
  keya .groups:n = { A, known },
 }

\keys_set_groups_filter:nnn {test} { A }
 { keya=abc, keyA=XXX }

\ExplSyntaxOff 
\end{document}

相关内容