Detectar si se está ejecutando en pdfTeX o TeX de Knuth para inclusión condicional

Detectar si se está ejecutando en pdfTeX o TeX de Knuth para inclusión condicional

¿Alguien sabe alguna forma de detectar si uno se está ejecutando pdfTeXo el de Knuth TeX? Quiero poder incluir condicionalmente funciones adicionales cuando se crea un documento usando pdfTex, pero también admitir el original TeXcomo alternativa.

Algo como

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

haría el trabajo; sin embargo, lo anterior se basa en las e-TeXextensiones y no se basa en Knuth TeX.

Gracias

Respuesta1

¿Algo como esto?

Dado que \csname foo\endcsnamese expande a \relaxsi \foono está definido, es posible usarlo \ifx....para comparar la secuencia de comandos para que sea igual a \relax. Esto no es necesario e-TeXen absoluto.

\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

Al compilar con texse muestra la imagen a continuación.

ingrese la descripción de la imagen aquí

Respuesta2

Puedes usar eliftex"paquete". Según la documentación

Este paquete muy simple, tanto para Plain TeX como para LaTeX, define los valores \ifPDFTeX, \ifXeTeXy \ifLuaTeXbooleanos para probar si se está utilizando PDFTeX, XeTeX o LuaTeX para la composición tipográfica.

Respuesta3

Si sólo planeas distinguir entre Knuth TeX y pdftex(o LuaTeX), esto lo hace:

\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

Se hace una suposición: que ningún archivo de macro anterior o formato cargado define \pdftexversion. Si desea que \ifknuthtexdevuelva el valor de verdad correcto también con XeTeX, puede cargar 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

Respuesta4

Para su problema, sospecho fuertemente que:

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

es, para todos los efectos, bastante bueno. No hay necesidad de complicaciones.

Las soluciones basadas en un \csname..\endcsnameenfoque tienen el inconveniente de que en realidadcrearuna secuencia de control con significado \relax, si la secuencia de control no existía de antemano. Por lo tanto, la gente hace trucos con un montón de \expandafter's para que este significado exista sólo brevemente y luego desaparezca después de la \ifxprueba. Sin embargo, la memoria TeX tendrá una nueva entrada, incluso para una secuencia de control que exista brevemente, al igual que el simple hecho de escribir \pdfpagewidthen su código fuente (si no está comentado).

Desafortunadamente, tan pronto como algún código realice el \csname..\endcsnameproceso sin las precauciones mencionadas, la \ifx\pdfpagewidth\undefinedprueba simple anterior dejará de funcionar. Y supongo que esta es la razón principal por la que la gente se resiste a recomendarlo. Hay que tener en cuenta que LaTeX \@ifundefinedcrea precisamente este problema. Pero en las instalaciones modernas, latexel ejecutable utiliza pdftexbinario (en particular, con e-TeXextensiones habilitadas), por lo tanto, este no es Knuth TeX. En instalaciones más antiguas, naturalmente, puede tener el formato Knuth TeX + LaTeX.

Tenga en cuenta también que a veces uno puede pensar (dependiendo posiblemente de cómo presente las cosas su IDE) que está ejecutando Knuth TeX tex, cuando en realidad está pdftex en modo de salida dvi.

También podría \ifx\pdfpagewidth\undefinedverse comprometido por algún código anterior que le haya dado un significado \undefined, pero eso sería algo muy condenable.

información relacionada