20 LaTeX3中对l3keys模块里的.meta属性的疑惑

发布于 2023-06-26 17:33:33

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属性有关,所以把这两个问题放到一块问,望大佬不要介意)?

查看更多

关注者
0
被浏览
1.1k
Swit
Swit 2023-06-26
LaTeX nubility!

我的理解是这样的,.meta:n.meta:nn 的作用都是通过一个键设置其它的键,区别在于后者还会设置路径。比如:

\keys_define:nn {module}
  {
    key .meta:n = 
    {
      key-a = #1,
      key-b = #1  
    }
  }

那么 key = value 就会同时设置 key-akey-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

我也是刚接触不久这个键值系统,如果说的有问题,还请大家指出。

2 个回答
雾月
雾月 2023-06-26
这家伙很懒,什么也没写!
\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 的第一个参数),后者使用给定的模块名。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览