使用 kvoptions 将布尔键值从一个包传递到另一个包

使用 kvoptions 将布尔键值从一个包传递到另一个包

下面的源文档首先编写两个包,每个包都使用键和kvoptions;第一个包将布尔选项传递给第二个包并调用第二个包。

尽管序言中说

\usepackage[whether=true]{pkg}

在下面的源文档中,输出始终是It's false,并且我在日志中看到此错误:

Package more Warning: Value `PKG@whether' is not supported by
(more)                option `whether' on input line 9.

怎么了?

\RequirePackage{filecontents}
\begin{filecontents}{pkg.sty}
\RequirePackage[debugshow]{kvoptions}
\SetupKeyvalOptions{family=PKG,prefix=PKG@}
\RequirePackage{ifthen}
\DeclareBoolOption{whether}
\ProcessKeyvalOptions*
\PassOptionsToPackage{whether=PKG@whether}{more}
\RequirePackage{more}
\end{filecontents}
%%%%
\begin{filecontents}{more.sty}
\RequirePackage[debugshow]{kvoptions}
\SetupKeyvalOptions{family=MORE,prefix=MORE@}
\RequirePackage{ifthen}
\DeclareBoolOption{whether}
\ProcessKeyvalOptions*
\ifthenelse{\boolean{MORE@whether}}
  {\newcommand{\sayit}{it's true}}
  {\newcommand{\sayit}{it's false}}
\end{filecontents}
%%%%

\documentclass{article}

\usepackage[whether=true]{pkg}

\begin{document}
\sayit
\end{document}

笔记:当然,上述内容是我真实情况的 MWE,其中包可以做有用的事情。更重要的是,两个真实包都采用额外的布尔键以及几个字符串键。

一种解决方法:下面的方法可以解决这个问题,但对我来说似乎过于复杂。将下面这行代码替换

\PassOptionsToPackage{whether=PKG@whether}{more}

和...

\ifthenelse{\boolean{PKG@whether}}{\newcommand{\newwhether}{true}}{\newcommand{\newwhether}{false}}
\PassOptionsToPackage{whether=\newwhether}{more}

...或者,在这两行的第一行中,有一个相应的\if ... \fi构造。

有没有更简单、更直接的方法,避免需要创建新的条件命令——因为在实际情况中每个包都会有多个布尔和字符串键选项?

答案1

根据要求将评论转换为答案。

当您\DeclareBoolOption{whether}使用pkg.sty前缀时PKG@,它会创建一个布尔标志\ifPKG@whether\PKG@whetherfalse默认设置。没有创建诸如true或 之类的“字符串” false

我认为您使用该构造的原因\PassOptionsToPackage{...}{more} \RequirePackage{more}是您需要将多个选项传递给more.sty。我们希望避免\RequirePackage[option]{more} \RequirePackage[otheroption]{more}这种情况,因为这会产生“冲突选项”错误。

使用已创建的标志并\PassOptionsToPackage多次调用是完全没问题的。假设你有布尔值whetherothermore.sty

\begin{filecontents}{more.sty}
\PassOptionsToPackage{debugshow}{kvoptions}% changed from \RequirePackage[debugshow]{kvoptions}
\RequirePackage{kvoptions}
\SetupKeyvalOptions{family=MORE,prefix=MORE@}
\DeclareBoolOption{whether}
\DeclareBoolOption[true]{other}% default true
\ProcessKeyvalOptions*
...
\end{filecontents}

您可以pkg.sty按如下方式构建您的结构:

\begin{filecontents}{pkg.sty}
\PassOptionsToPackage{debugshow}{kvoptions}% changed from \RequirePackage[debugshow]{kvoptions}
\RequirePackage{kvoptions}
\SetupKeyvalOptions{family=PKG,prefix=PKG@}
\DeclareBoolOption{whether}
\DeclareBoolOption{other}% default false
\ProcessKeyvalOptions*

\ifPKG@whether
  \PassOptionsToPackage{whether=true}{more}
\fi

\ifPKG@other
\else
  \PassOptionsToPackage{other=false}{more}
\fi

\RequirePackage{more}
\end{filecontents}

您可以在正文中使用来检查的选项列表。\csname [email protected]\endcsnamemore.sty

答案2

bool 键定义布尔值。对于命令,您需要类似 l3keys 的选择键。

但是您可以直接在 \RequirePackage 中使用布尔值:

\RequirePackage[whether=\ifPKG@whether true\else false \fi]{more}

由于\PassOptionsToPackage参数未展开,因此您需要标准\next方法:

\edef\next{%
 \noexpand\PassOptionsToPackage{whether=
         \ifPKG@whether true\else false \fi }{more}}

\next

相关内容