错误位于 \ifnum\luatexversion

错误位于 \ifnum\luatexversion

以下代码(最小示例取自这里

\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.texTDS: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\relaxpgfplotsutil.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@ifundefinedltx@IfUndefined支持 e-TeX 的包(如果有)。

imakeidx可以做更保守的测试,以额外检查要测试的命令的含义\relax

解决原始帖子问题的解决方法:

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

定义\luatexversion存在严重的风险,其他包可能会混淆。


进一步说明\pgfutil@ifundefined\partokens break \csname,因此\long在这里没有任何意义。 更好的位置\long\pgfutil@firstoftwo\pgfutil@secondoftwo,那么它们的参数可能包含\partoken(取决于这两个宏的语义)。

答案2

\documentclass{article}
\newcount\luatexversion
\luatexversion=70
... 

如果您使用的是 ,则可以使用pdflatex。但是您应该向 作者提交错误报告imakeidx

相关内容