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