LuaHBTeX 中缺失细空格字符的处理

LuaHBTeX 中缺失细空格字符的处理

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

这表明替换已经完成。

相关内容