Определить, работает ли pdfTeX или Knuth's TeX для условного включения

Определить, работает ли pdfTeX или Knuth's TeX для условного включения

Кто-нибудь знает способ определить, работает ли он в pdfTeXили Кнута TeX? Я хочу иметь возможность условно включать дополнительные функции, когда документ создается с использованием pdfTex, но также поддерживать оригинал TeXв качестве запасного варианта.

Что-то вроде

\ifdefined\pdfpagewidth
\pdfpagewidth 8.5 true in
\pdfpageheight 11 true in
\fi

справился бы с этой задачей, однако вышеизложенное опирается на e-TeXрасширения и не основывается на Кнуте 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, но это было бы весьма предосудительно.

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