Declarar opções de pacote e carregar pacotes leva ao erro "seção de opções"

Declarar opções de pacote e carregar pacotes leva ao erro "seção de opções"

Estou tentando criar um pacote com algumas opções. Porém, sempre que declaro opções e carrego outros pacotes, recebo o seguinte erro:

Erro LaTeX: \RequirePackageou \LoadClassna seção de opções.

O que está acontecendo aqui e/ou como declaro opções de pacoteecarregar pacotes?

Aqui está um exemplo mínimo que replica o problema:

\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}

Responder1

No momento em que você utiliza o \DeclareOption, seu arquivo de estilo está dividido em três partes:

  1. Seção de pré-opções(acima primeiro \DeclareOption);

  2. Seção de opções(entre primeiro \DeclareOptione \ProcessOptions); e

  3. Seção de pós-opções(depois \ProcessOptions).

O que quer que esteja contido noseção de pré-opçõesjá foi processado. Portanto, o único problema surge com o conteúdo além deste ponto.

Como existe a possibilidade de você querer carregar condicionalmente um pacote (ou classe) com base em alguma opção, e o fato de queuma vez que um pacote (ou classe) é carregado você não pode "desfazer" a ação, \RequirePackage(também \usepackage) invoca um erro se usado dentro doseção de opções. Aqui está um exemplo de como alguém pode decidir carregar um pacote condicionalmente:

\newif\if@loadhyperref %\@loadhyperreffalse
\DeclareOption{hyperref}{\@loadhyperreftrue}
\if@loadhyperref
  \RequirePackage{hyperref}
\fi

Você terá que\ProcessOptions antes \RequirePackage(no caso acima, fora da condição if), para que o código acima seja bem-sucedido. Em geral, emita \ProcessOptionspara se colocar noseção de pós-opçõesantes de poder carregar mais pacotes (ou classes).

No exemplo específico, a seguinte alteração mystyle.stydeve ser suficiente:

\newcommand{\mycmd}{new}
\DeclareOption{change}{\renewcommand{\mycmd}{renew}}
\ProcessOptions% Process package options
\RequirePackage{amsmath}% Load amsmath

informação relacionada