我发现了 l3keys 包并想使用它。在这里,具体来说,我想强制要求某些密钥是必需的。根据文档,属性“value_required:n”可用于此目的:
⟨key⟩ .value_required:n = true|false
:指定 ⟨key⟩ 使用时必须接收 ⟨value⟩。如果没有提供 ⟨value⟩,则会发出错误。设置属性“false”可取消限制。
如果我理解正确的话,\mycommand{}
下面的例子应该会报错,因为key
没有提供选项。但是,为什么事实并非如此呢?
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\keys_define:nn { mykeys/key }
{
key .tl_set:N = \l__mykeys_key_tl,
key .value_required:n = true
}
\NewDocumentCommand{\mycommand}{m}
{
\group_begin:
\keys_set:nn { mykeys/key } { #1 }
Key~1~value:~\l__mykeys_key_tl
\group_end:
}
\ExplSyntaxOff
\begin{document}
% This works as expected.
\mycommand{key=value}
% Here I expect an error, but there is none
\mycommand{}
\end{document}
答案1
.value_required:n = true
意味着当您提供键时,必须提供一个值。
您可以将这个值初始化为可区分的值。
\documentclass{article}
\ExplSyntaxOn
\keys_define:nn { mykeys/key }
{
key .tl_set:N = \l__mykeys_key_tl,
key .initial:n = \q_nil,
}
\NewDocumentCommand{\mycommand}{m}
{
\group_begin:
\keys_set:nn { mykeys/key } { #1 }
\quark_if_nil:VTF \l__mykeys_key_tl
{
\msg_error:nnn { mykeys } { missing } { key }
}
{
Key~1~value:~\l__mykeys_key_tl
}
\group_end:
}
\msg_new:nnnn { mykeys } { missing }
{ Key~'#1'~not~set }
{ You~must~set~the~key~'#1'}
\ExplSyntaxOff
\begin{document}
% This works as expected.
\mycommand{key=value}
% Here I expect an error, but there is none
\mycommand{}
\end{document}
控制台输出
! Package mykeys Error: Key 'key' not set
For immediate help type H <return>.
...
l.38 \mycommand{}
? h
You must set the key 'key'
?