我刚刚注意到key-one=value one
和key-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}