Misturando opções de classe tradicionais e pgfoptions?

Misturando opções de classe tradicionais e pgfoptions?

Estou tentando misturar pgfopts com opções mais clássicas para criar uma classe personalizada. A ideia é que as opções clássicas estariam aqui para fornecer comportamento predefinido, enquanto as opções pgfopts estariam aqui para fornecer comportamentos mais personalizáveis.

Por exemplo, digamos que minha turma tenha uma opção de cor com uma opção "vermelho" predefinida, mas também forneça uma maneira pdfopt de definir manualmente mais cores personalizadas. O que quero dizer é que:

  • \documentclass{myclass}seria um comportamento padrão
  • \documentclass[red]{myclass}forneceria um tema de cores predefinido usual
  • \documentclass[maincolor = green]{myclass}permitiria que os usuários fornecessem suas próprias cores

Eu tentei o seguinte:

% 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 produzem as seguintes saídas:

  • \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 [PROBLEMA]

A opção de aula tradicional não funciona.


PERGUNTA:Como misturar pgfopts e opções de classe tradicionais neste tipo de contexto, a fim de fornecer a flexibilidade de comportamento predefinido \documentclass[someoption]{myclass}e personalizável com\documentclass[somekey = someoption]{myclass}

Responder1

Se você quiser continuar, pgfoptspode usar uma .stylechave para reddefinir seu maincolor, por exemplo, com o seguinte código de classe:

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

Mas, como David sugeriu nos comentários, pode ser uma ideia melhor usar um sistema chave=valor diferente. O seguinte usa os comandos do kernel \DeclareKeys, \SetKeyse \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$}}}

Mas pessoalmente eu prefiro expkv-opt(bem, eu escrevi...). Em expkvvocê pode definir chaves que não assumem um valor como tal, dando uma diferenciação mais forte do que a .value forbiddenabordagem suportada por pgfoptse DeclareKeys(embora na maior parte isso não seja muito relevante, mas em teoria você poderia definir um comportamento completamente diferente para uma chave com ou sem um valor desta forma).

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

Responder2

Você poderia usar

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

declarando assim redcomo uma opção pgf (não clássica).

informação relacionada