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}
问 LaTeX3中l3keys模块里对.usage:n属性的疑惑?