Alguém sabe uma maneira de detectar se alguém está correndo pdfTeX
ou de Knuth TeX
? Quero poder incluir condicionalmente recursos extras quando um documento estiver sendo criado usando pdfTex
, mas também oferecer suporte ao original TeX
como 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-TeX
extensões e não se baseia em Knuth TeX
.
Obrigado
Responder1
Algo assim?
Como \csname foo\endcsname
expande para \relax
if \foo
nã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 tex
dá a imagem abaixo.
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
,\ifXeTeX
e\ifLuaTeX
booleano 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 \ifknuthtex
retorne 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..\endcsname
abordagem 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 \ifx
teste. 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 \pdfpagewidth
em seu código-fonte (se não estiver comentado).
Infelizmente, assim que algum código fizer a \csname..\endcsname
abordagem sem as precauções mencionadas, o \ifx\pdfpagewidth\undefined
teste 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 \@ifundefined
cria precisamente esse problema. Mas em instalações modernas, latex
o executável usa pdftex
binário (com extensões específicas e-TeX
habilitadas), 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\undefined
também poderia ser comprometido por algum código anterior que deu um significado a \undefined
, mas isso seria algo muito condenável.