l3keys 或包选项中的“key-one=value one”与“key-one={value one}”

l3keys 或包选项中的“key-one=value one”与“key-one={value one}”

我刚刚注意到key-one=value onekey-one={value one}似乎等效于\keys_set:nn参数,但不等效于包选项。在下一个最小示例中,相同的键值参数被解析为包选项或\keys_set:nn。在第一种情况下,只有一些空格被吞噬。发生这种情况有什么好的理由吗?这不只是一个错误吗?

\begin{filecontents}{test.sty}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage
  {test}
  {}
  {}
\ExplSyntaxOn
\tl_new:N \MyOne
\tl_new:N \MyTwo
\keys_define:nn { test } {
  key-one .tl_set:N = \MyOne,
  key-two .tl_set:N = \MyTwo,
}
\cs_set:Npn \MyKeysSet #1 {
  \keys_set:nn { test } { #1 }
}
\ExplSyntaxOff

\RequirePackage{l3keys2e}
\ProcessKeysOptions{test}
%
\end{filecontents}

\documentclass{article}
\RequirePackage[
  key-one=value one,
  key-two={value two},
] {test}
\begin{document}
\noindent
key-one=\MyOne
\\key-two=\MyTwo
\MyKeysSet{
  key-one=value one,
  key-two={value two},
}
\\key-one=\MyOne
\\key-two=\MyTwo
\\Only the first ``valueone'' has no spaces: why?
\end{document}

显示差异的最小示例

答案1

传统上,类和包的选项受制于\zap@space,这将删除括号内未“隐藏”的任何空间,并且可能会意外剥离括号,结果存储在列表中\opt@<name>.<ext>

如今,有第二个列表\@raw@opt@<name>.<ext>没有被删除。\ProcessKeyOptions将解析该列表。

\begin{filecontents}{test.sty}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage
  {test}
  {}
  {}
\ExplSyntaxOn
\tl_new:N \MyOne
\tl_new:N \MyTwo
\keys_define:nn { test } {
  key-one .tl_set:N = \MyOne,
  key-two .tl_set:N = \MyTwo,
}
\cs_set:Npn \MyKeysSet #1 {
  \keys_set:nn { test } { #1 }
}
\ExplSyntaxOff

\ProcessKeyOptions[test]
%
\end{filecontents}

\documentclass{article}
\RequirePackage[
  key-one=value one,
  key-two={value two},
] {test}
\begin{document}
\noindent
key-one=\MyOne
\\key-two=\MyTwo
\MyKeysSet{
  key-one=value one,
  key-two={value two},
}
\\key-one=\MyOne
\\key-two=\MyTwo
\\Only the first ``valueone'' has no spaces: why?
\end{document}

相关内容