有誰知道一種方法來檢測一個人是在跑步pdfTeX
還是高德納的TeX
?我希望能夠在使用 建置文件時有條件地包含額外功能pdfTex
,但也支援原始功能TeX
作為後備。
就像是
\ifdefined\pdfpagewidth
\pdfpagewidth 8.5 true in
\pdfpageheight 11 true in
\fi
會完成工作——但是上面的內容依賴於e-TeX
擴展,而不是建立在 Knuth 之上TeX
。
謝謝
答案1
像這樣的東西嗎?
由於\csname foo\endcsname
擴展為\relax
if\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
,但這將是非常值得譴責的事情。