今天早些时候,我在编辑的 LaTeX 文件中发现了以下奇怪的输出:
+
经过一番调查,我确定和之间有一个 Unicode 不间断空格 (U+00A0) B
,它在 PDF 输出中不知何故变成了 'ă'。奇怪的是,这种情况仅在加载包时、仅在数学模式下以及仅在使用 XeLaTeX 编译时才会发生— 当使用 pdfLaTeX 编译时,输出仅在和lmodern
之间包含一个超大空格。是什么导致了这种行为,为什么它只在这些特定条件下发生?+
B
最小可重现示例:
\documentclass{article}
\usepackage{lmodern}
\begin{document}
$A + B = C$
\end{document}
(请注意,中的空格+ B
是 U+00A0 而不是 U+0020,它可能出现在呈现的帖子中,也可能不出现。)
使用xelatex
;进行pdflatex
编译会产生不同的输出,如上所述。
答案1
lmodern
运行 XeLaTeX 时不应加载。
这并没有真正解决问题,因为你会得到
Missing character: There is no (U+00A0) in font cmr10!
但至少没有印刷任何内容。
当您运行 XeLaTeX 时,lmodern
0 系列的文本字体设置为rm-lmr10
,其上半部分填充了非标准位置的字符。具体来说,在插槽 0xA0 中有 ă,因此会打印此字符。
您也可以在 XeLaTeX 中使用提供的数学字体lmodern
,但为此您必须仅提取中的数学字体定义lmodern.sty
,基本上就是之后的内容\ProcessOptions\relax
,因此
\SetSymbolFont{operators} {normal}{OT1}{lmr} {m}{n}
\SetSymbolFont{letters} {normal}{OML}{lmm} {m}{it}
\SetSymbolFont{symbols} {normal}{OMS}{lmsy}{m}{n}
\SetSymbolFont{largesymbols}{normal}{OMX}{lmex}{m}{n}
\SetSymbolFont{operators} {bold} {OT1}{lmr} {bx}{n}
\SetSymbolFont{letters} {bold} {OML}{lmm} {b}{it}
\SetSymbolFont{symbols} {bold} {OMS}{lmsy}{b}{n}
\SetSymbolFont{largesymbols}{bold} {OMX}{lmex}{m}{n}
\SetMathAlphabet{\mathbf}{normal}{OT1}{lmr}{bx}{n}
\SetMathAlphabet{\mathsf}{normal}{OT1}{lmss}{m}{n}
\SetMathAlphabet{\mathit}{normal}{OT1}{lmr}{m}{it}
\SetMathAlphabet{\mathtt}{normal}{OT1}{lmtt}{m}{n}
\SetMathAlphabet{\mathbf}{bold} {OT1}{lmr}{bx}{n}
\SetMathAlphabet{\mathsf}{bold} {OT1}{lmss}{bx}{n}
\SetMathAlphabet{\mathit}{bold} {OT1}{lmr}{bx}{it}
\SetMathAlphabet{\mathtt}{bold} {OT1}{lmtt}{m}{n}
\def\mathsterling{\mathit{\mathchar"70BF}}
但是,如果 0xA0 潜入,这仍然会打印 ă。您可以通过使 0xA0 数学活跃并将其定义为 来解决该问题\space
,因此在数学上它会被忽略。
完整代码:
\documentclass{article}
\SetSymbolFont{operators} {normal}{OT1}{lmr} {m}{n}
\SetSymbolFont{letters} {normal}{OML}{lmm} {m}{it}
\SetSymbolFont{symbols} {normal}{OMS}{lmsy}{m}{n}
\SetSymbolFont{largesymbols}{normal}{OMX}{lmex}{m}{n}
\SetSymbolFont{operators} {bold} {OT1}{lmr} {bx}{n}
\SetSymbolFont{letters} {bold} {OML}{lmm} {b}{it}
\SetSymbolFont{symbols} {bold} {OMS}{lmsy}{b}{n}
%\SetSymbolFont{largesymbols}{bold} {OMX}{lmex}{m}{n}
\SetMathAlphabet{\mathbf}{normal}{OT1}{lmr}{bx}{n}
\SetMathAlphabet{\mathsf}{normal}{OT1}{lmss}{m}{n}
\SetMathAlphabet{\mathit}{normal}{OT1}{lmr}{m}{it}
\SetMathAlphabet{\mathtt}{normal}{OT1}{lmtt}{m}{n}
\SetMathAlphabet{\mathbf}{bold} {OT1}{lmr}{bx}{n}
\SetMathAlphabet{\mathsf}{bold} {OT1}{lmss}{bx}{n}
\SetMathAlphabet{\mathit}{bold} {OT1}{lmr}{bx}{it}
\SetMathAlphabet{\mathtt}{bold} {OT1}{lmtt}{m}{n}
\def\mathsterling{\mathit{\mathchar"70BF}}
\mathcode"A0="8000
\begingroup\lccode`~="A0 \lowercase{\endgroup\let~}\space
\begin{document}
$A + B = C$
\end{document}
(我不确定B
上面的代码中0xA0是否还在前面,检查的时候填上去。)
注 1:我注释掉了该largesymbols
定义,因为 Latin Modern 默认选择是完全错误的。您可能会发现加载也很有用,fixcmex
以便正确缩放大型运算符。
注2:这与LuaLaTeX相同。