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:
\RequirePackage
o\LoadClass
en 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:
Sección de opciones previas(arriba primero
\DeclareOption
);Sección de opciones(entre primero
\DeclareOption
y\ProcessOptions
); ySecció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 \ProcessOptions
para 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.sty
debería ser suficiente:
\newcommand{\mycmd}{new}
\DeclareOption{change}{\renewcommand{\mycmd}{renew}}
\ProcessOptions% Process package options
\RequirePackage{amsmath}% Load amsmath