使用 selnolig / LuaLaTeX 正确分解连字

使用 selnolig / LuaLaTeX 正确分解连字

目前,我将该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 的另一个版本,我尝试调整fl字形之间的字距 - 这“应该适用于”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}

在此处输入图片描述

相关内容