如何使用当前的 l3keys2e 恢复选项值?

如何使用当前的 l3keys2e 恢复选项值?

最小编译但不工作的示例:

\begin{filecontents}{\jobname.cls}

\ProvidesClass{\jobname}

\RequirePackage{l3keys2e}

\ExplSyntaxOn
\keys_define:nn { job / doc }
{
  doc~name .tl_set:N = \l_job_doc_name,
}

\ProcessKeysOptions { job / doc }

\ExplSyntaxOff

\PassOptionsToClass{10pt}{article}
\DeclareOption*{%
  \PassOptionsToClass{\CurrentOption}{article}
}
\ProcessOptions

\LoadClass{article}

\ExplSyntaxOn
\AtBeginDocument{
  This ~ document's ~ name ~ is ~ \l_job_doc_name .\par
}
\ExplSyntaxOff
\endinput
\end{filecontents}

\documentclass[doc name=ben]{\jobname}
\begin{document}
  hello
\end{document}

我期望这会给我“本文档的名称是 ben。”然后是新行,然后是“hello”。然而,这种情况不再发生,尽管此代码(更复杂的版本)曾经有效。

非预期输出

答案1

你的问题是 LaTeX 内核从全局选项列表中删除了空格它被传递给任何其他代码。因此,l3keys2e查看docname=ben哪个是与不同的键名doc name。这里最安全的解决方案是在键名中不使用空格。

答案2

显然,这是一个有意为之的改变:

我们曾经彻底规范化空间,但由于存在一些问题,因此已经放弃了。——约瑟夫·赖特

因此破损是一个新特征;)。

由于问题在于空格已从传递给类/包的选项标准化,但未从类/包中定义的选项标准化,我猜处理代码更改的最简单方法l3keys2e是删除类/包定义中的空格。文档中的空格可以保留,因为它们将在代码看到它们之前被标准化以匹配包/类中的键名l3keys2e

也就是说,我可以写

 \keys_define:nn { job / doc }
{
  doc name .tl_set:N = \l_job_doc_name,
}

进而

\documentclass[doc name=ben]{\jobname}

将按预期工作:在这两种情况下,空格都会消失,所有内容都会正确匹配。所以

\ProcessKeysOptions { job / doc }

将匹配docnamedocname知道l3keys2e我的文档名为ben

相关内容