在LaTeX3中的l3keys模块遇到这样两个函数(具体在interface3.pdf的26.4小节240页),原文截取图如下:
我不是很理解它的作用,大佬能否举几个例子解释一下它的作用,它的三个取值general、preamble、load应该在何种情况下使用。另外,能否顺便解释下\l_keys_usage_load_prop和\l_keys_usage_preamble_prop这两个变量的作用?
load:该键只能作为宏包选项(或文档类选项)被设置;preamble:该键只能在导言区设置;general:该键只要有定义就能设置。
使用了 load 的键,只在使用 \SetKeys 时才能正确处理。使用 l3keys2e 宏包的设置键的命令不会正确处理。
使用了 preamble 的键,可以在导言区以及 begindocument/before 钩子(以及 etoolbox 的 \AtEndPreamble)中被设置,无法在其它位置设置。
general,清除 load 和 general 的效果,这是默认的情形。
设置 .usage:n 时,只是把键保存到 \l_keys_usage_load_prop 和 \l_keys_usage_preamble_prop 中,等到设置键时,再根据键是否在它们中而决定是否能被设置(实际上,在加载宏包、在导言区之后,会重新定义这两个 prop 里的键,使得它们无法再被设置)。
下例中,有两个位置出错,因为它们在不正确的位置设置了某些键。\DeclareKeys 和 \SetKeys 由 LaTeX2e 内核提供,模块名是可选参数。
\documentclass{article}
\begin{filecontents}[force]{mypkg.sty}
\DeclareKeys[mypkg]{
faa.store=\mypkgfaa,
faa.usage=load,
fbb.store=\mypkgfbb,
fbb.usage=preamble,
fcc.store=\mypkgfcc,
}
\ProcessKeyOptions[mypkg]
\end{filecontents}
\usepackage[faa=1,fbb=1,fcc=1]{mypkg}
\SetKeys[mypkg]{faa=2,fbb=2,fcc=2} % 出错:faa=2
\begin{document}
\SetKeys[mypkg]{fbb=3,fcc=3} % 出错:fbb=3
hello.
aa: \mypkgfaa,
bb: \mypkgfbb,
cc: \mypkgfcc.
\ExplSyntaxOn
\prop_show:N \l_keys_usage_preamble_prop
\ExplSyntaxOff
\end{document}
谢谢雾月大佬!原来
.usage:n是这么用的,您解释的太贴心了,l3keys模块就差这没看懂了,感谢大佬补全了我的认知!@u10508 “使用了 load 的键,只在使用
\SetKeys时才能正确处理。”这里写错了,改为\ProcessKeyOptions。代码没错。好的好的,感谢雾月大佬(我还以为是
\ProcessKeyOptions不能正确处理才这样写),另外,我这还是第一次见\DeclareKeys和\SetKeys的使用方法,感谢您的普及!@u10307 大佬,我再问一句,
\ProcessKeyOptions和l3keys2e宏包里的\ProcessKeysOptions有啥区别?它们就差一个字母。原先眼睛走火了,以为\ProcessKeyOptions是l3keys2e宏包里的命令。若要将用l3keys模块定义的选项传递给类/宏包时,使用哪个命令要好一点?@u10508
这也是
ctex的做法。@u10307
\SetKeys和\keys_set:nn,\keys_define:nn和\DeclareKeys,都是可以通用的,区别是\SetKeys这种文档接口是由 LaTeX2e 内核定义的,它们都会展开第一个可选参数。目前的情况下,l3keys2e中的\ProcessKeysOptions已经有替代:\ProcessKeyOptions,这也是 LaTeX2e 内核定义的,它们不共用一套代码(当然都使用了最基本的\keys_set:nn)。上面说的.usage只能使用后者,也就是内核定义的,才有效。原来如此,谢谢雾月大佬!