在我创建的几个文档中LuaLaTeX
(在运行 MacOS X 10.7.5 的 Mac 上使用 MacTeX2012),我主要使用 Adobe 发布的字体Garamond Premier 专业版作为主文本字体。我使用这种字体是因为它提供了大量
“常见”连字:这些不仅包括五种 TeX 标准 f 连字,即 、
ff
、fi
、fl
和ffi
,ffl
还包括ft
、fft
、fb
、ffb
以及其他一些连字;“稀有”连字(又称“自由裁量”):对于此特定字体,“稀有”连字可用于字符对
ct
、st
、sp
和ft
(但不可用于fft
;另见下文),无论是直立还是斜体形状,以及字符对as
、is
、us
、at
、et
和th
其他一些斜体仅字体形状。
如果仅启用了“通用”连字符集(通过选项Ligatures=Common
),则直立和斜体的ft
和组都排版如下:fft
以防万一,这些连字的 Unicode 字符表示分别为U+E18D
和U+E187
。在直立字体形状中,“字形 ID”数字分别为277
和271
,“字符代码”分别为57742
和57735
。在斜体字体形状中,Unicode 字符表示相同,但“字形 ID”和“字符代码”数字分别为 283 和 276,以及 57864 和 57857。
但是,如果启用了“罕见”连字符集——无论是否也启用了“常见”连字符集——ft
和fft
字符组将按如下方式呈现:
(在旁边:有关“罕见”样式 ft-ligature 的另一种呈现方式,请查看网页Garamond 型 ft 连字符。
“Rare” 样式的连字不仅ft
看起来与“Common”样式的连字大不相同,而且fft
连字根本不存在:fft
字符三重现在呈现为简单的“f”,后跟“Rare”样式的ft
连字。就我而言,fft
如果启用了“Rare”连字,字符三重没有连字是相当不幸的。“f”和“ft”字形的横线在斜体字体形状中无法正确对齐,这也是相当成问题的。另外,我也更喜欢“Common”样式的 ft 连字的外观,而不是“Rare”样式的连字,但这只是次要问题。 (顺便说一下,“Rare” ft-ligature 的 Unicode 字符表示是U+E18E
。在直立字体形状中,其“字形 id”和“字符编号”代码分别为 278 和 57742;在斜体字体形状中,后两个数字分别为 283 和 57864。)
我的问题是:有没有办法 - 最好使用fontspec
包提供的宏 - 全局禁用“Rare”样式的ft
连字以便重新启用“Common”样式的ft
连字 - 同时仍然能够使用所有其他“Rare”连字以及“Common”连字?
为了完整起见,下面是生成上述第一个例子的代码:
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{fontspec}
\setmainfont[Ligatures=Common,
ItalicFont={Garamond Premier Pro Italic}]
{Garamond Premier Pro}
\begin{document}
ft fft \em ft fft
\end{document}
要生成第二个示例,请将选项替换Ligatures=Common
为Ligatures={Common,Rare}
。
答案1
类似这样的使用功能文件的事情应该可以工作:
首先是功能文件:
# scripts and languages, if the font use others they should be defined here too
languagesystem DFLT dflt;
languagesystem latn dflt;
# this undoes the effect of rare ligature on ft
feature liga {
sub f_t.alt by f t;
} liga;
# move rare ft to historic ligatures
feature hlig {
sub f t by f_t.alt;
} hlig;
# apply the regular ligature on ft and fft
feature liga {
sub f f t by f_f_t;
sub f t by f_t;
} liga;
上述顺序很重要,这样常规的“ft”和“fft”即使与Rare
连字一起使用,但不能与一起使用Historic
。
字形名称应该与字体中的字形名称相匹配,其中 &f_t.alt
是不需要的“ft”连字符的名称,而f_t
&f_f_t
是想要的连字符的名称。
完整功能文件语法为记录由 Adobe 开发(但 LuaTeX 支持 v1.6 f 语法 + FontForge 扩展,而不是当前版本,因此存在一些差异)。
然后可以使用 fontspec 选项将其应用于字体FeatureFile
:
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\fontspec[Ligatures={Common,Rare},FeatureFile=test.fea]{Garamond Premier Pro}
ft fft \em ft fft
\fontspec[Ligatures={Common,Rare,Historic},FeatureFile=test.fea]{Garamond Premier Pro}
ft fft \em ft fft
\end{document}
答案2
我的回答与@svenper 给出的答案基本相同,但它太长了,不能作为评论,并且它可能回答了 Mico 向 svenper 提出的问题。
也许我拥有的 Garamond Premier Pro 版本比您更新(2.000 版),因为使用Ligatures=Rare
,我得到了罕见的“ft”和常见的“fft”,无论是直体还是斜体。(一些代工厂会通知客户更新,甚至免费发送更新;Adobe 则不会,好像它的声誉是通过让低版本的产品四处流传而提高的。)
如果您被困在有缺陷的字体版本中,并且不喜欢它们的自由选择的“ft”连字(它对易读性没有任何作用),并且如果您想要一种方便的方法来使用除“ft”之外的所有自由选择的连字,您可以定义f\_t.alt
到忘却:
\documentclass{article}
\usepackage{fontspec}
\directlua{
fonts.handlers.otf.addfeature{
name = "mlig",
type = "substitution",
data = {
["f_t.alt"] = "f_t",
},
}
}
\setmainfont{Garamond Premier Pro}[
Ligatures=Rare,% placing this before the new feature may be important; please test
RawFeature=+mlig]% mlig = “Mico’s ligatures”
\begin{document}
ft fft ct sp st
\em ft fft as at ct et ij is ll sp st ta th us
\end{document}
如果您想在一个地方恢复可选的“ft”,只需使用{\addfontfeatures{RawFeature=-mlig}ft}
。
请测试一下;它对我有用,但我的字体副本没有显示原始问题。
另一种方法是避免指定Ligatures=Rare
,而是定义一个新功能,只包含您喜欢的自由连字。例如,假设您喜欢许多自由连字,但不喜欢“ct”、“sp”和“st”。在这种情况下,常用连字足以满足直立字体的需求,但您需要一个新功能来处理斜体 — 我们将其称为ilig
“斜体连字”。
\documentclass{article}
\usepackage{fontspec}
\directlua{
fonts.handlers.otf.addfeature{
name = "ilig",
type = "ligature",
data = {
['a_s'] = { "a", "s" },
['a_t'] = { "a", "t" },
['e_t'] = { "e", "t" },
['i_j'] = { "i", "j" },
['i_s'] = { "i", "s" },
['l_l'] = { "l", "l" },
['t_a'] = { "t", "a" },
['t_h'] = { "t", "h" },
['u_s'] = { "u", "s" },
},
}
}
\setmainfont{Garamond Premier Pro}[
ItalicFeatures={RawFeature=+ilig}]
\begin{document}
ft fft ct sp st
\em ft fft as at ct et ij is ll sp st ta th us
\end{document}
最后,假设您需要避免使用 ,dlig
因为它会影响 f 连字,但您想要直立和斜体的“ct”、“sp”和“st”连字,以及一些可选的斜体连字。您可以简单地按照上面的方法使用ilig
,并将直立和斜体中的可选连字添加到liga
,默认情况下已启用。
\documentclass{article}
\usepackage{fontspec}
\directlua{
fonts.handlers.otf.addfeature{
name = "liga",
type = "ligature",
data = {
['c_t'] = { "c", "t" },
['s_p'] = { "s", "p" },
['s_t'] = { "s", "t" },
},
}
fonts.handlers.otf.addfeature{
name = "ilig",
type = "ligature",
data = {
['a_s'] = { "a", "s" },
['a_t'] = { "a", "t" },
['e_t'] = { "e", "t" },
['i_j'] = { "i", "j" },
['i_s'] = { "i", "s" },
['l_l'] = { "l", "l" },
['t_a'] = { "t", "a" },
['t_h'] = { "t", "h" },
['u_s'] = { "u", "s" },
},
}
}
\setmainfont{Garamond Premier Pro}[
ItalicFeatures={RawFeature=+ilig}]
\begin{document}
Th γγ λλ ffi ffj ffl ft fft ct sp st
\em Th γγ λλ ffi ffj ffl ft fft as at ct et ij is ll sp st ta th us
\end{document}
(不要尝试将仅以斜体形式出现的连字符添加到liga
。使用我的新版本 Garamond Premier Pro 和最新的 TeX Live 2017,TeX 似乎可以宽容,但我曾尝试过 TeX 寻找的字体,比如l_l
在直立字体中,没有找到它,就在我写“allegory”的地方产生了“aegory”。)
答案3
在 TeX Live 的最新版本中,功能文件已被弃用。使用 LuaLaTeX,另一种方法是更改连字符的字形。
\directlua{
fonts.handlers.otf.addfeature {
name = "norareft",
type = "substitution",
data = {
["f_t.alt"] = "f_t",
}
}
}
然后添加 fontspec 选项RawFeature=+norareft
。
完整的 MWE:
\documentclass{article}
\directlua{
fonts.handlers.otf.addfeature {
name = "norareft",
type = "substitution",
data = {
["f_t.alt"] = "f_t",
}
}
}
\usepackage{fontspec}
\setmainfont{GaramondPremrPro}%
[RawFeature=+norareft, % <-- the new feature
Ligatures={Common,Rare},% enable both common and rare ligs
Extension = .otf,
ItalicFont = GaramondPremrPro-It,
BoldFont = GaramondPremrPro-Smbd,
BoldItalicFont= GaramondPremrPro-SmbdIt]
\begin{document}
ft fft \textit{ft fft}
\bfseries ft fft \textit{ft fft}
\end{document}