在 l3keys 中预设按键

在 l3keys 中预设按键

据我所知,没有l3keys像支持那样的预设键的机制xkeyval

我明确地不是意思是.default:n中的规范l3keys,因为如果key给出了 但不=value存在 ,则会调用此规范。

使用以下定义

\keys_define:nn { module }
{
  keya      .tl_set:N  = \l_keya_tl,
  keya      .default:n = { foo },
  keyb      .tl_set:N  = \l_keyb_tl,
  keyb      .default:n = { bar },
}

调用\keys_set:nn { module } { keya }将设置\l_keya_tl为 foo,因为这是默认值。但我\keys_set:nn { module } { }还想改变变量的值\l_keya_tl,例如\c_novalue_tl,在设置键之后,我可以区分

  • 用户根本没有提供密钥(没有提供任何值)
  • 用户设置密钥(有或没有=,这由处理.default:n

目前,我只是\tl_set_eq:NN \l_key_tl \c_novalue_tl在设置密钥之前运行,然后我可以测试用户是否给出了密钥

\tl_if_novalue:VTF \l_my_tl { no value specified } { handle user value }

当然,这很好用。

这是一个设计选择吗不是提供这样的功能l3keys(例如因为它们被认为是糟糕的风格),或者只是因为不经常需要而没有实现?

还请注意,此行为与使用非常相似.initial:n,然后使用分组在设置键时在本地设置键,这样键就initial:n永远不会改变。然而,在某些情况下,这对我来说不是一个选择。

目前我的方法是手动执行附加操作\keys_set:nn { module } { keys, to, preset },然后设置用户键,但这似乎很繁琐。


根据 gusbrs 指出的,我得到了设置`l3keys`时如何区分“无值”和“空值”? 能够区分情况

  • \keys_set:nn { module } { keya, keyb = bar },其中已设置键,但未提供任何值。这将由 处理.default:n,如果存在,则相当于调用keya = <default>
  • \keys_set:nn { module } { keya=, keyb = bar },其中键已明确设置,但令牌列表为空。
  • keys_set:nn { module } { keya = foo, keyb = bar},我们定期设置一个值

我想要的是检测

  • \keys_set:nn { module } { keyb = bar }情况,在这种情况下我例如也想执行.default:n处理程序(对于不支持缺少值的类型),但是在令牌列表的情况下也能够\tl_set_eq:NN \l_keya_tl \c_novalue_tl在这种情况下执行。

我可以想象这可以通过某种.preset:n属性来处理,该属性在处理键之前每次为这个模块设置键时都会执行,无论给出了什么键。

这个会

  • 保证设置键后确实有一个值
  • 还通过指定来处理令牌列表情况.preset:V = \c_novalue_tl,这将产生我想要的行为。

看一下文档中有关“预设键”的部分xkeyval,这就是我想要的。

相关内容