在interface3.pdf在l3keys模块遇到两个键的属性(大概在235页):
⟨key⟩ .meta:n = {⟨keyval list⟩}
⟨key⟩ .meta:nn = {⟨path⟩} {⟨keyval list⟩}
表示使<key>
成为一个“meta-key
”,我不知这个“meta-key
”是啥意思,因此理解不了原文所解释的这两个属性的作用,还望大佬们解释一下这两个属性的作用。
另外还有一个疑问,假设我定义了如下键:
\keys_define:nn {module}
{
subset/key-a .code = #1,
}
% 或者
\keys_define:nn {module/subset}
{
key-a .code = #1,
}
在设置键时,使用:
\keys_set:nn {module}
{
subset/key-a = value-a
}
对以上两种方式定义的key-a
都能成功将其值设为value-a
,但我想通过另一种方式来设置key-a
的值:
\keys_set:nn {module}
{
subset = { key-a = value-a }
}
以这样的形式设置键的值在好几个模板中我都看到有这样的操作,但我却无法成功完成这一操作(就单纯以上面的代码编译后报错)。所以我想问该如何操作才能对键完成类似subset = { key-a = value-a }
这样的赋值操作(我觉得这很可能与.meta
属性有关,所以把这两个问题放到一块问,望大佬不要介意)?
我的理解是这样的,.meta:n
和 .meta:nn
的作用都是通过一个键设置其它的键,区别在于后者还会设置路径。比如:
\keys_define:nn {module}
{
key .meta:n =
{
key-a = #1,
key-b = #1
}
}
那么 key = value
就会同时设置 key-a
和 key-b
的值为 value
。
你通过两种方式设置键其实是等价的,本质上都设置了同一个键,其全称为 module/subset/key-a
。
当使用
\keys_set:nn {module}
{
subset/key-a = value-a
}
设置键时,会将键 module/subset/key-a
的值设置为 value-a
,这当然没有问题。然而,当你按下面这样写时:
\keys_set:nn {module}
{
subset = { key-a = value-a }
}
latex 会寻找键 module/subset
,但这个键是不存在的,所以会报错。这时候,便可以用 .meta:nn
解决这个问题(注意我故意将键名取为 SUBSET
来表明这个名称不一定非要和 module/xxx
中的 xxx
保持一致):
\define_keys:nn {module}
{
SUBSET .meta:nn = { module / subset } { key-a = #1 }
}
通过上面这段代码,我们定义一个键叫做 module/SUBSET
,当给它赋值 value-a
时:
\keys_set:nn {module}
{
SUBSET = value-a
}
就相当于在 module/subset
路径下设置 key-a
的值为 value-a
,即键 module/subset/key-a
的值为 value-a
。
我们还可以继续改:
\keys_define:nn {module}
{
SUBSET .meta:nn {module/subset} {#1}
}
这时便可以像你希望地那样设置值:
\keys_set:nn {module}
{
SUBSET = { key-a = value-a }
}
key-a = value-a
作为整体传递给上面的 #1
,效果还是设置键 module/subset/key-a
的值为 value-a
。
我也是刚接触不久这个键值系统,如果说的有问题,还请大家指出。
\keys_define:nn { my }
{
subset-1 .meta:n = {#1},
subset-2 .meta:nn = { you } {#1},
}
类似于
\keys_define:nn { my }
{
subset-1 .code:n = { \keys_set:nn { my } {#1} } ,
subset-2 .code:n = { \keys_set:nn { you } {#1} } ,
}
但可以正确处理其它几类设置键的命令(如 \keys_set_filter:nnn
)。
第二个问题,只要使用 .meta:n
定义 subset
键即可。
由 .meta:n
和 .meta:nn
这两个 property 定义的键的作用是把传给它们的值当作键值对来解析,区别是,前者定义的键在解析传进来的值时使用该键的模块名(定义该键时 \keys_define:nn
的第一个参数),后者使用给定的模块名。
感谢大佬,你解释的很细,当时编译报错说的就是找不到键
module/subset
,所以我就猜测.meta:nn
或许就是来解决此问题的,没想到果真如此。