在具有“常见”和“罕见”连字的连字丰富的 Opentype 字体中,可能会发生“罕见”连字首先应用于一个字符对,从而抢先使用应该应用于前一个或尾随字符对的“常见”或“罕见”连字的情况。(关于 Opentype 字体中的连字术语:我熟悉的大多数(但不是全部)Opentype 字体系列将 f 连字(ff
、fi
、fl
、ffi
、ffl
,可能还有ft
、fft
,以及其他一些)归类为“常见”,而所有其他则归类为“罕见”/“自由裁量”或“历史”。)
这种行为有两个示例,在 XeLaTeX 和 LuaLaTeX 中都可能出现:
使用字体时
Garamond Premier Pro
,“罕见”is
连字首先应用于和等单词fish
,fist
从而优先使用“常见”fi
连字。使用字体时
Junicode
,“罕见”iv
和ix
连字首先应用于five
、、fix
和等单词affixed
,优先使用“常见”fi
和ffi
连字。
如果没有这种先发制人的做法,输出将如下所示(以“蛮力”方式实现,即分别\kern0pt
在i
和s
、i
和v
、 和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
连字符,请抑制is
、iv
和ix
连字符如果is
/iv
/ix
前面是f
;为了启用
sp
和st
连字,请抑制is
连字如果is
后面跟着p
或t
。
在 Opentype 字体的术语中,fi
称为常用连字,而is
、iv
、 和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.}
.
后面的字符是|
“任意字形”的简写。我不确定简洁性和密度的增加是否值得以降低(人类)可读性为代价。
如果想要隐藏is
、iv
和ix
连字符全球,同时仍然允许使用其他“罕见”连字符,一条\nolig
指令就可以完成这项工作:
\nolig{i[svx]}{i|.}
在下面的代码中, 的直立形状Junicode
用于 和iv
的ix
情况, 的斜体形状用于Garamond Premier Pro
和sp
连st
字符。第一行数据显示了 处于“开”状态的结果;为了进行比较,第二行数据显示了处于“关”状态的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}