该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