Detecte se está executando em pdfTeX ou TeX de Knuth para inclusão condicional

Detecte se está executando em pdfTeX ou TeX de Knuth para inclusão condicional

Alguém sabe uma maneira de detectar se alguém está correndo pdfTeXou de Knuth TeX? Quero poder incluir condicionalmente recursos extras quando um documento estiver sendo criado usando pdfTex, mas também oferecer suporte ao original TeXcomo substituto.

Algo como

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

faria o trabalho - no entanto, o acima depende das e-TeXextensões e não se baseia em Knuth TeX.

Obrigado

Responder1

Algo assim?

Como \csname foo\endcsnameexpande para \relaxif \foonão está definido, é possível usar \ifx....para comparar a sequência de comandos como igual a \relax. Isso não é necessário 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

Compilando com texdá a imagem abaixo.

insira a descrição da imagem aqui

Responder2

Você pode usar oiftex"pacote". De acordo com a documentação

Este pacote muito simples, tanto para Plain TeX quanto para LaTeX, define \ifPDFTeX, \ifXeTeXe \ifLuaTeXbooleano para testar se PDFTeX, ou XeTeX, ou LuaTeX está sendo usado para composição tipográfica.

Responder3

Se você planeja apenas distinguir entre Knuth TeX e pdftex(ou LuaTeX), faça o seguinte:

\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

Uma suposição é feita: que nenhum arquivo de macro anterior ou formato carregado define \pdftexversion. Se você quiser que \ifknuthtexretorne o valor verdade correto também com XeTeX, você pode carregar 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

Responder4

Para o seu problema, suspeito fortemente que:

\ifx\pdfpagewidth\undefined
\else
  \pdfpagewidth 8.5 true in
  \pdfpageheight 11 true in
\fi

é, para todos os efeitos, bastante bom. Não há necessidade de complicações.

As soluções baseadas numa \csname..\endcsnameabordagem têm a desvantagem de, na verdade,criaruma sequência de controle com significado \relax, se a sequência de controle não existisse anteriormente. Conseqüentemente, as pessoas fazem truques com um monte de \expandafter's' para que esse significado exista apenas brevemente e depois desapareça após o \ifxteste. No entanto, a memória TeX terá uma nova entrada, mesmo para uma sequência de controle existente brevemente, assim como o simples fato de escrever \pdfpagewidthem seu código-fonte (se não estiver comentado).

Infelizmente, assim que algum código fizer a \csname..\endcsnameabordagem sem as precauções mencionadas, o \ifx\pdfpagewidth\undefinedteste simples acima se tornará disfuncional. E esta é a principal razão, eu acho, pela qual as pessoas relutam em recomendá-lo. Deve-se estar ciente de que o LaTeX \@ifundefinedcria precisamente esse problema. Mas em instalações modernas, latexo executável usa pdftexbinário (com extensões específicas e-TeXhabilitadas), portanto, este não é o Knuth TeX. Em instalações mais antigas, naturalmente, você pode ter o formato Knuth TeX + LaTeX.

Observe também que às vezes alguém pode pensar (dependendo possivelmente de como seu IDE apresenta as coisas) que está executando o Knuth TeX tex, quando na verdade ele está pdftex no modo de saída dvi.

O \ifx\pdfpagewidth\undefinedtambém poderia ser comprometido por algum código anterior que deu um significado a \undefined, mas isso seria algo muito condenável.

informação relacionada