我正在尝试创建一个带有一些选项的包。但是,每当我声明选项并加载其他包时,我都会收到以下错误:
LaTeX 错误:
\RequirePackage
或\LoadClass
在选项部分。
这里发生了什么以及/或者我如何声明包选项和加载包裹?
这是一个复制该问题的最小示例:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{mystyle.sty}
\newcommand{\mycmd}{new}% Define some command
\DeclareOption{change}{\renewcommand{\mycmd}{renew}}% Package option `change` updates \mycmd
\RequirePackage{amsmath}% Load amsmath
\end{filecontents*}
\usepackage{mystyle}
\begin{document}
\mycmd% This should be "new"
\end{document}
答案1
当你使用时\DeclareOption
,你的样式文件被分为三个部分:
预选项部分(上面第一个
\DeclareOption
);选项部分(在第一
\DeclareOption
和之间\ProcessOptions
);并且后选项部分(后
\ProcessOptions
)。
无论包含在预选项部分已经处理完毕。因此,唯一的问题出现在超出此点的内容上。
由于可能存在您希望根据某些选项有条件地加载包(或类),并且一旦加载了包(或类),就无法“撤消”该操作,\RequirePackage
(还\usepackage
)如果在选项部分下面是一个如何有条件地加载包的示例:
\newif\if@loadhyperref %\@loadhyperreffalse
\DeclareOption{hyperref}{\@loadhyperreftrue}
\if@loadhyperref
\RequirePackage{hyperref}
\fi
你必须\ProcessOptions
前 \RequirePackage
(在上述情况下,在 if 条件之外),上述代码才能成功。一般来说,发出\ProcessOptions
是为了让自己处于后选项部分然后才可以加载更多包(或类)。
在具体示例中,以下更改就mystyle.sty
足够了:
\newcommand{\mycmd}{new}
\DeclareOption{change}{\renewcommand{\mycmd}{renew}}
\ProcessOptions% Process package options
\RequirePackage{amsmath}% Load amsmath