在使用LuaLaTeX时控制中英文字符的间距

1. 问题描述

之前在从XeLaTeX切换到LuaLaTex的时候,发现二者对中文字符和英文字符(包括数学公式)之间的间距处理不一样。在源代码中是否添加空格会对最终的间距有影响。

以下面的示例文档为例:

1
2
3
4
5
6
7
8
9
10
\documentclass{ctexart}
\begin{document}
中English文

中 English 文

$\sin(x)$

$\sin(x)$
\end{document}

这是XeLaTeX编译的结果,可以看到,不管加不加空格,得到的PDF间距都是一样的。

XeLaTeX编译的结果

下面是LuaLaTeX编译的结果:

LuaLaTeX编译的结果

这时不加空格时的间距要小于加空格时的间距。

因此,如果使用LuaLaTeX进行编译,整个文档的风格必须统一,要么都加空格,要么都不加,否则就会很难看。

2. 解决方法

根据LdBeth[1]给出的提示,找到了一个解决方法,可以通过设置 xkanjiskip 来解决这个问题。

在导言区加入:

1
2
3
4
5
6
7
8
\usepackage{iftex}
\ifluatex
\usepackage{luatexja}
\ltjsetparameter{
xkanjiskip={\fontdimen2\font plus \fontdimen3\font minus \fontdimen4\font},
alxspmode={`\%,3}
}
\fi

这样使用LuaLaTeX编译出来的文档无论加空格与否,间距都是一致的。

另外,默认的设置在百分号「%」和中文之间没有空格,上面同时修复了这个问题。

命令解释:

LuaTex-ja把一部分Unicode区段(U+0080~U+10FFFF)分为 JAChar(包含CJK字符等)和 ALchar(包含西文字母等),然后使用 kanjiskip 控制 JAChar 之间的间距,使用 xkanjiskip 控制 JACharALchar 之间的间距。

上面通过修改 xkanjiskip 使得中英文字符间距表现和XeLaTeX一致。

但是,并不是所有的 JACharALchar 之间都需要增加间距。LuaTex-ja使用 jaxspmode 控制是否需要在 JAChar 前后增加间距,使用 alxspmode 控制是否需要在 ALchar 前后增加间距。

上面通过将 % 对应的模式设为 3(或 allowed),使得在对应字符前/后都允许增加间距。(默认设置是「%」前面有空格,但后面没有。)


  1. https://www.zhihu.com/question/1904935413283522195/answer/1968692664439407558 ↩︎