检测是否在 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,定义了\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,但那将是非常应受谴责的事情。

相关内容