いくつかのオプションを使用してパッケージを作成しようとしています。ただし、オプションを宣言して他のパッケージをロードするたびに、次のエラーが表示されます。
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
、スタイル ファイルは次の 3 つの部分に分かれています。
事前オプションセクション(上記1番目
\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