下面的代码输出:
错误:程序包 Foo 错误:未知密钥,\l_keys_key_tl
为什么\l_keys_key_tl
在钩子 1 处展开,而不是在钩子 2 处展开?
\documentclass{report}
\usepackage{xparse}
\ExplSyntaxOn
\msg_new:nnn
{Foo}
{generic}
{#1}
\keys_define:nn { \__erw_foo_options }
{
key .value_required:n = true,
unknown .code:n =
{
{ Unknown~key,~\l_keys_key_tl} % Hook 1
\msg_error:nnn
{ Foo }
{ generic }
{ Unknown~key,~\l_keys_key_tl} % Hook 2
}
}
\NewDocumentCommand{\FooOptions}
{m}
{
\keys_set:nn { \__erw_foo_options } {#1}
}
\NewDocumentCommand{\FooTest}
{}
{
\FooOptions{bar}
}
\ExplSyntaxOff
\begin{document}
\FooTest
\end{document}
答案1
等的扩展行为\msg_error:nnn
是严格定义的:它们传递第三个(第四个等)参数而不改变。因此,您需要使用 来扩展变量\msg_error:nnx
。相反,只需“转储文本”即可tl
在排版时将 转换为其扩展:这是标记列表的记录行为。