如何防止“罕见”连字符干扰“常见”连字符?

如何防止“罕见”连字符干扰“常见”连字符?

在具有“常见”和“罕见”连字的连字丰富的 Opentype 字体中,可能会发生“罕见”连字首先应用于一个字符对,从而抢先使用应该应用于前一个或尾随字符对的“常见”或“罕见”连字的情况。(关于 Opentype 字体中的连字术语:我熟悉的大多数(但不是全部)Opentype 字体系列将 f 连字(fffiflffiffl,可能还有ftfft,以及其他一些)归类为“常见”,而所有其他则归类为“罕见”/“自由裁量”或“历史”。)

这种行为有两个示例,在 XeLaTeX 和 LuaLaTeX 中都可能出现:

  • 使用字体时Garamond Premier Pro,“罕见”is连字首先应用于和等单词fishfist从而优先使用“常见”fi连字。

  • 使用字体时Junicode,“罕见”ivix连字首先应用于five、、fix和等单词affixed,优先使用“常见”fiffi连字。

在此处输入图片描述

如果没有这种先发制人的做法,输出将如下所示(以“蛮力”方式实现,即分别\kern0ptisiv、 和i和之间插入x):

在此处输入图片描述

(顺便观察一下,对“fist”这个词中罕见连字符的强力抑制is不仅能使常见fi连字符生效,还能使罕见st连字符生效。)

问题:哪些方法可用 - 理想情况下是在文档范围的基础上 - 阻止某些罕见连字符的应用,如果它们优先于其他常见或罕见的连字符?

另外:这篇文章与之前的文章并不重复如何抑制对于同一字符对而言优先于“常见”连字的“罕见”连字?在之前的问题中,问题在于给定连字符的“罕见”和“常见”形式可能出现在同一个字符对(或三个字符)中。此问题的示例是“ft”和“fft”的常见和罕见连字符形式。


这是产生上面显示的第二张屏幕截图的代码;删除\kern0pt指令以生成第一张屏幕截图:

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{fontspec}
\begin{document}

\setmainfont[Ligatures  = Rare,
             ItalicFont = {Garamond Premier Pro Italic}]           
            {Garamond Premier Pro}

% 'is'-ligature available only in italic shape in GPP
\emph{fi\kern0ptsh fi\kern0ptst} --- Garamond Premier Pro

\setmainfont[Ligatures = Rare]{Junicode}

fi\kern0ptve fi\kern0ptx affi\kern0ptx --- Junicode

\end{document}

答案1

在我看来,需要以下连字抑制规则。

  • 为了启用fi连字符,请抑制isivix连字符如果 is/ iv/ix前面是f;

  • 为了启用spst连字,请抑制is连字如果 is后面跟着pt

在 Opentype 字体的术语中,fi称为常用连字,而isiv、 和ix以及 和sp称为st稀有连字或自由连字。

以下解决方案适用于 LuaLaTeX(但不适用于 XeLaTeX),它采用了塞尔诺利格包。(全面披露:我是该包的主要作者selnolig。)上面给出的连字抑制规则是通过几条\nolig指令实现的:

\nolig{fis}{fi|s} % break up 'is' lig. if preceded by 'f'
\nolig{fiv}{fi|v} % break up 'iv' lig. if preceded by 'f'
\nolig{fix}{fi|x} % break up 'ix' lig. if preceded by 'f'
\nolig{isp}{i|sp} % break up 'is' lig. if followed by 'p'
\nolig{ist}{i|st} % break up 'is' lig. if followed by 't'

更简洁地说:

\nolig{fi[svx]}{fi|.}
\nolig{is[pt]}{i|s.}

.后面的字符是|“任意字形”的简写。我不确定简洁性和密度的增加是否值得以降低(人类)可读性为代价。

如果想要隐藏isivix连字符全球,同时仍然允许使用其他“罕见”连字符,一条\nolig指令就可以完成这项工作:

\nolig{i[svx]}{i|.}

在下面的代码中, 的直立形状Junicode用于 和ivix情况, 的斜体形状用于Garamond Premier Prospst字符。第一行数据显示了 处于“开”状态的结果;为了进行比较,第二行数据显示了处于“关”状态的selnolig结果。selnolig

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{fontspec,booktabs}
\setmainfont[Ligatures  = Rare,
             ItalicFeatures = {Scale = MatchLowercase},
             ItalicFont = {Garamond Premier Pro Italic}]
            {Junicode}
\setsansfont[Scale=MatchLowercase]{Palatino Sans Com}

\usepackage{selnolig}
\nolig{fis}{fi|s} % break up 'is' lig. if preceded by 'f'
\nolig{fiv}{fi|v} % break up 'iv' lig. if preceded by 'f'
\nolig{fix}{fi|x} % break up 'ix' lig. if preceded by 'f'
\nolig{isp}{i|sp} % break up 'is' lig. if followed by 'p'
\nolig{ist}{i|st} % break up 'is' lig. if followed by 't'

%% Or, more concisely:
% \nolig{fi[svx]}{fi|.}
% \nolig{is[pt]}{i|s.}

\begin{document}

\noindent
\begin{tabular}{@{}lll@{}}
\textsf{selnolig} & Junicode: iv, ix  & \em Gar.\ Prem.\ Pro Italic: is\\
\midrule
On & five fix affix & \em fish fissure fist gist lisp\\[0.5ex]
\selnoligoff % turn off selnolig's operations
Off & five fix affix & \em fish fissure fist gist lisp\\
\end{tabular}
\end{document}

相关内容