¿Mezclando opciones de clases tradicionales y opciones de página?

¿Mezclando opciones de clases tradicionales y opciones de página?

Estoy intentando mezclar pgfopts con opciones más clásicas para crear una clase personalizada. La idea es que las opciones clásicas estarían aquí para proporcionar un comportamiento predefinido, mientras que las opciones de pgfopts estarían aquí para proporcionar comportamientos más personalizables.

Por ejemplo, digamos que mi clase tiene una opción de color con una opción "roja" predefinida, pero también proporciona una forma pdfopt de configurar manualmente más colores personalizados. Lo que quiero decir es que:

  • \documentclass{myclass}sería un comportamiento predeterminado
  • \documentclass[red]{myclass}proporcionaría un tema de color predefinido habitual
  • \documentclass[maincolor = green]{myclass}permitiría a los usuarios proporcionar sus propios colores

Intenté lo siguiente:

% 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$}}}

Que producen los siguientes resultados:

  • \documentclass{myclass}\begin{document}\printcolor\end{document} => blue [DE ACUERDO]
  • \documentclass[maincolor = green]{myclass}\begin{document}\printcolor\end{document} => green [DE ACUERDO]
  • \documentclass[maincolor = red]{myclass}\begin{document}\printcolor\end{document} => red [DE ACUERDO]
  • \documentclass[red]{myclass}\begin{document}\printcolor\end{document} => blue [PROBLEMA]

La opción de clase tradicional no funciona.


PREGUNTA:Cómo combinar pgfopts y opciones de clases tradicionales en este tipo de contexto para proporcionar la flexibilidad tanto de comportamiento predefinido como de \documentclass[someoption]{myclass}comportamientos personalizables con\documentclass[somekey = someoption]{myclass}

Respuesta1

Si desea seguir adelante, pgfoptspuede usar una .styleclave para permitir redconfigurar su maincolor, por ejemplo con el siguiente código de clase:

% 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$}}}

Pero como sugirió David en los comentarios, podría ser una mejor idea utilizar un sistema clave=valor diferente. Lo siguiente utiliza los comandos del kernel \DeclareKeys, \SetKeysy \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$}}}

Pero personalmente prefiero expkv-opt(bueno, lo escribí yo...). En expkvpuede definir claves que no toman un valor como tal, lo que brinda una diferenciación más fuerte que el .value forbiddenenfoque respaldado por pgfoptsy DeclareKeys(aunque en su mayor parte esto no es muy relevante, pero en teoría podría definir un comportamiento completamente diferente para una clave con o sin un valor de esta manera).

% 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$}}}

Respuesta2

Podrías usar

\pgfkeys{
    /myclass/.cd,
    maincolor/.store in = \maincolor,
    maincolor = blue,
    red/.code = \def\maincolor{red},
    red/.value forbidden
}

declarandolo redcomo una opción pgf (no clásica).

información relacionada