在 Plain TeX 中,是否可以根据翻译引擎有条件地执行语句?

在 Plain TeX 中,是否可以根据翻译引擎有条件地执行语句?

请注意,这个问题是关于 Plain TeX 的,不是LaTeX.考虑以下示例。

\pdfpagewidth 8.5 in
\pdfpageheight 11 in

foobar
\bye

在 下,这将正常工作。但是,如果我尝试在其上pdftex运行,这将引发以下严重错误。tex

! Undefined control sequence.
l.1 \pdfpagewidth
                  8.5 in

tex是否可以编写我的文档,以便它在而不是下运行时不会执行这两行pdftex

答案1

可执行tex文件运行“原始 Knuth TeX”,而它\pdfpagewidth是一个pdftex原始的。

通常

\begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname pdfpagewidth\endcsname\relax
  \else
    \pdfpagewidth 8.5 truein
    \pdfpageheight 11 truein
  \fi

就可以了。之后,如果它们一开始没有被定义,就不会被定义\pdfpagewidth\pdfpageheight

请注意,有些 LaTeX 软件包也可以与 Plain TeX 一起使用。您可以考虑这些软件包ifetex,因为 Knuth TeX 的一个显著特点是没有 e-TeX 扩展。因此您可以这样做

\input ifetex.sty

并做

\ifetex
  <code for non Knuth TeX>
\else
  <code for Knuth TeX>
\fi

可以<code for non Knuth TeX>通过使用来区分 PDF 和 DVI 输出

\input ifpdf.sty

和提供的\ifpdf条件。还有ifxetex.styifluatex.sty;它们都可以用 以 Plain 形式加载\input if<...>.sty

还有“all-in-one”包iftex.sty,但其实现对于ifpdfifxetex和来说非常基础ifluatex。它不提供任何检查 e-TeX 扩展的方法。

相关内容