在 2021-07-12 发布的 interface3.pdf 中的“26.8 用于解析键值列表的低级接口”一节中,您可以找到:
\keyval_parse:nnn
✩ 新版:2020-12-19 更新版:2021-05-10
\keyval_parse:nnn {⟨code1⟩}{⟨code2⟩}{⟨key–value list⟩}
解析⟨键值列表⟩变成一系列⟨键⟩以及相关⟨价值观⟩,或者仅仅是键(如果没有给出⟨value⟩)。 ⟨代码1⟩收到每个⟨钥匙⟩(没有 ⟨value⟩)作为尾随括号组,而⟨代码2⟩由两个括号组附加,⟨钥匙⟩和⟨价值⟩. 顺序 ⟨键⟩在⟨键值列表⟩中被保留。......
我不知道为什么⟨代码2⟩添加的顺序是而不是 。{⟨key⟩}{⟨value⟩}
{⟨value⟩}{⟨key⟩}
如果是后者,你可以更轻松地调用完全相同的函数/宏⟨代码1⟩与⟨代码2⟩并特此⟨代码1⟩只需为缺失值提供默认值。
在当前状态下您无法做到这一点 - 相反,您需要在未提供值/提供值的两种情况之一中交换参数:
例如,假设有人希望调用一个\__MYMODULE_foobar:nnnn
函数
- 它的第一个参数是短语“foo”,
- 它的第二个参数是短语“bar”,
- 它的第三个参数可能是键的名称,
- 可能它的第四个参数要么是形成值的标记,要么在没有提供值的情况下是短语“bazdefault”。
目前需要做类似的事情:
\cs_new:Nn \__MYMODULE_exchange_i_iii_ii:nnn { #1 {#3} {#2} }
\cs_new:Nn \__MYMODULE_foobar:nnnn {First~arg~is:#1.~Second~arg~is:#2.~Key~is:~#3.~Value~or~default~is:~#4.}
...
\keyval_parse:nn { \__MYMODULE_exchange_i_iii_ii:nnn {\__MYMODULE_foobar:nnnn {foo}{bar}} {bazdefault} }
{ \__MYMODULE_foobar:nnnn {foo}{bar} }
{ A=B,C }
...
如果⟨代码2⟩附加的顺序是而不是,那么可以在-函数中交换最后一个和倒数第二个参数,更简单地执行以下操作:{⟨value⟩}{⟨key⟩}
{⟨key⟩}{⟨value⟩}
\__MYMODULE_foobar:nnnn
\cs_new:Nn \__MYMODULE_foobar:nnnn {First~arg~is:#1.~Second~arg~is:#2.~Key~is:~#4.~Value~or~default~is:~#3.}
...
\keyval_parse:nn { \__MYMODULE_foobar:nnnn {foo}{bar}{bazdefault} }
{ \__MYMODULE_foobar:nnnn {foo}{bar} }
{ A=B,C }
...
我觉得这样很方便。但我不能排除有充分的理由不这样做,我只是不明白,但目前的做法是这样的。
与 的相似性\keyval_parse:NNn
较小,因为无论如何你都需要定义两个不同的函数。但在这里,人们可能已经交换了 的两个参数的顺序⟨功能2⟩。