我在使用 LuaLaTeX 和使用 fontspec 的单词间距方面遇到了问题。这是我的 MWE:
\documentclass{article}
\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX, Scale=MatchLowercase}
\setmainfont[Ligatures=Common,
SmallCapsFeatures={Renderer=Basic},
]{Times New Roman}
\usepackage{microtype}
\begin{document}
\LARGE\addfontfeatures{LetterSpace=30.0}
THIS IS A TEST
\end{document}
这是输出:
如您所见,单词间距保持不变,因为字符间距(字母间距)已经增大(实际上,它甚至比它还要小)。我曾假设后者会相对于前者按比例变化,就像使用 XeLaTeX 编译时实际发生的那样。查看使用 XeLaTeX 编译的相同代码的输出
我怎样才能自动修复这个问题(即不需要摆弄 fontspec 的WordSpace
参数)?
(我在 Xubuntu Linux 15.10 中运行 TeXLive 2015,并安装了最新更新。(LuaLaTeX 版本 beta-0.80.0(TeX Live 2015)(rev 5238)。))
答案1
让我们尝试简化这个例子。
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Latin Modern Roman}
\begin{document}
\addfontfeatures{LetterSpace=30.0}
AB CD EF
\showoutput
\end{document}
这是使用 LuaLaTeX 编译时日志文件中的相关部分:
....\hbox(0.0+0.0)x15.0, direction TLT
....\EU2/LatinModernRoman(1)/m/n/10 A
....\kern 3.0
....\EU2/LatinModernRoman(1)/m/n/10 B
....\glue 3.33 plus 1.66331 minus 1.1111
....\EU2/LatinModernRoman(1)/m/n/10 C
....\kern 3.0
....\EU2/LatinModernRoman(1)/m/n/10 D
....\glue 3.33 plus 1.66331 minus 1.1111
....\EU2/LatinModernRoman(1)/m/n/10 E
....\kern 3.0
....\EU2/LatinModernRoman(1)/m/n/10 F
使用 XeLaTeX 时的情况也一样:
....\hbox(0.0+0.0)x15.0
....\EU1/LatinModernRoman(1)/m/n/10 AB
....\glue 6.33 plus 3.16182 minus 2.1121
....\EU1/LatinModernRoman(1)/m/n/10 CD
....\glue 6.33 plus 3.16182 minus 2.1121
....\EU1/LatinModernRoman(1)/m/n/10 EF
用于表示字母间距的模型不同,因此 XeTeX 不显示字母间的字距。然而,这表明 LuaLaTeX(或更可能luaotfload
)出了问题:在 XeTeX 中,单词间间距也乘以间距因子,而在 LuaTeX 中则不是这样。
在这两个字母组之间,我们有
....\glue 3.33 plus 1.66331 minus 1.1111
在 LuaTeX 中,
....\glue 6.33 plus 3.16182 minus 2.1121
如果我去掉这\addfontfeatures
条线,两个发动机里的胶水就是一样的。
如果我将字体改为 Times New Roman,我会得到
....\glue 2.5 plus 1.24875 minus 0.83415
在 LuaTeX 中(就像LetterSpace
没有添加时一样),但是
....\glue 5.5 plus 2.74724 minus 1.83516
在 XeTeX 中。
为了使错误清晰化:在 XeTeX 中,字母间距量也会添加到单词间空间,但在 LuaTeX 中却不会这样做。
我的建议是在 LuaLaTeX 中使用microtype
字母间距:
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Times New Roman}
\usepackage{microtype}
\begin{document}
\textls[400]{AB CD EF}
\showoutput
\end{document}
生产
....\EU2/TimesNewRoman(0)/m/n/10/400ls A
....\EU2/TimesNewRoman(0)/m/n/10/400ls B
....\glue 3.5 plus 1.24875 minus 0.83415
....\EU2/TimesNewRoman(0)/m/n/10/400ls C
....\EU2/TimesNewRoman(0)/m/n/10/400ls D
....\glue 3.5 plus 1.24875 minus 0.83415
....\EU2/TimesNewRoman(0)/m/n/10/400ls E
....\EU2/TimesNewRoman(0)/m/n/10/400ls F
与 XeTeX 输出相当,结果是
这是一个简单的 TeX 示例:
\input ifluatex.sty
\ifluatex
\input luaotfload.sty
\font\test=LatinModernRoman:mode=node;script=latn;language=DFLT;+tlig;+trep;letterspace=30
\else
\font\test="Latin Modern Roman/OT:script=latn;language=DFLT;mapping=tex-text;letterspace=30"
\fi
\test
AB CD EF
\tracingoutput=1
\tracingonline=1
\showboxbreadth=\maxdimen
\showboxdepth=\maxdimen
\bye
如果使用 LuaTeX 运行,输出显示
...\test A
...\kern 2.7
...\test B
...\glue 3.087 plus 1.54195 minus 1.03003
...\test C
...\kern 2.7
...\test D
...\glue 3.087 plus 1.54195 minus 1.03003
...\test E
...\kern 2.7
...\test F
如果使用 XeTeX 运行,它会显示
...\test AB
...\glue 6.33 plus 3.16182 minus 2.1121
...\test CD
...\glue 6.33 plus 3.16182 minus 2.1121
...\test EF
所以问题不是由于与 LaTeX 的交互。如果letterspace
删除该位,单词间粘合结果就是3.087pt
与 LuaTeX 和3.33pt
XeTeX 的。