奇怪的 pdfLaTeX+babel+color 错误,缺少 = 插入 \ifnum

奇怪的 pdfLaTeX+babel+color 错误,缺少 = 插入 \ifnum

我让 MWE 自己说话。

\documentclass{minimal}
% remove babel and it works
% remove one language and it works
% reorder the languages and it works
\usepackage[italian,spanish,UKenglish]{babel}
% remove the color package and it works
\usepackage{color}
\begin{document}
hi
\end{document}

输出

This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian)

...

(/usr/share/texlive/texmf-dist/tex/context/base/supp-pdf.mkii
[Loading MPS to PDF converter (version 2006.09.02).]
! Missing = inserted for \ifnum.
<to be read again> 
                   \let 
l.400 \newcount\nofMPsegments

答案1

这是对egreg 的回答

问题的根源在于,etoolbox因此etex,在 处于活动状态时,将加载<。但这并非完全是灾难性的,因为即使处于<活动状态,它也可能扩展为 catcode 12 ,因此在测试<中可以正常工作。但是,当包加载并与驱动程序一起使用时,它会加载MPS 到 PDF 转换的支持文件。此文件暂时修改 的定义。然后,活动状态会给 带来一些不可接受的东西。\ifnumcolorpdftexsupp-pdf.mkii\protect<\ifnum

因此仅有\usepackage[italian,spanish]{babel}和没有color就没有错误。

由于某种原因,在的最后加载期间,spanish.ldf 暂时使<处于>活动状态。此活动在 的其余前导码中被取消,直到加载后立即执行的代码。按照要求加载的顺序babelspanish.ldf\AtBeginDocumentbabel.sty\usepackage[spanish, italian]{babel}etoolboxitalian.ldf。Babel 按照包末尾该代码也在 Babel 包的末尾,它将重置为未激活西班牙语激活字符的 catcode(编辑:在其自身末尾激活spanish.ldf)。

\usepackage[italian,spanish]{babel}按照Babel 包末尾的顺序执行italian(包括 包 的加载etoolbox,因此也包括 包 的加载)etex的那些spanish。因此,这是在 处于活动状态时完成的<。因此,etex的定义是\alloc@用活动的 完成的<。这是灾难的根源,尽管如上所述,在某些情况下它可能保持隐藏,因为活动<仍将扩展到 catcode 12 <

我对 Babel 的内部结构了解不多,但在我看来,spanish.ldf 不应该要求 Babel在加载 [snip] 结束时<重置catcode ,而应该在加载结束时自己重置>babel.styspanish.ldf……事实上,我不确定spanish.ldf是否明确要求过这种类型,我看到的是

  1. 它要求Babel激活<>
  2. 然后它立即将 catcodes 重置为12
  3. 然后在最后spanish.ldf一个命令时,我们会看到它重新激活<并且>

我认为,当激活正确完成后,Babel 默认会将前导码的其余部分重置为catcode(我没有进一步调查,但我自己12测试过它的情况)。spanish

spanish.ldf因此,我建议向和维护人员提出这个问题。事实上,末尾的babel.sty似乎可能是一个错误(也许从我的理解来看应该是 ,但不是?),因为无论如何,Babel 会将前言的其余部分的 catcodes 重置为。\csname activatequoting\endcsnamespanish.ldf\let\es@quoting\activatequoting\shorthandon{<>}12

答案2

问题在于babel-spanish,默认情况下, 会<作为简写字符,并且在某些语言组合中,这会导致这个奇怪的错误,这肯定是由于这个事实造成的。如果启用更多,完整的错误消息\errorcontextlines

! Missing = inserted for \ifnum.
<to be read again> 
                   \let 
\protect ->\let 
                \protect \@@mpstopdf@@protect \let \unprotect \@@mpstopdf@@u...

\active@prefix ...tect \noexpand #1\else \protect 
                                                  #1\fi \expandafter \@gobbl...

<->\active@prefix <
                   \normal@char< 
\alloc@ #1#2#3#4#5->\ifnum \count 1#1<
                                      #4\allocationnumber \count 1#1 \global...
l.400 \newcount\nofMPsegments

不太清楚为什么加载italian之前spanish会产生错误,也不太清楚为什么\usepackage[italian,spanish]{babel} 没有停止。

但是,以不同的顺序调用语言可以“解决”该问题:

\usepackage[spanish,italian,UKenglish]{babel}

或者,在行etex后立即加载\documentclass

所发生的情况是,它etoolbox在错误的时间被加载,但是似乎没有更好的地方来调用它italian.ldf(除了首先不加载它)。

相关内容