¿Alguien sabe alguna forma de detectar si uno se está ejecutando pdfTeX
o el de Knuth TeX
? Quiero poder incluir condicionalmente funciones adicionales cuando se crea un documento usando pdfTex
, pero también admitir el original TeX
como 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-TeX
extensiones y no se basa en Knuth TeX
.
Gracias
Respuesta1
¿Algo como esto?
Dado que \csname foo\endcsname
se expande a \relax
si \foo
no está definido, es posible usarlo \ifx....
para comparar la secuencia de comandos para que sea igual a \relax
. Esto no es necesario e-TeX
en 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 tex
se muestra la imagen a continuación.
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
,\ifXeTeX
y\ifLuaTeX
booleanos 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 \ifknuthtex
devuelva 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..\endcsname
enfoque 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 \ifx
prueba. 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 \pdfpagewidth
en su código fuente (si no está comentado).
Desafortunadamente, tan pronto como algún código realice el \csname..\endcsname
proceso sin las precauciones mencionadas, la \ifx\pdfpagewidth\undefined
prueba 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 \@ifundefined
crea precisamente este problema. Pero en las instalaciones modernas, latex
el ejecutable utiliza pdftex
binario (en particular, con e-TeX
extensiones 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\undefined
verse comprometido por algún código anterior que le haya dado un significado \undefined
, pero eso sería algo muy condenable.