몇 가지 옵션이 포함된 패키지를 만들려고 합니다. 그러나 옵션을 선언하고 다른 패키지를 로드할 때마다 다음 오류가 발생합니다.
LaTeX 오류:
\RequirePackage
또는\LoadClass
옵션 섹션에 있습니다.
여기서 무슨 일이 일어나고 있는지 및/또는 패키지 옵션을 어떻게 선언합니까?그리고패키지를 로드하시겠습니까?
다음은 문제를 재현하는 최소한의 예입니다.
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{mystyle.sty}
\newcommand{\mycmd}{new}% Define some command
\DeclareOption{change}{\renewcommand{\mycmd}{renew}}% Package option `change` updates \mycmd
\RequirePackage{amsmath}% Load amsmath
\end{filecontents*}
\usepackage{mystyle}
\begin{document}
\mycmd% This should be "new"
\end{document}
답변1
를 사용하는 순간 \DeclareOption
스타일 파일은 세 부분으로 나뉩니다.
사전 옵션 섹션(첫 번째 위
\DeclareOption
);옵션 섹션(첫 번째
\DeclareOption
와 사이\ProcessOptions
); 그리고사후 옵션 섹션(후에
\ProcessOptions
).
그 안에 무엇이 들어있든 간에사전 옵션 섹션이미 처리되었습니다. 따라서 유일한 문제는 이 지점을 넘어서는 콘텐츠에서 발생합니다.
일부 옵션을 기반으로 패키지(또는 클래스)를 조건부로 로드할 가능성이 있기 때문에패키지(또는 클래스)가 로드되면 작업을 "실행 취소"할 수 없습니다., \RequirePackage
(또한 \usepackage
)은 내부에서 사용되는 경우 오류를 호출합니다.옵션 섹션. 다음은 조건부로 패키지를 로드하기로 결정하는 방법에 대한 예입니다.
\newif\if@loadhyperref %\@loadhyperreffalse
\DeclareOption{hyperref}{\@loadhyperreftrue}
\if@loadhyperref
\RequirePackage{hyperref}
\fi
당신은해야 할 것입니다\ProcessOptions
~ 전에 \RequirePackage
(위의 경우 if 조건 외부) 위 코드가 성공하려면 일반적으로 \ProcessOptions
자신을 다음 상황에 놓기 위해 발행하십시오.사후 옵션 섹션더 많은 패키지(또는 클래스)를 로드하기 전에.
특정 예에서는 다음과 같이 변경하면 mystyle.sty
충분합니다.
\newcommand{\mycmd}{new}
\DeclareOption{change}{\renewcommand{\mycmd}{renew}}
\ProcessOptions% Process package options
\RequirePackage{amsmath}% Load amsmath