문서 클래스 선택적 인수에서 조건문을 사용할 때 오류가 발생합니다.

문서 클래스 선택적 인수에서 조건문을 사용할 때 오류가 발생합니다.

\documentclass선택적 매개변수 on 과 \if문 사이에 이상한 상호 작용이 발생했습니다 . 어떤 이유로 \else든 내용이 없더라도 명령문이 있으면 코드가 컴파일됩니다.

\newif\ifdraftversion \draftversionfalse
\newif\iffullversion  \fullversionfalse

\documentclass[
  \iffullversion  twoside,  \fi %works if the \fi here are
  \ifdraftversion draft,    \fi % \else\fi instead
  11pt
]{article}

\begin{document}
This is a MWE, although it generates an extra warning that would
disappear if I added substantially more content to the document
\end{document}

이 해결 방법이 특별히 번거롭지는 않지만 관련된 실제 버그를 분리하거나 제가 잘못 이해한 부분을 해결할 수 없었습니다. 내 직관으로 인해 잘못된 구문을 사용하게 된 데에는 어떤 이유가 있습니까? 그렇다면 어디서/무엇을/왜?

답변1

\documentclass명령은 일부 장부를 수행한 다음 호출합니다.

\@fileswithoptions\@clsextension

이 시점에서는 옵션과 인수가 아직 검토되지 않았습니다. 매크로는 \@fileswithoptions해당 인수를 흡수한 다음 [다음과 같은지 여부를 확인합니다. 이 결정 후에는 실행됩니다.

\@fileswith@ptions\@clsextension[<options>]{article}

추가 선택적 인수를 찾습니다. 결국 우리는 도착한다

\@fileswith@pti@ns\@clsextension[<options>]{article}[]

후행 선택적 인수를 지정하지 않았기 때문입니다. 이 매크로는

\xdef\@classoptionslist{\zap@space<options> \@empty}

그러니 우리가 당신의 선택에 따라 그렇게 하면 어떻게 되는지 물어봐야 합니다. 토큰화 후에 우리는

\zap@space \iffullversion twoside, \fi\ifdraftversion draft, \fi 11pt \@empty

의 정의 \zap@space

% latex.ltx, line 7764:
\def\zap@space#1 #2{%
  #1%
  \ifx#2\@empty\else\expandafter\zap@space\fi
  #2}

첫 번째 호출의 경우 #1비어 있으므로 다음을 얻습니다.

\zap@space\iffullversion twoside, \fi\ifdraftversion draft, \fi 11pt \@empty

이것은 \iffulversion twoside,입력 스트림으로 떠난 다음 수행됩니다.

\ifx\fi\ifdraftversion draft, \fi 11pt \@empty

무엇이 잘못되었는지 알 수 있나요? 조건부는 비교 \fi하고 \ifdraftversion제거합니다.

을 사용하면 \else\fi이 둘을 비교하게 됩니다. \relax\fi또는 을 사용할 수 있습니다 \whateverevenundefined\fi.

이 시점에서 불균형이 \fi분명해집니다. 애플리케이션에서 오류는 나중에 발견되지만 이는 클래스 옵션의 조건문을 피해야 한다는 점을 설명하기에 충분합니다.

그건 그렇고, 이것은 작동합니다 :

\newif\ifdraftversion \draftversionfalse
\newif\iffullversion  \fullversionfalse
\def\safetybelt{\empty}

\documentclass[%
  \safetybelt\iffullversion  twoside,\fi
  \safetybelt\ifdraftversion draft,\fi
  11pt
]{article}

답변2

\else\fi다음 을 사용하는 "해결 방법"것 같다일하다. 옵션은 쉼표로 구분되어 있으므로 , 및 옵션 \iffullversion twoside\fi\ifdraftversion draft있습니다 \fi 11pt.

다음 코드것 같다예상대로 작동하려면(실험으로만 확인):

\documentclass[
  \iffullversion  twoside\fi, %works if the \fi here are
  \ifdraftversion draft\fi, % \else\fi instead
  11pt
]{article}

관련 정보