我\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:nnn
expl3-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}