パッケージ オプションを宣言し、パッケージをロードすると、「オプション セクション」エラーが発生します。

パッケージ オプションを宣言し、パッケージをロードすると、「オプション セクション」エラーが発生します。

いくつかのオプションを使用してパッケージを作成しようとしています。ただし、オプションを宣言して他のパッケージをロードするたびに、次のエラーが表示されます。

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. 事前オプションセクション(上記1番目\DeclareOption);

  2. オプションセクション(最初\DeclareOptionと の間\ProcessOptions);および

  3. ポストオプションセクション(後\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

関連情報