Fehler bei der Verwendung von Bedingungen im optionalen Argument der Dokumentklasse

Fehler bei der Verwendung von Bedingungen im optionalen Argument der Dokumentklasse

Ich habe eine seltsame Interaktion zwischen den optionalen Parametern in \documentclassund \if-Anweisungen festgestellt. Aus irgendeinem Grund wird der Code kompiliert, wenn eine Anweisung vorhanden ist \else, auch wenn diese keinen Inhalt hat:

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

Obwohl dieser Workaround nicht besonders aufwändig ist, konnte ich den eigentlichen Fehler nicht isolieren oder herausfinden, was ich missverstanden habe. Gibt es einen Grund, warum ich aufgrund meiner Intuition eine ungültige Syntax verwende, und wenn ja, wo/was/warum?

Antwort1

Der \documentclassBefehl führt eine gewisse Buchhaltung durch und ruft dann

\@fileswithoptions\@clsextension

Zu diesem Zeitpunkt wurden die Optionen und das Argument noch nicht betrachtet. Das Makro \@fileswithoptionsnimmt sein Argument auf und schaut dann, ob [es folgt. Nach dieser Entscheidung führt es aus

\@fileswith@ptions\@clsextension[<options>]{article}

die nach einem weiteren optionalen Argument sucht; am Ende kommen wir zu

\@fileswith@pti@ns\@clsextension[<options>]{article}[]

weil Sie das nachfolgende optionale Argument nicht angeben. Dieses Makro

\xdef\@classoptionslist{\zap@space<options> \@empty}

also sollten wir fragen, was passiert, wenn wir es mit Ihren Optionen tun. Nach der Tokenisierung erhalten wir

\zap@space \iffullversion twoside, \fi\ifdraftversion draft, \fi 11pt \@empty

Die Definition von \zap@spaceist

% latex.ltx, line 7764:
\def\zap@space#1 #2{%
  #1%
  \ifx#2\@empty\else\expandafter\zap@space\fi
  #2}

Beim ersten Aufruf #1ist leer, also erhalten wir

\zap@space\iffullversion twoside, \fi\ifdraftversion draft, \fi 11pt \@empty

Dies lässt \iffulversion twoside,den Eingabestrom drin und führt dann

\ifx\fi\ifdraftversion draft, \fi 11pt \@empty

Können Sie sehen, was schief läuft? Der Bedingungssatz vergleicht \fisie \ifdraftversionund entfernt sie.

Wenn Sie verwenden \else\fi, erfolgt der Vergleich zwischen diesen beiden; Sie könnten auch \relax\fioder verwenden \whateverevenundefined\fi.

An dieser Stelle wird das Ungleichgewicht \fideutlich. In Ihrer Anwendung wird der Fehler erst später entdeckt, aber dies sollte ausreichen, um zu erklären, dass Bedingungssätze in den Klassenoptionen zu vermeiden sind.

Das funktioniert übrigens:

\newif\ifdraftversion \draftversionfalse
\newif\iffullversion  \fullversionfalse
\def\safetybelt{\empty}

\documentclass[%
  \safetybelt\iffullversion  twoside,\fi
  \safetybelt\ifdraftversion draft,\fi
  11pt
]{article}

Antwort2

Der "Workaround" mit \else\finurscheintzu arbeiten. Ihre Optionen werden an den Kommas getrennt, Sie haben also die Optionen \iffullversion twoside, \fi\ifdraftversion draft, und \fi 11pt.

Der folgende Codescheintwie erwartet funktionieren (nur experimentell überprüft):

\documentclass[
  \iffullversion  twoside\fi, %works if the \fi here are
  \ifdraftversion draft\fi, % \else\fi instead
  11pt
]{article}

verwandte Informationen