在文檔類別可選參數中使用條件時出錯

在文檔類別可選參數中使用條件時出錯

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

相關內容