# error at \ifnum\luatexversion<68

The following code (minimal example taken from here)

\documentclass{article}

% Both of these are require to duplicate the problem
\usepackage{pgfplots}
\usepackage[splitindex]{imakeidx}

\begin{document}
\end{document}


produces the following error in imakeidx.sty (only in texlive 2012, not in 2011)

! Missing number, treated as zero.
<
l.48   \ifnum\luatexversion<
68


Any idea why this happens or can be solved is welcome.

-
If I change the order of the packages, it compiles with both LuaLaTeX and PDFLaTeX. –  percusse Oct 2 '12 at 20:48
Unfortunately, a new version of imakeidx has reintroduced a malfunction caused by pgfplots. –  egreg Oct 2 '12 at 20:53
As of today, version 1.2d of imakeidx is on the TeX Live servers; it should have corrected this issue and others due to bugs introduced in version 1.2 for which I apologize again. –  egreg Oct 10 '12 at 15:45

Package imakeidx tests for \directlua before using \luatexversion:

\ifdefined\directlua


However after package pgfplots is loaded the command \directlua is defined with meaning \relax. The problem is in the file TDS:tex/generic/pgfplots/util/pgfplotsutil.code.tex and also TDS:tex/generic/pgfplots/util/pgfplotsbinary.code.tex, TDS:tex/generic/pgfplots/sys/pgflibrarypgfplots.surfshading.pgfsys-pdftex.def are candidates, they contain:

\pgfutil@ifundefined{directlua}{%


The macro \pgfutil@ifundefined is defined in TDS:tex/generic/pgf/pgfutil-common.tex:

\long\def\pgfutil@ifundefined#1{%
\expandafter\ifx\csname#1\endcsname\relax
\expandafter\pgfutil@firstoftwo
\else
\expandafter\pgfutil@secondoftwo
\fi}
\def\pgfutil@firstoftwo#1#2{#1}
\def\pgfutil@secondoftwo#1#2{#2}


\csname has the side effect that it defines undefined commands with the meaning of \relax. If \pgfutil@ifundefined (also the same with LaTeX's \@ifundefined) is called, \directlua gets defined with meaning \relax. In pgfplotsutil.code.tex this happens outside of groups.

Package imakeidx tests for \directlua and finds it defined, because it uses eTeX's \ifdefined.

In my opinion pgfplots shouldn't use \pgfutil@ifundefined for macros that should remain undefined. A better variant is (name with camel case):

\def\pgfutil@IfUndefined#1{%
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname#1\endcsname\relax
\expandafter\pgfutil@firstoftwo
\else
\expandafter\pgfutil@secondoftwo
\fi
}


Then \csname and the test is called inside group and the meaning of the tested command remains unchanged after the group. The disadvantage is that \pgfutil@IfUndefined is not expandable. But this does not matter in the use case here and many other uses cases in the package. Other macros are also affected (\@ifpackageloaded, \if@filesw, …). See also package ltxcmds that defines \ltx@ifundefined and ltx@IfUndefined that support e-TeX if available.

Package imakeidx could do a more conservative testing to additionally check the command to be tested for the meaning \relax.

Workaround to fix the issue for the OP:

\usepackage{pgfplots}
\ifx\directlua\relax
\let\directlua\UnDeFiNeD
\fi
\usepackage{imakeidx}


Defining \luatexversion has the severe risk, that other packages might be confused.

Further remark to \pgfutil@ifundefined: \par tokens break \csname, therefore \long does not make any sense here. A better location for \long would be \pgfutil@firstoftwo and \pgfutil@secondoftwo, then their arguments might contain \par tokens (depending on the semantics of these two macros).

-
So I can either load imakeidx after pgfplots or wait for imakeidx to be fixed ? –  Matthias Pospiech Oct 2 '12 at 21:27
This problem for imakeidx had been corrected in May; unfortunately the new version was prepared based on version 1.1 instead of 1.1a; I apologize. The real bug, however, is in pgfplots. –  egreg Oct 2 '12 at 21:30
The workaround works. –  Matthias Pospiech Oct 2 '12 at 21:45
@Heiko thanks for the detailed analysis. I have fixed it in pgfplots using your IfUndefined macro; will become part of the next stable. –  Christian Feuersänger Oct 3 '12 at 10:00
\documentclass{article}

works if you are using pdflatex. However you should file a bug report to the author of imakeidx