Кто-нибудь знает способ определить, работает ли он в 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
, но это было бы весьма предосудительно.