
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, pgfopts
pode usar uma .style
chave para red
definir 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
, \SetKeys
e \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 expkv
você pode definir chaves que não assumem um valor como tal, dando uma diferenciação mais forte do que a .value forbidden
abordagem suportada por pgfopts
e 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 red
como uma opção pgf (não clássica).