我让 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 转换的支持文件。此文件暂时修改 的定义。然后,活动状态会给 带来一些不可接受的东西。\ifnum
color
pdftex
supp-pdf.mkii
\protect
<
\ifnum
因此仅有\usepackage[italian,spanish]{babel}
和没有color
就没有错误。
由于某种原因,在的最后加载期间,spanish.ldf
暂时使和<
处于>
活动状态。此活动在 的其余前导码中被取消,直到加载后立即执行的代码。按照要求加载的顺序babel
spanish.ldf
\AtBeginDocument
babel.sty
\usepackage[spanish, italian]{babel}
etoolbox
italian.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.sty
spanish.ldf
spanish.ldf
是否明确要求过这种类型,我看到的是
- 它要求Babel激活
<
,>
- 然后它立即将 catcodes 重置为
12
, - 然后在最后
spanish.ldf
一个命令时,我们会看到它重新激活<
并且>
。
我认为,当激活正确完成后,Babel 默认会将前导码的其余部分重置为catcode(我没有进一步调查,但我自己12
测试过它的情况)。spanish
spanish.ldf
因此,我建议向和维护人员提出这个问题。事实上,末尾的babel.sty
似乎可能是一个错误(也许从我的理解来看应该是 ,但不是?),因为无论如何,Babel 会将前言的其余部分的 catcodes 重置为。\csname activatequoting\endcsname
spanish.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
(除了首先不加载它)。