在文档类可选参数中使用条件时出错

在文档类可选参数中使用条件时出错

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

相关内容