使用 LuaLaTeX 时 \ifpdf 返回 true

使用 LuaLaTeX 时 \ifpdf 返回 true

ifpdf包用于检测 pdfTeX 是否正在运行:

该包在pdf模式下寻找pdfTeX并实现和设置开关\ifpdf

(来自ifpdf文档

但是,当我使用 LuaLaTeX 编译以下 MWE 时,我的文档显示

这是 pdfTeX。

\documentclass{article}

\usepackage{ifpdf}

\begin{document}
\ifpdf
    This is pdfTeX.
\else
    This is not pdfTeX.
\fi
\end{document}

这是预期的行为吗?如何设置条件仅有的检测 pdfTeX?(MWE 对 XeTeX 的运行效果与预期一致。)

答案1

LuaTeX 来自 pdfTeX,它也知道 PDF 和 DVI 的相同模式,并提供 pdfTeX 的几乎所有 PDF 功能。它甚至知道\pdftexversion\pdftexrevision。因此\ifpdf在这里具有相同的语义。

考试\ifpdf不是用于测试引擎。即使\ifpdf为 false,您也可以拥有 pdfTeX,但 pdfTeX 处于 DVI 模式。通常 TeX Live 和 MiKTeX 也使用 pdfTeX 作为命令latex,但使用 DVI 模式下的 pdfTeX 生成 DVI。

如果你想知道,如果运行的是 pdfTeX 而不是 LuaTeX,那么你可以通过 \ifluatex包排除 luatex ifluatex,然后进行测试\pdftexversion,例如:

\usepackage{ifluatex}
\usepackage{ifpdf}
\ifluatex
  \typeout{This is LuaTeX}%
\else
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname pdftexversion\endcsname\relax
    \typeout{This is neither LuaTeX nor pdfTeX}%
  \else
    \typeout{This is pdfTeX in \ifpdf PDF \else DVI \fi mode}%
  \fi
\fi

测试包驱动程序选项和……

一些 TeX 引擎和模式可以在 TeX 宏级别检测到,并且包(或其配置文件)会自动加载正确的驱动程序,例如:

  • PDF 模式下的 pdfTeX 和 LuaTeX
  • 特克斯

DVI 驱动程序有所不同。DVI 驱动程序正在运行TeX 运行,因此无法知道未来。默认值通常是dvips

因此在很多情况下你不需要复杂的开关结构来区分不同的 TeX 编译器,只需加载包就足够了:

\usepackage{color}
\usepackage{graphicx}
\usepackage{hyperref}

如果fontspec您需要测试支持 Unicode 的 TeX 编译器,例如:

\usepackage{ifluatex}
\usepackage{ifxetex}
\ifluatex
  \usepackage{fontspec}
  % other LuaTeX setup
\else
  \ifxetex
    \usepackage{fontspec}
    % other XeTeX setup
  \else
    \usepackage[T1]{fontenc}
    \usepackage{textcomp}
    \usepackage{lmodern}
    % other font setup
  \fi
\fi

答案2

使用包ifluatex代替\ifluatex ... \else ... \fi

相关内容