LuaHBTeX 对字体中缺失的细空格字形的处理与以前的 luatex 或 xetex 版本有所不同。
\documentclass[margin=5pt]{standalone}
\usepackage{fontspec}
\setmainfont{Courgette Regular}
\begin{document}
foo bar\,bazμ
\end{document}
foo
和之间有一个细空格(U+202F)bar
,并且字体缺少这个字符和 mu 字符的字形。
在 HBTeX 中渲染(Debian 的 TeX Live 中的 1.12.0 版本,luaotfload 版本 2020-02-02 3.12):
在 xelatex 中渲染:
似乎一些针对缺失空格字符的特殊处理已被删除,这可能会让用户感到惊讶。
答案1
缺失的字符通常会被忽略(并在日志文件中发出警告)。
您可以对它们进行调整,以便如果字体有字形,它们就会以自己的形式出现,或者提供替代。
\documentclass{article}
\usepackage{fontspec}
\usepackage{newunicodechar}
\setmainfont{Libertinus Serif}
\newcommand{\substitutechar}[2]{% #1 = character, #2 = substitution
\newunicodechar{#1}{\iffontchar\font`#1 #1\else#2\fi}%
}
\substitutechar{^^^^202f}{\,}
\substitutechar{μ}{\ensuremath{\mu}}
\pagestyle{empty}
\begin{document}
foo bar\,bazμ
\showoutput
\end{document}
如果我编译这个例子,我会得到
....\TU/LibertinusSerif(0)/m/n/10 f
....\TU/LibertinusSerif(0)/m/n/10 o
....\kern0.07 (font)
....\TU/LibertinusSerif(0)/m/n/10 o
....\TU/LibertinusSerif(0)/m/n/10
....\TU/LibertinusSerif(0)/m/n/10 b
....\TU/LibertinusSerif(0)/m/n/10 a
....\TU/LibertinusSerif(0)/m/n/10 r
....\kern1.66672
....\TU/LibertinusSerif(0)/m/n/10 b
....\TU/LibertinusSerif(0)/m/n/10 a
....\TU/LibertinusSerif(0)/m/n/10 z
....\TU/LibertinusSerif(0)/m/n/10 μ
如果我删除该\setmainfont
行,字体将为拉丁现代罗马字体,就像你的 Courgette 字体一样,缺少 U+202F 和 U+03BC,我得到
....\TU/lmr/m/n/10 f
....\TU/lmr/m/n/10 o
....\kern0.28 (font)
....\TU/lmr/m/n/10 o
....\kern1.66672
....\TU/lmr/m/n/10 b
....\TU/lmr/m/n/10 a
....\TU/lmr/m/n/10 r
....\kern1.66672
....\TU/lmr/m/n/10 b
....\TU/lmr/m/n/10 a
....\TU/lmr/m/n/10 z
....\mathon
....\OML/cmm/m/it/10 ^^V
....\mathoff
这表明替换已经完成。