Смешиваете традиционные параметры класса и pgfoptions?

Смешиваете традиционные параметры класса и pgfoptions?

Я пытаюсь смешать pgfopts с более классическими опциями, чтобы создать пользовательский класс. Идея в том, что классические опции будут здесь, чтобы предоставить предопределенное поведение, в то время как опции pgfopts будут здесь, чтобы предоставить более настраиваемое поведение.

Например, предположим, что мой класс имеет цветовую опцию с предопределенной опцией "красный", но также предоставляет способ pdfopt вручную задать больше пользовательских цветов. Я имею в виду следующее:

  • \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$}}}

Но как Дэвид предположил в комментариях, возможно, лучше использовать другую систему ключ=значение. Ниже используются команды ядра \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вы можете определить ключи, не принимающие значение как таковое, что даст более сильное различие, чем .value forbiddenподход, поддерживаемый pgfoptsи DeclareKeys(хотя по большей части это не очень актуально, но теоретически вы можете определить совершенно разное поведение для ключа со значением или без него таким образом).

% 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 (не классический) вариант.

Связанный контент