混合传统的类选项和 pgfoptions?

混合传统的类选项和 pgfoptions?

我正在尝试将 pgfopts 与更多经典选项混合以创建自定义类。想法是经典选项将在这里提供预定义行为,而 pgfopts 选项将在这里提供更多可自定义的行为。

例如,假设我的类有一个带有预定义“红色”选项的颜色选项,但也提供了一种 pd​​fopt 方法来手动设置更多自定义颜色。我的意思是:

  • \documentclass{myclass}将成为默认行为
  • \documentclass[red]{myclass}将提供通常的预定义颜色主题
  • \documentclass[maincolor = green]{myclass}允许用户提供自己的颜色

我尝试了以下操作:

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

其产生以下输出:

  • \documentclass{myclass}\begin{document}\printcolor\end{document} => blue [好的]
  • \documentclass[maincolor = green]{myclass}\begin{document}\printcolor\end{document} => green [好的]
  • \documentclass[maincolor = red]{myclass}\begin{document}\printcolor\end{document} => red [好的]
  • \documentclass[red]{myclass}\begin{document}\printcolor\end{document} => blue [问题]

传统的课程选项不起作用。


问题:如何在这种情况下混合使用 pgfopts 和传统的类选项,以提供预定义行为和\documentclass[someoption]{myclass}可自定义行为的灵活性\documentclass[somekey = someoption]{myclass}

答案1

如果您愿意坚持,pgfopts您可以使用一个.style键来red设置您的maincolor,例如使用以下类代码:

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

但正如 David 在评论中所建议的那样,使用不同的 key=value 系统可能是一个更好的主意。以下使用内核命令\DeclareKeys\SetKeys\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$}}}

但我个人更喜欢expkv-opt(好吧,我写了它......)。expkv你可以定义不接受值的键,从而提供比and.value forbidden支持的方法更强的区分(虽然在大多数情况下这不是很相关,但理论上你可以用这种方式为有值或无值的键定义完全不同的行为)。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$}}}

答案2

你可以使用

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

因此声明red为 pgf(非经典)选项。

相关内容