
나는 사용자 정의 클래스를 만들기 위해 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
수 있습니다 ..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가 의견에서 제안한 것처럼 다른 키=값 시스템을 사용하는 것이 더 나은 아이디어일 수 있습니다. 다음은 커널 명령 \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
에서 지원하는 접근 방식 보다 더 강력한 차별화를 제공할 수 있습니다 . (대부분의 경우 이는 그다지 관련성이 없지만 이론적으로는 유무에 관계없이 키에 대해 완전히 다른 동작을 정의할 수 있습니다. 이 방법으로 값을 지정합니다).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(클래식 아님) 옵션으로 선언합니다.