Ermitteln, ob pdfTeX oder Knuth's TeX für bedingtes Einschließen verwendet wird

Ermitteln, ob pdfTeX oder Knuth's TeX für bedingtes Einschließen verwendet wird

Kennt jemand eine Möglichkeit, festzustellen, ob eines in pdfTeXoder Knuths ausgeführt wird TeX? Ich möchte in der Lage sein, zusätzliche Funktionen bedingt einzuschließen, wenn ein Dokument mit erstellt wird pdfTex, aber auch das Original TeXals Fallback unterstützen.

Etwas wie

\ifdefined\pdfpagewidth
\pdfpagewidth 8.5 true in
\pdfpageheight 11 true in
\fi

würde die Aufgabe erledigen -- allerdings basiert das Obige auf den e-TeXErweiterungen und baut nicht auf Knuth auf TeX.

Danke

Antwort1

Etwas wie das?

Da \csname foo\endcsnamezu erweitert wird, \relaxwenn \foonicht definiert ist, ist es möglich, \ifx....die Befehlssequenz zu vergleichen und als gleich zu verwenden \relax. Dies ist e-TeXüberhaupt nicht erforderlich.

\newif\ifknuthtex
\expandafter\ifx\csname pdfpagewidth\endcsname\relax
\knuthtextrue
\else
\pdfpagewidth 8.5 true in
\pdfpageheight 11 true in
\fi

This is \ifknuthtex Knuth's \TeX\else pdfTeX\fi
\bye

Durch Kompilieren mit texwird das folgende Bild erstellt.

Bildbeschreibung hier eingeben

Antwort2

Du kannst den ... benutzeniftex"Paket". Laut Dokumentation

Dieses sehr einfache Paket für Plain TeX und LaTeX definiert die Booleschen Werte \ifPDFTeX, \ifXeTeX, und \ifLuaTeXzum Testen, ob PDFTeX, XeTeX oder LuaTeX für den Schriftsatz verwendet wird.

Antwort3

Wenn Sie nur zwischen Knuth TeX und (oder LuaTeX) unterscheiden möchten pdftex, können Sie dies folgendermaßen tun:

\begingroup\escapechar=-1
\edef\undefined{\string\undefined}%
\edef\test{\meaning\pdftexversion}%
\expandafter\endgroup\expandafter\let\expandafter\ifknuthtex
\csname if\ifx\undefined\test true\else false\fi\endcsname

\ifknuthtex
  \message{Knuth TeX}
\else
  \message{Not Knuth TeX}
\fi

Eine Annahme wird gemacht: dass keine vorherige Makrodatei oder geladenes Format definiert \pdftexversion. Wenn Sie möchten, dass \ifknuthtexauch mit XeTeX der korrekte Wahrheitswert zurückgegeben wird, können Sie laden ifxetex:

\input ifxetex.sty
\begingroup\escapechar=-1
\edef\undefined{\string\undefined}%
\edef\test{\meaning\pdftexversion}%
\expandafter\endgroup\expandafter\let\expandafter\ifknuthtex
\csname if%
  \ifnum 0=%
    \ifx\undefined\test 0\else 1\fi
    \ifxetex 1\fi
    true\else false\fi
\endcsname

\ifknuthtex
  \message{Knuth TeX}
\else
  \message{Not Knuth TeX}
\fi

Antwort4

Bezüglich Ihres Problems vermute ich stark, dass:

\ifx\pdfpagewidth\undefined
\else
  \pdfpagewidth 8.5 true in
  \pdfpageheight 11 true in
\fi

ist im Grunde genommen völlig ausreichend. Es besteht kein Bedarf für Komplikationen.

Lösungen, die auf einem \csname..\endcsnameAnsatz basieren, haben den Nachteil, dass sie tatsächlicherstelleneine Steuersequenz mit Bedeutung \relax, wenn die Steuersequenz vorher nicht existierte. Daher wenden manche Leute Tricks an, \expandafterum diese Bedeutung nur kurzzeitig existieren zu lassen und sie dann nach dem \ifxTest verschwinden zu lassen. Der TeX-Speicher wird jedoch auch für eine so kurzzeitig existierende Steuersequenz einen neuen Eintrag haben, ebenso wie die einfache Tatsache, dass sie \pdfpagewidthin Ihren Quellcode geschrieben wird (sofern nicht auskommentiert).

Sobald Code den \csname..\endcsnameAnsatz ohne die erwähnten Vorsichtsmaßnahmen ausführt, funktioniert der einfache \ifx\pdfpagewidth\undefinedTest oben leider nicht mehr. Und das ist, denke ich, der Hauptgrund, warum die Leute zögern, ihn zu empfehlen. Man sollte sich bewusst sein, dass LaTeX \@ifundefinedgenau dieses Problem verursacht. Aber auf modernen Installationen latexverwendet die ausführbare Datei pdftexBinärdateien (mit insbesondere e-TeXaktivierten Erweiterungen), daher handelt es sich nicht um Knuth TeX. Auf älteren Installationen können Sie natürlich das Format Knuth TeX + LaTeX haben.

Beachten Sie auch, dass es manchmal den Anschein erwecken kann (möglicherweise abhängig von der Darstellungsweise Ihrer IDE), dass Knuth TeX ausgeführt wird tex, während es sich in Wirklichkeit pdftex im DVI-Ausgabemodus befindet.

Es \ifx\pdfpagewidth\undefinedkönnte auch durch früheren Code kompromittiert worden sein, der eine Bedeutung gegeben hat \undefined, aber das wäre sehr verwerflich.

verwandte Informationen