在 XeLaTeX 下,不间断空格会变成“ă”

在 XeLaTeX 下,不间断空格会变成“ă”

今天早些时候,我在编辑的 LaTeX 文件中发现了以下奇怪的输出:

A + B = C

+经过一番调查,我确定和之间有一个 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 时,lmodern0 系列的文本字体设置为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相同。

相关内容