处理 XeLaTeX 和 LuaLaTeX 中的细空格

处理 XeLaTeX 和 LuaLaTeX 中的细空格

在下面的小例子中,我在 XeLaTeX 和 LuaLaTeX 中得到了意想不到但不同的结果:

\documentclass{article}
\usepackage{fontspec}
\setlength\parindent{0pt}
\newcommand*\x{\rule{1cm}{1cm}}

\begin{document}

\x\,\x \par
\x~\x  \par
\x \x  \par  % U202F ('NARROW NO-BREAK SPACE') between
\x \x  \par  % U2009 ('THIN SPACE') between

\end{document}
  1. XeLaTeX:第二、第三和第四个方块的宽度距离相同。
  2. LuaLaTeX:第三和第四个方块没有距离。

我希望情况三和情况四的距离与情况一的距离一样小,并且两个引擎都一样。这些是错误吗,或者我可以自己纠正吗?

答案1

如果你查看日志文件,你会发现

Missing character: There is no <E2><80><AF> in font [lmroman10-regular]:mapping=tex-text!
Missing character: There is no <E2><80><89> in font [lmroman10-regular]:mapping=tex-text!

(我使用了“ASCII 表示”,因此显示的是 UTF-8 字节)。UTF-8 序列对应于

<E2><80><AF>→ U+202F 狭窄无间断空格
<E2><80><89>→ U+2009 细空格

如果字体在这些插槽中没有字形,则结果是打印一个矩形(旧版本的 XeTeX)、一些空格或什么都没有。

您可以使用以下方法避免newunicodechar

\documentclass{article}
\usepackage{fontspec}
\usepackage{newunicodechar}

\setlength\parindent{0pt}
\newcommand*\x{\rule{1cm}{1cm}}
\newunicodechar{^^^^202f}{~}
\newunicodechar{^^^^2009}{\,}

\begin{document}

\x\,\x \par
\x~\x  \par
\x \x  \par  % U202F ('NARROW NO-BREAK SPACE') between
\x \x  \par  % U2009 ('THIN SPACE') between

\end{document}

您可以插入显式字符,而不是^^^^序列;但在空格字符的情况下,这很尴尬,因为编辑器不会区分它们;但是

\newunicodechar{ }{~}   % U+202F NARROW NO-BREAK SPACE
\newunicodechar{ }{\,}  % U+2009 THIN SPACE

也可以。

在此处输入图片描述

相关内容