Declarar opciones de paquete y cargar paquetes genera un error de "sección de opciones"

Declarar opciones de paquete y cargar paquetes genera un error de "sección de opciones"

Estoy intentando crear un paquete con algunas opciones. Sin embargo, cada vez que declaro opciones y cargo otros paquetes, recibo el siguiente error:

Error de LaTeX: \RequirePackageo \LoadClassen la sección Opciones.

¿Qué está pasando aquí y/o cómo declaro las opciones del paquete?ycargar paquetes?

Aquí hay un ejemplo mínimo que replica el 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}

Respuesta1

En el momento en que utilizas \DeclareOption, tu archivo de estilo se divide en tres partes:

  1. Sección de opciones previas(arriba primero \DeclareOption);

  2. Sección de opciones(entre primero \DeclareOptiony \ProcessOptions); y

  3. Sección de opciones posteriores(después \ProcessOptions).

Todo lo que esté contenido dentro delsección de opciones previasya ha sido procesado. Entonces, el único problema surge con el contenido más allá de este punto.

Dado que existe la posibilidad de que desee cargar condicionalmente un paquete (o clase) en función de alguna opción, y el hecho de queuna vez que se carga un paquete (o clase) no se puede "deshacer" la acción, \RequirePackage(también \usepackage) se invoca un error si se usa dentro delsección de opciones. A continuación se muestra un ejemplo de cómo se puede decidir cargar un paquete de forma condicional:

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

Tendrás que\ProcessOptions antes \RequirePackage(en el caso anterior, fuera de la condición if), para que el código anterior sea exitoso. En general, emita \ProcessOptionspara ponerse en elsección de opciones posterioresantes de que puedas cargar más paquetes (o clases).

En el ejemplo específico, el siguiente cambio mystyle.stydebería ser suficiente:

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

información relacionada