# How to tell which package is defining \ifpdf? [closed]

I'm experiencing a problem similar to this one: Package ifpdf Error

After upgrading to a more recent version of TeX Live, my pre-existing documents stopped compiling, with complaints that `\ifpdf` was already defined. My project is large and pulls in a lot of packages, so I don't know which one is defining `\ifpdf`. Using `\let\ifpdf\relax` after the `\documentclass`, as suggested in the answers to the other question, fixes the problem on the newer TeX Live. However, this breaks the document on older versions of TeX Live, where I still need it to compile for various reasons. (I think I'm getting malformed PDFs from pdfTeX 3.1415926-2.4-1.40.13, but that's another topic.)

Is there any simple, straightforward way of finding out which package is defining `\ifpdf` when it shouldn't be? I could presumably figure it out by trial and error, by bisection, but this is a large, complicated project, and that would be a lot of work. If that worked, would knowing this allow me to make my file compile on both versions of TeX Live?

Is there some other way of making a more robust fix? Can I somehow test somewhere to see whether `\ifpdf` has been defined, and then define it conditionally at that point?

[EDIT] I figured out the problem. It wasn't another package, it was some code in my own .cls file, which I'd cut and pasted from somewhere probably 15 years ago:

``````\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
}
``````

I was able to make it run on both (modern) versions of texlive by shortening this to the following:

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

This probably breaks compatibility with dvi-flavored tex, but I don't care about that.

-
You could try using a condition: `\ifx\ifpdf\undefined\else\let\ifpdf\relax\fi` –  Werner Jan 30 at 4:06
@Werner: Thanks for the suggestion, but that caused an error on the old texlive, where `\ifpdf` wasn't being defined and needed to be. I edited the question to show the solution I found that actually worked. –  Ben Crowell Jan 30 at 6:37

## closed as too localized by egreg, David Carlisle, Torbjørn T., Martin Schröder, Stefan Kottwitz♦Jun 1 at 22:45

This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center.If this question can be reworded to fit the rules in the help center, please edit the question.

`\ifpdf` is defined by package `ifpdf`. Thus you can replace your code by `\RequirePackage{ifpdf}`.

The package/class that defines `\ifpdf` can be found by testing, whether `\ifpdf` is undefined or already defined. This can be done by

• `\show\ifpdf` stops the compilation and prints the meaning of `\ifpdf` on the console, examples for the result:

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

or

``````> \ifpdf=\iftrue.
l.3 \show\ifpdf
``````
• `\meaning\ifpdf` returns a string with the meaning of the token. This can be used to write something to the console or `.log` file, e.g.:

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

Example outputs:

``````\ifpdf=undefined
``````

or

``````\ifpdf=\iftrue
``````

This methods can help narrowing down possible candidates that define `\ifpdf`. Then the package files can be inspected and searched for `\ifpdf` to find the definition.

BTW, the old class code definition for `\ifpdf` is wrong. Since many years `latex` also uses pdfTeX! It can generate both DVI and PDF. If a user runs `latex` he usually wants to have DVI, but `\pdfoutput` is defined and the class forces a mode switch to PDF.

-