von KOMA » Di 7. Apr 2009, 08:59
Ergänzend möchte ich »
Das LaTeX2e-Sündenregister« empfehlen. Wenn nämlich der Rest der Vorlage des Kumpels genauso schrecklich ist, wie das gezeigte Codestück, dann ist es dringend geboten, diese zu entrümpeln. Ich würde ja fast dazu neigen, die Vorlage (zumindest deren Präambel) einfach wegzuwerfen und ein neues Dokument von 0 aufzubauen. Da sind dann wenigstens nur die Pakete und Definitionen drin, die wirklich benötigt werden.
Mehr als die Hälfte der Vorlagen, die so herumgeistern, sind leider Vorlagen für unwissentlich eingehandelte Probleme. Schönes Beispiel ist der PDF-Testcode, den man leider noch immer sehr häufig sieht, obwohl er nicht nur unbrauchbar, sondern ggf. sogar schädlich ist. Ich werde den deshalb mal ausführlich kommentieren:
% ACHTUNG: DAS HIER KEINESFALLS MACHEN!
\newif\ifpdf
Es wird eine neue Verzweigung deklariert. Voreingestellt ist \ifpdf mit \iffalse. Verwendet wird diese Verzweigung in der Form: \ifpdf
wenn \ifpdf \iftrue ist, verwende das hier \else
wenn \ifpdf \iffalse ist, verwende das hier \fi.
Das bedeutet:
Wenn die Anweisung \pdfoutput in der gleichen Weise wie die Anweisung \undefined expandiert, dann führe aus. \pdfoutput ist eine Anweisung, die nur bei pdfTeX existiert. Bei pdfTeX gibt sie an, ob die Ausgabe als DVI (\pdfputput=0) oder PDF (\pdfoutput=1) erfolgen soll. Nun verwenden alle modernen TeX-Systeme pdfTeX nicht nur für pdflatex, also für die PDF-Ausgabe, sondern auch für latex, also die DVI-Ausgabe. Demnach ist \pdfoutput bei modernen Systemen immer definiert und deshalb wird:
nie ausgeführt. Die Anweisung hätte man sich ohnehin sparen können, weil sie lediglich \ifpdf zu \iffalse macht, was ja der Voreinstellung entspricht. Jetzt kommt aber
Das bedeutet:
Wenn die vorherige Bedingung nicht erfüllt ist, also \pdfoutput nicht in gleicher Weise wie \undefined expandiert, dann führe aus. Wie wir bereits wissen ist \pdfoutput definiert. Wenn also nicht gerade ungeschickter Weise \undefined auf \pdfoutput gesetzt ist, dann wird immer dieser Teil ausgeführt.
Es wird also immer auf PDF-Ausgabe umgeschaltet
und immer \ifpdf zu \iftrue.
Letztlich führt der Code also dazu, dass auch beim Aufruf von latex (statt pdflatex) keine DVI-Ausgabe, sondern eine PDF-Ausgabe erzeugt wird. Dabei wird auch noch der Nachteil in Kauf genommen, dass ggf. zuvor geladene Pakete und die Klasse das überhaupt nicht mitbekommen. Wenn man schon \pdfoutput ändert, sollte man das nämlich ganz am Anfang noch vor dem Laden der Klasse machen. Man kann diesen Code also bestenfalls als sehr ungeschickt bezeichnen. Tatsächlich ist es schon fahrlässig so etwas weiterzugeben.
KOMA-Script bietet seit Jahren für die Fallunterscheidung, ob PDF-Output erfolgen soll oder nicht, die Anweisung \ifpdfoutput (siehe KOMA-Script-Anleitung). Desweiteren gibt es mit
ifpdf ein Paket, das einen vernünftigen pdfTeX-Test mit anschließend brauchbarem \ifpdf bietet.
Wie Stefan schon erklärt hat, benötigt man die ganze Fallunterscheidung für das Laden von Paketen wie graphics, graphicx, color, xcolor oder hyperref aber ohnehin nicht, weil diese nicht nur pdfTeX und dessen aktuellen Ausgabemodus, sondern auch VTeX und dessen Ausgabemodi in der Regel selbst erkennen.
Ergänzend möchte ich »[url=http://www.golatex.de/wiki/index.php?title=Wichtige_Netzdokumente]Das LaTeX2e-Sündenregister[/url]« empfehlen. Wenn nämlich der Rest der Vorlage des Kumpels genauso schrecklich ist, wie das gezeigte Codestück, dann ist es dringend geboten, diese zu entrümpeln. Ich würde ja fast dazu neigen, die Vorlage (zumindest deren Präambel) einfach wegzuwerfen und ein neues Dokument von 0 aufzubauen. Da sind dann wenigstens nur die Pakete und Definitionen drin, die wirklich benötigt werden.
Mehr als die Hälfte der Vorlagen, die so herumgeistern, sind leider Vorlagen für unwissentlich eingehandelte Probleme. Schönes Beispiel ist der PDF-Testcode, den man leider noch immer sehr häufig sieht, obwohl er nicht nur unbrauchbar, sondern ggf. sogar schädlich ist. Ich werde den deshalb mal ausführlich kommentieren:
[code]% ACHTUNG: DAS HIER KEINESFALLS MACHEN!
\newif\ifpdf[/code]
Es wird eine neue Verzweigung deklariert. Voreingestellt ist \ifpdf mit \iffalse. Verwendet wird diese Verzweigung in der Form: \ifpdf [i]wenn \ifpdf \iftrue ist, verwende das hier[/i] \else [i]wenn \ifpdf \iffalse ist, verwende das hier[/i] \fi.
[code]\ifx\pdfoutput\undefined[/code]
Das bedeutet: [i]Wenn die Anweisung \pdfoutput in der gleichen Weise wie die Anweisung \undefined expandiert, dann führe aus.[/i] \pdfoutput ist eine Anweisung, die nur bei pdfTeX existiert. Bei pdfTeX gibt sie an, ob die Ausgabe als DVI (\pdfputput=0) oder PDF (\pdfoutput=1) erfolgen soll. Nun verwenden alle modernen TeX-Systeme pdfTeX nicht nur für pdflatex, also für die PDF-Ausgabe, sondern auch für latex, also die DVI-Ausgabe. Demnach ist \pdfoutput bei modernen Systemen immer definiert und deshalb wird:
[code]\pdffalse[/code]
nie ausgeführt. Die Anweisung hätte man sich ohnehin sparen können, weil sie lediglich \ifpdf zu \iffalse macht, was ja der Voreinstellung entspricht. Jetzt kommt aber
[code]\else[/code]
Das bedeutet: [i]Wenn die vorherige Bedingung nicht erfüllt ist, also \pdfoutput nicht in gleicher Weise wie \undefined expandiert, dann führe aus[/i]. Wie wir bereits wissen ist \pdfoutput definiert. Wenn also nicht gerade ungeschickter Weise \undefined auf \pdfoutput gesetzt ist, dann wird immer dieser Teil ausgeführt.
[code]\pdfoutput=1[/code]
Es wird also immer auf PDF-Ausgabe umgeschaltet
[code]\pdftrue
\fi[/code]
und immer \ifpdf zu \iftrue.
Letztlich führt der Code also dazu, dass auch beim Aufruf von latex (statt pdflatex) keine DVI-Ausgabe, sondern eine PDF-Ausgabe erzeugt wird. Dabei wird auch noch der Nachteil in Kauf genommen, dass ggf. zuvor geladene Pakete und die Klasse das überhaupt nicht mitbekommen. Wenn man schon \pdfoutput ändert, sollte man das nämlich ganz am Anfang noch vor dem Laden der Klasse machen. Man kann diesen Code also bestenfalls als sehr ungeschickt bezeichnen. Tatsächlich ist es schon fahrlässig so etwas weiterzugeben.
KOMA-Script bietet seit Jahren für die Fallunterscheidung, ob PDF-Output erfolgen soll oder nicht, die Anweisung \ifpdfoutput (siehe KOMA-Script-Anleitung). Desweiteren gibt es mit [url=http://ctan.org/pkg/ifpdf]ifpdf[/url] ein Paket, das einen vernünftigen pdfTeX-Test mit anschließend brauchbarem \ifpdf bietet.
Wie Stefan schon erklärt hat, benötigt man die ganze Fallunterscheidung für das Laden von Paketen wie graphics, graphicx, color, xcolor oder hyperref aber ohnehin nicht, weil diese nicht nur pdfTeX und dessen aktuellen Ausgabemodus, sondern auch VTeX und dessen Ausgabemodi in der Regel selbst erkennen.