Ich versuche, ein Paket mit einigen Optionen zu erstellen. Wenn ich jedoch Optionen deklariere und andere Pakete lade, erhalte ich die folgende Fehlermeldung:
LaTeX-Fehler:
\RequirePackage
oder\LoadClass
im Abschnitt „Optionen“.
Was ist hier los bzw. wie deklariere ich PaketoptionenUndPakete laden?
Hier ist ein Minimalbeispiel, das das Problem reproduziert:
\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}
Antwort1
Wenn Sie verwenden \DeclareOption
, ist Ihre Stildatei in drei Teile unterteilt:
Abschnitt „Voroptionen“(oben zuerst
\DeclareOption
);Abschnitt „Optionen“(zwischen dem ersten
\DeclareOption
und\ProcessOptions
); undAbschnitt „Postoptionen“(nach
\ProcessOptions
).
Was auch immer darin enthalten ist,Abschnitt „Voroptionen“wurde bereits verarbeitet. Das einzige Problem tritt also mit Inhalten jenseits dieses Punktes auf.
Da die Möglichkeit besteht, dass Sie ein Paket (oder eine Klasse) basierend auf einer Option bedingt laden möchten, und die Tatsache, dassSobald ein Paket (oder eine Klasse) geladen ist, können Sie die Aktion nicht mehr „rückgängig machen“, \RequirePackage
(auch \usepackage
) wird ein Fehler verursacht, wenn es innerhalb desAbschnitt „Optionen“. Hier ist ein Beispiel, wie man sich entscheiden kann, ein Paket bedingt zu laden:
\newif\if@loadhyperref %\@loadhyperreffalse
\DeclareOption{hyperref}{\@loadhyperreftrue}
\if@loadhyperref
\RequirePackage{hyperref}
\fi
Du musst\ProcessOptions
Vor \RequirePackage
(im obigen Fall außerhalb der if-Bedingung), damit der obige Code erfolgreich ist. Im Allgemeinen geben Sie ein, \ProcessOptions
um sich in dieAbschnitt „Post-Optionen“bevor Sie weitere Pakete (oder Klassen) laden können.
Im konkreten Beispiel sollte folgende Änderung mystyle.sty
genügen:
\newcommand{\mycmd}{new}
\DeclareOption{change}{\renewcommand{\mycmd}{renew}}
\ProcessOptions% Process package options
\RequirePackage{amsmath}% Load amsmath