我正在编写一个软件包,我想使用 imakeidx 作为依赖项。但是,我不想使其成为硬依赖项,因此我打算添加一个软件包选项来禁用 imakeidx 的自动加载。
但是,我无法让它工作,因为 imakeidx 总是被加载。
查看调试\iow_term:n
语句,代码似乎是在语句期间true
执行的。稍后,代码在被调用时执行。\keys_define:nn
.initial:n
false
\ProcessKeysOptions
但是,.initial:n
如果没有该语句,并且未指定该选项,则不会加载 imakeidx。
有没有办法设置一个默认键值,直到\ProcessKeysOptions
被调用时才执行代码?
\RequirePackage{ expl3 }
\ProvidesExplPackage {mypkg} {2023-06-29} {1.0.0} { My package }
\RequirePackage { l3keys2e }
\keys_define:nn { mypkg } {
imakeidx .choice:
, imakeidx / true .code:n = { \iow_term:n { imakeidx~True } \RequirePackage { imakeidx } }
, imakeidx / false .code:n = { \iow_term:n { imakeidx~False } }
, imakeidx / unknown .code:n = {
\__msg_kernel_error:nnx { kernel } { boolean-values-only } { #1 }
}
, imakeidx .usage:n = { preamble }
, imakeidx .default:n = { true }
, imakeidx .initial:n = { true }
}
\ProcessKeysOptions { mypkg }
\endinput
在主文档中:
\documentclass{article}
\usepackage[imakeidx=false]{mypkg}
\begin{document}
\index{imakeidx should not be loaded}
\end{document}
答案1
简短回答:不能。您可以在使用的位置.initial:n
设置这些键。
如果您只想在评估包选项之后设置特定选项,则可以使用\keys_set:nn
。
注意:您不再需要使用l3keys2e
,key=value 选项解析已集成到 LaTeX 内核中。如果您删除该包并使用,\ProcessKeyOptions[mypgk]
您将获得与 LaTeX 相同甚至更多的功能。
在你希望加载包的具体情况下,使用
\keys_define:nn { mypkg }
{
imakeidx .bool_set:N = \l__mypkg_imakeidx_bool,
imakeidx .usage:n = load
}
\ProcessKeyOptions[mypkg]
\bool_if:NT \l__mypkg_imakeidx_bool { \RequirePackage {imakeidx} }