\documentclass
我在和語句的可選參數之間遇到了奇怪的互動\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}