有人知道检测一个人是在运行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,定义了
\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
,但那将是非常应受谴责的事情。