条件付きインクルードでpdfTeXまたはKnuthのTeXのどちらで実行されているかを検出する

条件付きインクルードでpdfTeXまたはKnuthのTeXのどちらで実行されているかを検出する

pdfTeXで実行されているのか、それとも Knuth の で実行されているのかを検出する方法を誰か知っていますかTeX? ドキュメントが を使用して構築されているときに条件付きで追加機能を含められるようにしたいのですpdfTexが、TeXフォールバックとしてオリジナルもサポートしたいと思います。

何かのようなもの

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

目的は達成できるでしょう。ただし、上記はe-TeX拡張機能に依存しており、Knuth に基づいていませんTeX

ありがとう

答え1

このようなもの?

が定義されていない場合は\csname foo\endcsnameが に展開されるため、 を使用してコマンドシーケンスが と等しいかどうかを比較することができます。これはまったく必要ありません。\relax\foo\ifx....\relaxe-TeX

\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

コンパイルするとtex以下の画像が得られます。

ここに画像の説明を入力してください

答え2

あなたはイフテックス「パッケージ」。ドキュメントによると

この非常にシンプルなパッケージは、Plain TeX と LaTeX の両方に対して、タイプセッティングに PDFTeX、XeTeX、または LuaTeX が使用されているかどうかをテストするための、、\ifPDFTeXおよび\ifXeTeXブール値を定義します。\ifLuaTeX

答え3

Knuth TeX と (または LuaTeX) のみを区別するつもりであればpdftex、次のようにします。

\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

1 つの仮定が立てられています: 以前のマクロ ファイルまたはロードされた形式では が定義されていません\pdftexversion。 が XeTeX でも正しい真理値を返すようにしたい場合は\ifknuthtex、 をロードできます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

答え4

あなたの問題については、次のことが強く疑われます:

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

実質的には、これで十分です。複雑にする必要はありません。

アプローチに基づくソリューション\csname..\endcsnameには、実際には作成する\relax制御シーケンスが事前に存在していなかった場合、意味を持つ制御シーケンスになります。そのため、一連の を使って\expandafterこの意味を短時間だけ存在させ、\ifxテスト後に消えるようにするトリックが行われます。ただし、TeX メモリには、このように短時間存在する制御シーケンスに対しても新しいエントリが作成されます。これは、ソース コードに書き込むという単純な事実\pdfpagewidth(コメント アウトされていない場合) でも同様です。

\csname..\endcsname残念ながら、コードが前述の予防措置を講じずにこのアプローチを実行すると、\ifx\pdfpagewidth\undefined上記の簡単なテストは機能しなくなります。これが、人々がこのテストを推奨したがらない主な理由だと思います。LaTeX が\@ifundefinedまさにこの問題を引き起こすことを認識する必要があります。ただし、最新のインストールでは、latex実行可能ファイルはバイナリを使用しているためpdftex(特定のe-TeX拡張機能が有効になっている場合)、これは Knuth TeX ではありません。より古いインストールでは、当然、Knuth TeX + LaTeX 形式を使用できます。

また、場合によっては (IDE の表示方法によっては) Knuth TeX を実行していると思われることもありますtexが、実際にはpdftex dvi 出力モードであることに注意してください。

\ifx\pdfpagewidth\undefined、 に意味を与えた以前のコードによって危険にさらされる可能性もあります\undefinedが、それは非常に非難されるべきことです。

関連情報