
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, pgfopts
puede usar una .style
clave para permitir red
configurar 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
, \SetKeys
y \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 expkv
puede definir claves que no toman un valor como tal, lo que brinda una diferenciación más fuerte que el .value forbidden
enfoque respaldado por pgfopts
y 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 red
como una opción pgf (no clásica).