目前,我将该selnolig
包与 LuaLaTeX 一起使用来自动拆分连字。由于连字会在正确的位置拆分,因此这种方法效果很好。但请注意,显然——至少根据德语排版规则——两个不构成连字的字母不能有任何接触。1
遗憾的是,该软件包selnolig
只会破坏连字,而不会插入额外的字距调整,并且它没有提供任何界面来为已停用的连字指定额外的字距调整。
是否有人尝试调整selnolig
软件包以实现正确的字距调整?(我不懂任何 Lua,当我浏览源代码时,我没有发现连字符被破坏的地方……)
更新:我尝试通过功能文件来调整f
和字形之间的字距,但这似乎没有任何效果(对功能文件的支持已在 luaotfload >= 2.7 中删除 - 我知道这一点并使用旧版本。)l
请参阅以下 MWE 以查看更多示例:
\documentclass[ngerman,parskip=full]{scrartcl}
\usepackage{fontspec}
\usepackage[ngerman]{babel}
\usepackage{filecontents}
\begin{filecontents*}{mykern.fea}
languagesystem DFLT dflt;
languagesystem latn dflt;
feature kern {
pos \f \l +300;
} kern;
\end{filecontents*}
\setmainfont[FeatureFile=mykern.fea,Ligatures=TeX]{Linux Libertine O}
\usepackage{selnolig}
\begin{document}
\selnoligoff
Auflage (incorrect; fl ligature is used)
\selnoligon
% manual kerning in feature file does not have any effect
Auflage (good; automatic suppression of ligature, but bad kerning)
Auf\kern+0.8pt lage (perfect)
\end{document}
更新 2:接下来是 MWE 的另一个版本,我尝试调整f
和l
字形之间的字距 - 这“应该适用于”luaotfload >= 2.7,例如 TeXLive 2016。它也没有任何效果,结果与上面相同。
\documentclass[ngerman,parskip=full]{article}
\usepackage{fontspec}
\usepackage[ngerman]{babel}
\usepackage{filecontents}
\directlua{
fonts.handlers.otf.addfeature {
name = "ktest",
{
type = "kern",
data = {
["f"] = { ["l"] = 200 },
}
},
"extra kerns"
}
}
\setmainfont[RawFeature=+ktest,Ligatures=TeX]{Linux Libertine O}
\usepackage{selnolig}
\begin{document}
\selnoligoff
Auflage (incorrect; fl ligature is used)
\selnoligon
% manual kerning in lua code does not have any effect
Auflage (good; automatic suppression of ligature, but bad kerning)
Auf\kern+0.8pt lage (perfect)
\end{document}
1Fossman 和 de Jong (2008)。Detailtypografie。第 4 版。美因茨:Hermann Schmidt,第 98、194 页。
答案1
正如我最近在不同的答案使用selnolig
会干扰 LuaTeX 中的手动字距调整。这是因为的断开连字方法是在节点列表中插入用户定义的 whatsit。TeX 的连字例程在构建连字时不会提前查看 whatsit(实际上,您也可以使用空的而不是显式的 来selnolig
断开连字)。\special
\kern
不幸的是,这意味着selnolig
如果你想调整字距,你不能使用它来移除连字符。你必须从字体中移除连字符,幸运的是,LuaTeX 可以做到这一点。
您可能认为现在可以selnolig
再次使用,但问题是在回调selnolig
中拦截连字符ligaturing
,而用户定义的字体功能仅在稍后应用(我认为是在之前pre_linebreak_filter
)。这意味着不行selnolig
:(
\documentclass[ngerman,parskip=full]{article}
\usepackage{fontspec}
\usepackage[ngerman]{babel}
\directlua{
fonts.handlers.otf.addfeature({
name = "removefl",
type = "multiple",
data = {
["f_l"] = { "f", "l" },
["f_f_l"] = { "f_f", "l" },
}
})
%
fonts.handlers.otf.addfeature({
name = "kernfl",
type = "kern",
data = {
["f"] = { ["l"] = 80 },
["f_f"] = { ["l"] = 80 },
}
})
}
\setmainfont[RawFeature=+removefl;+kernfl,Ligatures=TeX]{Linux Libertine O}
\begin{document}
Auflage
Auf\kern.8pt lage
\end{document}