下面的源文档首先编写两个包,每个包都使用键和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
多次调用是完全没问题的。假设你有布尔值whether
和other
:more.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]\endcsname
more.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