expl3:如何使某些键成为必需的?

expl3:如何使某些键成为必需的?

我发现了 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'

?

相关内容