Возможно ли условное выполнение операторов на основе движка перевода в 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.styи ifluatex.sty; все они могут быть загружены в Plain с помощью \input if<...>.sty.

Есть также пакет «все в одном» iftex.sty, но его реализация действительно базовая по отношению к ifpdf, ifxetexи ifluatex. Он не предоставляет никаких возможностей для проверки расширений e-TeX.

Связанный контент