檢測是否在 pdfTeX 或 Knuth's TeX 上運行以進行條件包含

檢測是否在 pdfTeX 或 Knuth's TeX 上運行以進行條件包含

有誰知道一種方法來檢測一個人是在跑步pdfTeX還是高德納的TeX?我希望能夠在使用 建置文件時有條件地包含額外功能pdfTex,但也支援原始功能TeX作為後備。

就像是

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

會完成工作——但是上面的內容依賴於e-TeX擴展,而不是建立在 Knuth 之上TeX

謝謝

答案1

像這樣的東西嗎?

由於\csname foo\endcsname擴展為\relaxif\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

您可以使用IFTEX「包裹」。根據文件

這個非常簡單的包,適用於 Plain TeX 和 LaTeX,定義了\ifPDFTeX\ifXeTeX\ifLuaTeX布林值,用於測試是否使用 PDFTeX、XeTeX 或 LuaTeX 進行排版。

答案3

如果您只想區分 Knuth TeX 和pdftex(或 LuaTeX),可以這樣做:

\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

做出一個假設:之前沒有巨集檔案或載入的格式定義\pdftexversion.如果您希望\ifknuthtex使用 XeTeX 也傳回正確的真值,您可以載入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,但這將是非常值得譴責的事情。

相關內容