
Я пытаюсь смешать 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 (не классический) вариант.