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....
\relax
e-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
が、それは非常に非難されるべきことです。