如何防止 .initial:n 在调用 \ProcessKeysOptions 之前设置键?

如何防止 .initial:n 在调用 \ProcessKeysOptions 之前设置键?

我正在编写一个软件包,我想使用 imakeidx 作为依赖项。但是,我不想使其成为硬依赖项,因此我打算添加一个软件包选项来禁用 imakeidx 的自动加载。

但是,我无法让它工作,因为 imakeidx 总是被加载。

查看调试\iow_term:n语句,代码似乎是在语句期间true执行的。稍后,代码在被调用时执行。\keys_define:nn.initial:nfalse\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} }

相关内容