패키지 옵션을 선언하고 패키지를 로드하면 "옵션 섹션" 오류가 발생합니다.

패키지 옵션을 선언하고 패키지를 로드하면 "옵션 섹션" 오류가 발생합니다.

몇 가지 옵션이 포함된 패키지를 만들려고 합니다. 그러나 옵션을 선언하고 다른 패키지를 로드할 때마다 다음 오류가 발생합니다.

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스타일 파일은 세 부분으로 나뉩니다.

  1. 사전 옵션 섹션(첫 번째 위 \DeclareOption);

  2. 옵션 섹션(첫 번째 \DeclareOption와 사이 \ProcessOptions); 그리고

  3. 사후 옵션 섹션(후에 \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

관련 정보