据我所知,没有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
,这就是我想要的。