LuaTeX:如何防止连字破坏 opentype 功能?

LuaTeX:如何防止连字破坏 opentype 功能?

我尝试创建自己的优化连字,但似乎连字规则会影响与 和 一起使用时的 Opentype 功能(尤其是字体中定义的连字)LuaTeXfontspec这是一个简单的例子,它只使用基于单词的连字模式来确保此问题的原因不是我犯的模式错误。我在手册中搜索了这一点,fontspec但没有找到提示。请注意,代码中链接的字体有一个很大的数据库,使用 opentype 功能自动选择正确的长 s、圆 s 和连字,如 和longs c h等。但正是当连字拆分出现在这样的地方之前时,这似乎就被破坏了。

更新:它似乎可以与 XeTeX 一起正常工作,因此这看起来像是LuaTeXfontspec-bug 或限制。

更新 2:[Renderer=HarfBuzz]解决了 David Carlisle 所展示的特定问题。不幸的是,我进一步的测试表明,之前有效的其他单词Forscher(如 long s 预期)现在都错了。似乎两个渲染引擎都没有做到这一点。

\documentclass[a5paper]{article}
%\usepackage{showhyphenation}

\pagestyle{empty}
\usepackage{fontspec}
\setmainfont[]{LOV.AlteSchwabacher.ttf}%https://www.ligafaktur.de/LOV.AlteSchwabacher.ttf

\hyphenation{
    Fort-schritt
}

\begin{document}
    Fortschritt (without the hyphenation \texttt{Fort-schritt} the word is rendered with long s and other ligatures.)
\end{document}

下图显示了未使用自有连字符时的预期输出。 在此处输入图片描述

现在带有连字符的图像(不正确): 在此处输入图片描述

答案1

你可以在 lualatex 中使用 Harfbuzz,就像在 xelatex 中一样

在此处输入图片描述

\documentclass[a5paper]{article}
%\usepackage{showhyphenation}

\pagestyle{empty}
\usepackage{fontspec}
\setmainfont[Renderer=HarfBuzz]{LOV.AlteSchwabacher.ttf}%https://www.ligafaktur.de/LOV.AlteSchwabacher.ttf

\hyphenation{
    Fort-schritt
}

\begin{document}
    Fortschritt (without the hyphenation \texttt{Fort-schritt} the word is rendered with long s and other ligatures.)
\end{document}

或者,您可以使用 luatex 的扩展连字机制,在自由选择中包含更多字母

在此处输入图片描述

\documentclass[a5paper]{article}
%\usepackage{showhyphenation}

\pagestyle{empty}
\usepackage{fontspec}
\setmainfont
%[Renderer=HarfBuzz]
{LOV.AlteSchwabacher.ttf}%https://www.ligafaktur.de/LOV.AlteSchwabacher.ttf

\hyphenation{
    Fort{-}{sc}{sc}hritt
}

\begin{document}
    Fortschritt (without the hyphenation \texttt{Fort-schritt} the word is rendered with long s and other ligatures.)

Fortschritt xxxxxx Fortschritt Fortschritt Fortschritt Fortschritt Fortschritt Fortschritt 
\end{document}

答案2

这不是真正的答案,但评论太长了...无论如何,我想补充一些背景信息:

  • 此字体或多或少必须将整个单词视为上下文,以决定是否使用as或 a 。由于它是通过 OpenType 功能实现的,并且这些功能始终仅使用当前单词的行作为上下文,因此换行通常可能会影响您获得 a或 a 。由于在整形和换行之间,所有内容都会写入一个节点结构,该结构模拟 TeX 的经典固定字符和模型,因此这通常需要将整个单词重写为一个大的。鉴于这些不能嵌套,这是一个相当大的限制,必须做出妥协。这里的模式不同:模式(默认情况下处于活动状态)避免使用这些巨大的s ,而是为字体功能提供更少的上下文。它仍然实现跨连字点的简单匹配,但没有根据需要对此字体进行任意匹配,以便将任何换行效果限制在几个字形中。对此的替代方法是在模式中实现的:模式尝试确保字体始终能够访问所需的上下文,如果需要,将整个单词放入s 中,在此过程中可能会牺牲连字点。ſsſ\discretionary\discretionarynode\discretionaryharfharf\discretionary

    总结:如果您使用具有大量上下文匹配的疯狂字体,例如LOV.AlteSchwabacher.ttf,则使用harf模式(又名Renderer=HarfBuzz在 fontspec 中,又名阅读 David 的答案)。这几乎就是它的设计目的。

  • 你提到添加Renderer=HarfBuzz处理某些单词的方式不同,例如Forscher。该字体不仅包含 OpenType 功能,还包含航空空运功能相同。默认渲染器始终使用 OpenType 渲染器,而 HarfBuzz 支持这两种渲染器,并且如果两者都存在,则优先使用 AAT。这是 CoreText (macOS) 和 HarfBuzz 中的默认处理方式,因此在支持 AAT 的任何地方都是如此。因此,如果 AAT 产生的结果比 OpenType 功能更差,那么字体应该删除这个 AAT 内容(遗憾的是,HarfBuzz 没有提供更改首选系统的选项)。

  • 为什么你想s使用ſ字体功能? 这些地方很奇怪。例如,字体功能有所有这些处理,以避免受到其他行字符的影响,这对于此用例没有任何意义,因为您希望始终独立于换行符处理单词。由于某些区别取决于通常与连字符点相对应的音节,您甚至可以尝试使用连字符作为帮助,而不必处理它们与字体功能的奇怪交互。也许只需为此使用 Lua?那么它也独立于特定字体。

相关内容