
Ich versuche, pgfopts mit klassischeren Optionen zu mischen, um eine benutzerdefinierte Klasse zu erstellen. Die Idee ist, dass klassische Optionen hier sind, um vordefiniertes Verhalten bereitzustellen, während pgfopts-Optionen hier sind, um anpassbarere Verhaltensweisen bereitzustellen.
Nehmen wir beispielsweise an, meine Klasse hat eine Farboption mit einer vordefinierten „Rot“-Option, bietet aber auch eine Möglichkeit, mit pdfopt weitere benutzerdefinierte Farben manuell festzulegen. Was ich meine, ist Folgendes:
\documentclass{myclass}
wäre ein Standardverhalten\documentclass[red]{myclass}
würde ein übliches vordefiniertes Farbthema bereitstellen\documentclass[maincolor = green]{myclass}
würde es Benutzern ermöglichen, ihre eigenen Farben bereitzustellen
Ich habe Folgendes versucht:
% CLASS
% Preamble
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesClass{myclass}[2022/10/11]
\LoadClassWithOptions{article}
% Packages
\RequirePackage{pgfopts}
\RequirePackage{color}
% Pgfoptions
\pgfkeys{
/myclass/.cd,
maincolor/.store in = \maincolor,
maincolor = blue,
}
\ProcessPgfOptions{/myclass}
% Class options
\DeclareOption{red}{\pgfkeyssetvalue{maincolor}{red}}
\ProcessOptions
% Test command
\newcommand{\printcolor}{\textcolor{\maincolor}{\Huge{$\bullet$}}}
Die Ergebnisse sind wie folgt:
\documentclass{myclass}\begin{document}\printcolor\end{document}
=>
blue
[OK]\documentclass[maincolor = green]{myclass}\begin{document}\printcolor\end{document}
=>
green
[OK]\documentclass[maincolor = red]{myclass}\begin{document}\printcolor\end{document}
=>
red
[OK]\documentclass[red]{myclass}\begin{document}\printcolor\end{document}
=>
blue
[PROBLEM]
Die traditionelle Unterrichtsoption funktioniert nicht.
FRAGE:Wie man pgfopts und traditionelle Klassenoptionen in diesem Kontext mischt, um die Flexibilität sowohl vordefinierten Verhaltens als \documentclass[someoption]{myclass}
auch anpassbaren Verhaltens zu bieten.\documentclass[somekey = someoption]{myclass}
Antwort1
Wenn du dabei bleiben willst, kannst du einen Schlüssel pgfopts
verwenden, um deine festzulegen , zum Beispiel mit dem folgenden Klassencode:.style
red
maincolor
% CLASS
% Preamble
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesClass{myclass}[2022/10/11]
\LoadClassWithOptions{article}
% Packages
\RequirePackage{pgfopts}
\RequirePackage{color}
% Pgfoptions
\pgfkeys{
/myclass/.cd,
maincolor/.store in = \maincolor,
maincolor = blue,
red/.style={maincolor=red},
red/.value forbidden
}
\ProcessPgfOptions{/myclass}
% Test command
\newcommand{\printcolor}{\textcolor{\maincolor}{\Huge{$\bullet$}}}
Aber wie David in den Kommentaren vorgeschlagen hat, wäre es vielleicht eine bessere Idee, ein anderes Schlüssel=Wert-System zu verwenden. Im Folgenden werden die Kernelbefehle \DeclareKeys
, \SetKeys
, und verwendet \ProcessKeyOptions
:
% CLASS
% Preamble
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesClass{myclass}[2022/10/11]
\LoadClassWithOptions{article}
% Packages
\RequirePackage{color}
\DeclareKeys
{
maincolor .store = \maincolor
,red .meta:n = {maincolor=red}
,red .value_forbidden:n = true
}
\SetKeys{maincolor=blue}
\ProcessKeyOptions
% Test command
\newcommand{\printcolor}{\textcolor{\maincolor}{\Huge{$\bullet$}}}
Aber ich persönlich würde es vorziehen expkv-opt
(also, ich habe es geschrieben...). In expkv
können Sie Schlüssel definieren, die als solche keinen Wert annehmen, was eine stärkere Differenzierung ergibt als der von und .value forbidden
unterstützte Ansatz (obwohl dies größtenteils nicht sehr relevant ist, aber theoretisch könnten Sie auf diese Weise ein völlig anderes Verhalten für einen Schlüssel mit oder ohne Wert definieren).pgfopts
DeclareKeys
% CLASS
% Preamble
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesClass{myclass}[2022/10/11]
\LoadClassWithOptions{article}
% Packages
\RequirePackage{expkv-opt,expkv-def}
\RequirePackage{color}
\ekvdefinekeys{myclass}
{
store maincolor = \maincolor
,initial maincolor = blue
,nmeta red = {maincolor=red}
}
\ekvoProcessGlobalOptions{myclass}% this does the right thing currently and in the future
%\ekvoProcessLocalOptions{myclass}% due to changes in the kernel this doesn't do everything correct in a class file currently -- it might result in a wrongfully thrown "unused global option" error
% Test command
\newcommand{\printcolor}{\textcolor{\maincolor}{\Huge{$\bullet$}}}
Antwort2
Du könntest benutzen
\pgfkeys{
/myclass/.cd,
maincolor/.store in = \maincolor,
maincolor = blue,
red/.code = \def\maincolor{red},
red/.value forbidden
}
Deklaration red
als PGF-Option (nicht klassisch).