Sie sind hier

Was kann ich gegen Fehlermeldungen wegen nicht definiertem \ifpdftex, \ifVTeX oder \ifundefinedorrelax tun?

Bild von Markus Kohm

Teilweise seit fast 20 Jahren befanden sich in KOMA-Script die LaTeX-Anweisungen \ifpdftex und \ifVTeX. Beide arbeiteten als Befehle mit zwei Argumenten. Seit iftex Version 1.0 definiert aber dieses Paket und damit auch die neue Versionen der darauf basierenden Wrapper-Pakete wie ifpdf, ifvtex, ifluatex etc. diese beiden Anweisungen als TeX-Verzweigung der Form \if… … \fi. Diese Definitionen sind inkompatibel. Die frühere langjährige Übereinkunft zwischen den Paketautoren wurde damit zugunsten einer Vereinheitlichung aufgegeben.

Aus dem Kreis von The LaTeX Project Team kam darüber hinaus die dringende Empfehlung nur Verzweigungen in TeX-Stil: \if… … \fi mit \if zu beginnen und für LaTeX-Anweisungen mit Argument wie beispielsweise bei \IfFileExists einen Befehlsnamen mit \If, also groß geschriebenem »I« am Anfang zu verwenden. Zwar wurde in iftex ein Workaround eingebaut, allerdings lässt dieser weiterhin befürchten, dass dadurch andere Pakete und Internet-Lösungen, die auf den von iftex neu definierten Anweisungen basieren, langfristig inkompatibel mit KOMA-Script werden. Um dies zu vermeiden und um der Empfehlung von The LaTeX Project Team zu folgen wurde an dieser Stelle Kompatibilität von KOMA-Script ab Version 3.28 mit früheren Versionen von KOMA-Script aufgegeben. Die beiden Anweisungen werden von scrbase nicht mehr definiert.

Besteht in existierenden Dokumenten eine Verzweigung wie:

\documentclass{scrartcl}
\ifpdftex{%
  \pdfcompresslevel=9
}{%
  \typeout{This is not PDFTeX!}
}

so wird empfohlen, stattdessen das Paket iftex in aktueller Version zu verwenden:

\documentclass{scrartcl}
\usepackage{iftex}
\ifPDFTeX
  \pdfcompresslevel=9
\else
  \typeout{This is not PDFTeX!}
\fi

Der Befehle mit zwei Argumenten ist also, wie im Beispiel gezeigt, in die TeX-Syntax mit \else und \fi zu überführen. War das zweite Argument bisher leer, so kann auch das \else (aber niemals \fi) entfallen.

Natürlich wäre es insgesamt besser, im gezeigten Beispiel gar nicht auf die TeX-Engine PDFTeX, sondern auf die Existenz von \pdfcompresslevel zu testen:

\documentclass{scrartcl}
\Ifundefinedorrelax{pdfcompresslevel}{%
  \typeout{This is not PDFTeX!}
}{%
  \pdfcompresslevel=9
}

Die in diesem Beispiel verwendete Anweisung \Ifundefinedorrelax ist übrigens ebenfalls ein Ergebnis der Änderung und das veraltete \ifundefinedorrelax ist nun ebenfalls undefiniert. Es geht aber auch ohne KOMA-Script mit LaTeX-Mitteln:

\documentclass{article}
\makeatletter
\@ifundefined{pdfcompresslevel}{%
  \typeout{This is not PDFTeX!}
}{%
  \pdfcompresslevel=9
}
\makeatother

Natürlich bin ich mir bewusst, dass solche Tests nicht in jedem Fall möglich sind und manchmal ein Test auf die TeX-Engine tatsächlich die einzig sinnvolle Möglichkeit darstellt.

Sollte der entsprechende Code in Klassen oder Paketen enthalten sein, die auf scrbase basieren, so ist zunächst zu prüfen, ob es bereits eine neue Version ohne dieses Problem gibt. Anderenfalls ist der entsprechende Klassen- oder Paket-Autor zu informieren und um Abhilfe zu bitten. Sollte das fehlschlagen und nur dann, ist folgender Code als absolute Notlösung auch vor dem Laden einer eventuell betroffenen Klasse verwendbar:

% ACHTUNG: Notlösung! Bitte nur als letzte Rettung und kurzzeitig verwenden!
\RequirePackage{iftex}
\makeatletter
\def\ifpdftex{\ifPDFTeX \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi}
\def\ifVTeX{\ifvtex \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi}
\makeatother

Allerdings kann es mit diesem Code langfristig zu den eingangs erwähnten Problemen mit neuen Paketen oder neuen Versionen von Paketen oder Code aus dem Internet oder anderen Quellen kommen. Daher rate ich von der dauerhaften Verwendung dieser Notlösung ab!

Comments for "Was kann ich gegen Fehlermeldungen wegen nicht definiertem \ifpdftex, \ifVTeX oder \ifundefinedorrelax tun?" abonnieren