Estou usando PDFTeX, XeTeX ou LuaTeX?

É comum que você precise saber em que “mecanismo” suas macros estão rodando (mecanismo é o processador derivado do TeX ou similar ao TeX que faz a composição de seu documento). O motivo pelo qual você precisa saber é que o conjunto de funções disponíveis em cada mecanismo é diferente. Assim, para que as macros do TeX rodem em qualquer mecanismo, elas precisam “saber” o que elas podem ou não fazer, o que depende do mecanismo que estiver sendo usado. Obter a resposta certa é surpreendentemente complicado (veja abaixo uma elaboração de um teste aparentemente simples).

Existe, agora, um conjunto abrangente de pacotes que respondem à pergunta para você. Todos eles criam um comando condicional do TeX:

Estes comandos TeX podem ser usados dentro da estrutura condicional do LaTeX, como (por exemplo):
\ifthenelse{\boolean{pdf}}{if pdf}{if not pdf}

O pacote ifxetex também fornece um comando \RequireXeTeX que cria um erro se o código não estiver rodando em XeTeX; embora os outros pacotes não forneçam tal comando, não é muito difícil escrever um você mesmo.

Agora, para aqueles que querem fazer o trabalho por conta própria: aqui está uma discussão sobre como fazer o trabalho para PDFTeX e \ifpdf — o programador entusiasmado pode regenerar \ifxetex ou \ifluatex da mesma maneira. Não é recomendável…

Suponha que você precise testar se sua saída será PDF ou DVI. O natural é verificar se você tem acesso a alguma primitiva exclusivamente do PDFTeX; um boa para tentar (até porque estava presente nos primeiros lançamentos do PDFTeX) é a \pdfoutput. Então, você tenta

\ifx\pdfoutput\undefined
  ... % not running PDFTeX
\else
  ... % running PDFTeX
\fi
Mas nenhum ramo dessa condicional é muito sólido. A primeira ramificação pode ser enganosa, já que o usuário “desajeitado” poderia ter escrito:
\let\pdfoutput\undefined
de modo que seu teste falsamente escolha a primeira alternativa. Embora, em tese, este seja um problema, é improvável que ele seja importante.

Mais importante é o usuário carregar um pacote que use o teste do estilo LaTeX que verifica a existência do nome do comando (por exemplo, o pacote graphics do LaTeX, que é útil até mesmo para o usuário do Plain TeX). Esse pacote pode ter se antecipado a você, e o teste pode precisar ser elaborado:

\ifx\pdfoutput\undefined
  ... % not running PDFTeX
\else
  \ifx\pdfoutput\relax
    ... % not running PDFTeX
  \else
    ... % running PDFTeX
  \fi
\fi
Se você quiser saber apenas se alguma extensão para PDFTeX (como “marginal kerning”) está presente, você pode parar neste ponto: você já sabe o suficiente. No entanto, se você precisar saber se está criando saída em PDF , também vai precisar saber o valor do \pdfoutput:
\ifx\pdfoutput\undefined
  ... % not running PDFTeX
\else
  \ifx\pdfoutput\relax
    ... % not running PDFTeX
  \else
    % running PDFTeX, with...
    \ifnum\pdfoutput>0
      ... % PDF output
    \else
      ... % DVI output
    \fi
  \fi
\fi
ifpdf.sty
Distributed as part Heiko Oberdiek’s bundle oberdiek
ifluatex.sty
Distributed as part of Heiko Oberdiek’s bundle oberdiek
ifxetex.sty
ifxetex

This answer last edited: 2012-02-13


Do you have any question? Ask on: latex.net.br - we love qood questions!