以下代码(最小示例取自这里)
\documentclass{article}
% Both of these are require to duplicate the problem
\usepackage{pgfplots}
\usepackage[splitindex]{imakeidx}
\begin{document}
\end{document}
在 imakeidx.sty 中产生以下错误(仅在 texlive 2012 中,在 2011 中不存在)
! Missing number, treated as zero.
<to be read again>
<
l.48 \ifnum\luatexversion<
68
欢迎提出任何关于为什么会发生这种情况或如何解决的想法。
答案1
使用前进行包装imakeidx
测试:\directlua
\luatexversion
\ifdefined\directlua
然而,在加载包之后,pgfplots
命令\directlua
被定义为含义\relax
。问题出在文件和中,
TDS:tex/generic/pgfplots/util/pgfplotsutil.code.tex
也是 候选文件,它们包含:TDS:tex/generic/pgfplots/util/pgfplotsbinary.code.tex
TDS:tex/generic/pgfplots/sys/pgflibrarypgfplots.surfshading.pgfsys-pdftex.def
\pgfutil@ifundefined{directlua}{%
该宏\pgfutil@ifundefined
定义在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
副作用是它定义了未定义的命令,其含义为\relax
。如果调用
\pgfutil@ifundefined
(与 LaTeX 的 相同),则将其定义为。这种情况发生在组之外。\@ifundefined
\directlua
\relax
pgfplotsutil.code.tex
包imakeidx
测试\directlua
并发现它已定义,因为它使用了 eTeX 的
\ifdefined
。
我认为pgfplots
不应该使用\pgfutil@ifundefined
应该保持未定义的宏。更好的变体是(使用驼峰式命名法的名称):
\def\pgfutil@IfUndefined#1{%
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname#1\endcsname\relax
\expandafter\pgfutil@firstoftwo
\else
\expandafter\pgfutil@secondoftwo
\fi
}
然后,\csname
在组内调用和测试,测试命令的含义在组后保持不变。缺点是\pgfutil@IfUndefined
不可扩展。但这对此处的用例和包中的许多其他用例无关紧要。其他宏也会受到影响(\@ifpackageloaded
,,\if@filesw
……)。另请参阅ltxcmds
定义\ltx@ifundefined
和ltx@IfUndefined
支持 e-TeX 的包(如果有)。
包imakeidx
可以做更保守的测试,以额外检查要测试的命令的含义\relax
。
解决原始帖子问题的解决方法:
\usepackage{pgfplots}
\ifx\directlua\relax
\let\directlua\UnDeFiNeD
\fi
\usepackage{imakeidx}
定义\luatexversion
存在严重的风险,其他包可能会混淆。
进一步说明\pgfutil@ifundefined
:\par
tokens break \csname
,因此\long
在这里没有任何意义。 更好的位置\long
是\pgfutil@firstoftwo
和\pgfutil@secondoftwo
,那么它们的参数可能包含\par
token(取决于这两个宏的语义)。
答案2
\documentclass{article}
\newcount\luatexversion
\luatexversion=70
...
如果您使用的是 ,则可以使用pdflatex
。但是您应该向 作者提交错误报告imakeidx