在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
只能使用后者,也就是内核定义的,才有效。原来如此,谢谢雾月大佬!