\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}