Ich habe eine seltsame Interaktion zwischen den optionalen Parametern in \documentclass
und \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 \documentclass
Befehl 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 \@fileswithoptions
nimmt 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@space
ist
% latex.ltx, line 7764:
\def\zap@space#1 #2{%
#1%
\ifx#2\@empty\else\expandafter\zap@space\fi
#2}
Beim ersten Aufruf #1
ist 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 \fi
sie \ifdraftversion
und entfernt sie.
Wenn Sie verwenden \else\fi
, erfolgt der Vergleich zwischen diesen beiden; Sie könnten auch \relax\fi
oder verwenden \whateverevenundefined\fi
.
An dieser Stelle wird das Ungleichgewicht \fi
deutlich. 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\fi
nurscheintzu 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}