如何判断哪个包正在定义 \ifpdf?

如何判断哪个包正在定义 \ifpdf?

我遇到了与此类似的问题:软件包 ifpdf 错误

升级到较新版本的 TeX Live 后,我之前存在的文档停止编译,并抱怨\ifpdf已定义的。我的项目很大,引入了很多包,所以我不知道哪个包在定义\ifpdf。按照另一个问题的答案所建议的,\let\ifpdf\relax在后面使用\documentclass可以修复较新 TeX Live 上的问题。但是,这会破坏旧版本 TeX Live 上的文档,出于各种原因,我仍然需要它进行编译。(我认为我从 pdfTeX 3.1415926-2.4-1.40.13 获得了格式错误的 PDF,但这是另一个话题。)

有没有简单直接的方法可以找出哪个包在定义\ifpdf但不应该定义?我大概可以通过反复试验、二分法来找出答案,但这是一个庞大而复杂的项目,需要做大量工作。如果这种方法可行,知道这一点是否可以让我的文件在两个版本的 TeX Live 上进行编译?

还有其他方法可以做出更强大的修复吗?我是否可以以某种方式在某处测试以查看是否\ifpdf已定义,然后在该点有条件地定义它?

[编辑] 我找到了问题所在。问题不在于另一个包,而在于我自己的 .cls 文件中的一些代码,这些代码是我大概 15 年前从某个地方剪切粘贴过来的:

\newif\ifpdf
\ifx\pdfoutput\undefined
\pdffalse % we are not running PDFLaTeX
\else
\pdfoutput=1 % we are running PDFLaTeX
\pdftrue
\fi

\ifpdf
\usepackage[pdftex]{graphicx}
\else
\usepackage{graphicx}
\fi
\AtBeginDocument{
        \ifpdf
        \DeclareGraphicsExtensions{.pdf,.jpg,.png}
        \else
        \DeclareGraphicsExtensions{.eps,.jpg,.png}
        \fi
}

通过将其缩短为以下内容,我可以使其在 texlive 的两个(现代)版本上运行:

\usepackage{graphicx}
\AtBeginDocument{
        \DeclareGraphicsExtensions{.pdf,.jpg,.png}
}

这可能会破坏与 dvi-flavored tex 的兼容性,但我不在乎。

答案1

\ifpdf由包定义ifpdf。因此你可以用 替换你的代码 \RequirePackage{ifpdf}

\ifpdf可以通过测试找到定义的包/类,无论\ifpdf它是否未定义或已定义。这可以通过

  • \show\ifpdf停止编译并在控制台上打印含义\ifpdf,结果示例:

    > \ifpdf=undefined.
    l.1 \show\ifpdf
    

    或者

    > \ifpdf=\iftrue.
    l.3 \show\ifpdf
    
  • \meaning\ifpdf返回具有标记含义的字符串。这可用于将某些内容写入控制台或.log文件,例如:

    \typeout{\string\ifpdf=\meaning\ifpdf}
    

    输出示例:

    \ifpdf=undefined
    

    或者

    \ifpdf=\iftrue
    

此方法可以帮助缩小定义 的可能候选范围\ifpdf。然后可以检查并搜索包文件以\ifpdf找到定义。


顺便说一句,旧的类代码定义\ifpdf是错误的。多年来latex也使用 pdfTeX!它可以生成 DVI 和 PDF。如果用户运行,latex他通常希望有 DVI,但\pdfoutput被定义并且类强制模式切换到 PDF。

相关内容