전통적인 수업 옵션과 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 [문제]

기존 수업 옵션이 작동하지 않습니다.


질문:\documentclass[someoption]{myclass}사전 정의된 동작과 사용자 정의 가능한 동작 모두의 유연성을 제공하기 위해 이러한 종류의 컨텍스트에서 pgfopts와 기존 클래스 옵션을 혼합하는 방법\documentclass[somekey = someoption]{myclass}

답변1

계속 유지하려면 예를 들어 다음 클래스 코드를 사용하여 키를 사용하여 을 설정할 pgfopts수 있습니다 ..styleredmaincolor

% 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가 의견에서 제안한 것처럼 다른 키=값 시스템을 사용하는 것이 더 나은 아이디어일 수 있습니다. 다음은 커널 명령 \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
}

그래서 redpgf(클래식 아님) 옵션으로 선언합니다.

관련 정보