我正在编写一个有两个选项的包;其中一个默认值应该根据另一个选项而改变。目前,定义如下:
\SetupKeyvalOptions{family=gitlog,prefix=gitLog@}
\DeclareBoolOption[true]{write}
\DeclareComplementaryOption{nowrite}{write}
\DeclareStringOption{bibfile}
现在,如果用户提供了write
或nowrite
选项,我希望严格遵守。但是,如果没有给出任何选项,那么我希望默认为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
或(我使用而不是- 只是因为我更了解它):nowrite
etoolbox
xstring
\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}