kvoptions 可以使用动态默认值吗?

kvoptions 可以使用动态默认值吗?

我正在编写一个有两个选项的包;其中一个默认值应该根据另一个选项而改变。目前,定义如下:

\SetupKeyvalOptions{family=gitlog,prefix=gitLog@}
\DeclareBoolOption[true]{write}
\DeclareComplementaryOption{nowrite}{write}
\DeclareStringOption{bibfile}

现在,如果用户提供了writenowrite选项,我希望严格遵守。但是,如果没有给出任何选项,那么我希望默认为write如果bibfile为空,nowrite否则为空。

我的初始尝试是这样的(使用 xstring):

\IfStrEq{}{\gitLog@bibfile}{%
    \renewcommand{\gitLog@bibfile}{\jobname}
}{
    \somehowsetoption{nowrite} if neither write or nowrite given
}%

提供\somehowsetoption命令的最简单方法是什么?(请注意:更改 s\Declare...是可以的。

我没有包括 MWE,因为我认为这更多是关于“如何做”而不是“什么是错”。

答案1

您可以使用\AddToKeyvalOption{gitlog}{write}{...}它来定义一些宏(对于选项也一样nowrite)。然后,只有在使用了任一选项时才会定义所述宏,您可以测试它是否存在。这是一个完整的示例,它定义了\gitLog@writeset 仅有的如果已设置write或(我使用而不是- 只是因为我更了解它):nowriteetoolboxxstring

\documentclass{article}
\usepackage{filecontents}

\begin{filecontents*}{foo.sty}
\RequirePackage{kvoptions,etoolbox}
\SetupKeyvalOptions{family=gitlog,prefix=gitLog@}

% write:
\DeclareBoolOption[true]{write}
\AddToKeyvalOption{gitlog}{write}{\def\gitLog@writeset{true}}

% nowrite:
\DeclareComplementaryOption{nowrite}{write}
\AddToKeyvalOption{gitlog}{nowrite}{\def\gitLog@writeset{true}}

% bibfile:
\DeclareStringOption{bibfile}

% process options:
\ProcessKeyvalOptions{gitlog}

% check if write/nowrite has been set:
\ifdef\gitLog@writeset
  {}
  {% write/nowrite option has not been set,
   % set boolean depending on value of \gitLog@bibfile:
    \ifdefempty\gitLog@bibfile
      {\booltrue{gitLog@write}}
      {\boolfalse{gitLog@write}}%
  }

\end{filecontents*}

% \usepackage{foo} % false
\usepackage[bibfile=foo]{foo} % true
% \usepackage[nowrite,bibfile=foo]{foo} % false
% \usepackage[write]{foo} % true

\begin{document}

\ifbool{gitLog@write}{true}{false}

\end{document}

相关内容