为什么将 OpenType 字符变体(花饰)与常规字符混合时不应用字距调整?

为什么将 OpenType 字符变体(花饰)与常规字符混合时不应用字距调整?

我正在使用 OpenType 字体 (OTF),它提供了许多字符变体,例如带有漩涡、尾巴等的 B、E、H 变体。可以通过 OpenType 功能“swsh”、“cv01”、“cv02”等访问变体。用法如下:{\addfontfeature{CharacterVariant=1}B}

当我将常规字符与花体变体混合使用时,就会出现问题,例如在单词中{\addfontfeature{CharacterVariant=1}B}ARRY,LaTeX 不会应用 B 和 A 之间的字距调整,即使字体有针对该对的字距调整指令。我猜可能是因为阻止}LaTeX 将整个内容识别为一个单词,并且不应用字距调整。

现在你可能会建议我改用{\addfontfeature{CharacterVariant=1}BARRY},事实上,在这种情况下,LaTeX 确实正确地应用了字距调整。但不幸的是,该解决方案不起作用,因为它也会显示 R 和 Y 的花饰版本,这是不希望的。

以下示例显示了三种情况,I. 使用常规 B 和 A 进行正确的字距调整,II. 花饰 B 和 A 之间缺乏字距调整,III. 花饰 B 和 A 之间的字距调整正确,但 R 和 Y 的花饰变体不理想:

I. BARRY\\
II. {\addfontfeature{CharacterVariant=1}B}ARRY\\
III. {\addfontfeature{CharacterVariant=1}BARRY}\\

在此处输入图片描述

是我在这里做错了什么吗,还是在单词中混合使用花饰和常规字符时真的没有办法获得正确的字距调整?

作为参考,字体是这样的:https://github.com/lvcivs/honoria-font

(我的环境:Ubuntu 上带有 Fontspec 包的 XeTeX)。

编辑: 成立这一相关问题在 fontspec 错误跟踪器中。

答案1

当然,您使用的是相同的字体,但从技术上讲:TeX 将具有给定字体特征(设置或未设置)的(相同)字体的每个变体加载为单个单独的字体实例。每个这样的字体实例都由\font原始字体加载,即原始字体的参数\font包括字体名称以及设置或未设置的字体特征。

例如,如果您加载不带花饰的 KPfonts,则以下内容在 TeX 级别内部完成(粗略地说)

\font\fntA=KpRoman-Regular:+tlig

如果您使用与 Swash 相同的字体,则执行以下操作:

\font\fntB=KpRoman-Regular:+tling;+swsh

这是相同的字体文件,但从 TeX 的角度来看是不同的字体。现在,您可以这样做:

\fntA{\fntB B}ARRY

TeX 从不在不同字体的字母之间调整字距,\fntA例如\fntB

我不知道您使用的实际字体是什么,但您可以\font通过以下方式打印由原始字体内部加载的全名\fontname\font

{\addfontfeature{CharacterVariant=1}B:"\fontname\font"}ARRY:"\fontname\font".

您可以看到这两个名称有所不同。

编辑所需的字距可以通过 来计算\setbox。我们准备宏\specletter{<font selection>}{<letter>}<next text>

\def\specletter#1#2{{#1#2}\def\specletterD{#2}\futurelet\next\specletterA}
\def\specletterA{\expandafter\ifx\space\next\else
   \setbox0=\hbox{\specletterD\next}\setbox1=\hbox{\specletterD\kern0pt\next}%
   \kern\dimexpr\wd0-\wd1\relax
   \fi
}


Test:

\specletter{\bf}{A}VA

和下一个 V 用 kern连接{\bf A}。在您的示例中:

\specletter{\addfontfeature{CharacterVariant=1}}{B}ARRY

答案2

使用 lualatex 您可以访问字形变体。

\documentclass{report}
\usepackage{fontspec}

\setmainfont{Honoria-Regular.otf}
\begin{document}
BARRY

\char\directlua{tex.sprint(luaotfload.aux.slot_of_name(font.current(), "B.left", false))}ARRY

{\addfontfeature{CharacterVariant=1}B}ARRY

\end{document}

在此处输入图片描述

相关内容