von oft gesehener » Mi 22. Jan 2020, 07:43
Da TeX den nicht zutreffenden Zweig eines \if…\else…\fi nicht ausführt, sondern darin nur nach balancierten \if…, \else und \fi Ausschau hält, müssen dafür eben ein paar Bedingungen gelten. So würde beispielsweise bei:
\iffalse
\newif\iftest
\iftest
Ja,
\else
Nein,
\fi
das wird nie ausgeführt.
\fi
das \iftest, das im nicht zutreffenden Zweig definiert wird, für TeX keine \if…-Anweisung und damit würden das \else und \fi danach bereits zum \iffalse gehören. Damit wird »Das wird nie ausgeführt.« eben doch ausgeführt und das zweite \fi wird als Fehler gemeldet:
\documentclass{article}
\begin{document}
\iffalse
\newif\iftest
\iftest
Ja,
\else
Nein,
\fi
das wird nie ausgeführt.
\fi
\end{document}
ergibt also:
und im Dokument steht der Satz »Nein, das wird nie ausgeführt.«
Angewendet auch dein Beispiel wird beim zweiten Einlesen, wenn \aHeader nicht definiert ist, \makeatletter nicht ausgeführt. Damit lautet die Anweisung nicht mehr \ifin@, sondern \ifin. Das ist für TeX keine definierte \if…-Anweisung. Also gehört das \fi dahinter bereits zu \ifdefined\aHeader und beendet dieses. Die weiteren \fi in der Datei sind dann zuviel.
Der Umgang mit \if… ist also weit weniger trivial, als man das auf den ersten Blick vermutet.
In einer Wrapper-Klasse wäre das übrigens in der Tat aus zwei Gründen nicht passiert:
- Man braucht in einer Klasse kein \makeatlettetr, sondern @ sind automatisch Buchstaben.
- LaTeX selbst verhindert das mehrfache Einlesen von Klassen und Paketen.
Dafür muss man in einer Wrapper-Klasse schon mit Patches arbeiten, wenn beispielsweise nach \begin{document} bereits automatisch Satzanweisungen folgen sollen, beispielweise um den Titel auszugeben o. ä. Es gibt jedoch Pakete, die den Klassenautor dabei unterstützen.
Da TeX den nicht zutreffenden Zweig eines [tt]\if…\else…\fi[/tt] nicht ausführt, sondern darin nur nach balancierten [tt]\if…[/tt], [tt]\else[/tt] und [tt]\fi[/tt] Ausschau hält, müssen dafür eben ein paar Bedingungen gelten. So würde beispielsweise bei: [code]\iffalse
\newif\iftest
\iftest
Ja,
\else
Nein,
\fi
das wird nie ausgeführt.
\fi[/code]
das [tt]\iftest[/tt], das im nicht zutreffenden Zweig definiert wird, für TeX keine [tt]\if…[/tt]-Anweisung und damit würden das [tt]\else[/tt] und [tt]\fi[/tt] danach bereits zum [tt]\iffalse[/tt] gehören. Damit wird »[tt]Das wird nie ausgeführt.[/tt]« eben doch ausgeführt und das zweite [tt]\fi[/tt] wird als Fehler gemeldet:
[code]\documentclass{article}
\begin{document}
\iffalse
\newif\iftest
\iftest
Ja,
\else
Nein,
\fi
das wird nie ausgeführt.
\fi
\end{document}[/code] ergibt also: [code]Extra \fi.
l.11 \fi[/code]
und im Dokument steht der Satz »Nein, das wird nie ausgeführt.«
Angewendet auch dein Beispiel wird beim zweiten Einlesen, wenn [tt]\aHeader[/tt] nicht definiert ist, [tt]\makeatletter[/tt] nicht ausgeführt. Damit lautet die Anweisung nicht mehr [tt]\ifin@[/tt], sondern [tt]\ifin[/tt]. Das ist für TeX keine definierte [tt]\if…[/tt]-Anweisung. Also gehört das [tt]\fi[/tt] dahinter bereits zu [tt]\ifdefined\aHeader[/tt] und beendet dieses. Die weiteren [tt]\fi[/tt] in der Datei sind dann zuviel.
Der Umgang mit [tt]\if…[/tt] ist also weit weniger trivial, als man das auf den ersten Blick vermutet.
In einer Wrapper-Klasse wäre das übrigens in der Tat aus zwei Gründen nicht passiert: [list][*]Man braucht in einer Klasse kein [tt]\makeatlettetr[/tt], sondern [tt]@[/tt] sind automatisch Buchstaben.
[*]LaTeX selbst verhindert das mehrfache Einlesen von Klassen und Paketen.[/list]
Dafür muss man in einer Wrapper-Klasse schon mit Patches arbeiten, wenn beispielsweise nach [tt]\begin{document}[/tt] bereits automatisch Satzanweisungen folgen sollen, beispielweise um den Titel auszugeben o. ä. Es gibt jedoch Pakete, die den Klassenautor dabei unterstützen.