Traditionelle Klassenoptionen und PGF-Optionen mischen?

Traditionelle Klassenoptionen und PGF-Optionen mischen?

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 pgfoptsverwenden, um deine festzulegen , zum Beispiel mit dem folgenden Klassencode:.styleredmaincolor

% 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 expkvkönnen Sie Schlüssel definieren, die als solche keinen Wert annehmen, was eine stärkere Differenzierung ergibt als der von und .value forbiddenunterstü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).pgfoptsDeclareKeys

% 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 redals PGF-Option (nicht klassisch).

verwandte Informationen