我怎样才能分离 Libertine 中的 fl 连字符?

我怎样才能分离 Libertine 中的 fl 连字符?

我无法理解 Linux Libertine 字体的连字行为。

我想使用所有可能出现的连字符 ( Ligatures={TeX}),但想禁用单个字符。我原本以为这样babel就可以了。在尝试这个方法时,我发现我能够得到三个不同的 fl 连字符,但这两个字母之间没有真正的空格。这是怎么回事?我做错了什么吗?或者我不应该将这两个字母完全分开,即使它们属于不同的单词部分。

看看这里德语单词“Auflage”发生了什么:

编辑:我也插入了所有提到的解决方案。它们在 f 和 l 之间的距离上有所不同,但仍然发生碰撞。换行的可能性也不同。

编辑2:\\由于以下原因,我在不同的案例之间切换为空白行帖子。现在它在第一张图片中显示了每种情况的实际连字可能性。

% arara: lualatex
\documentclass[ngerman]{article}

\usepackage[final]{microtype}
\usepackage{fontspec}
\usepackage{luatextra}
\defaultfontfeatures{%
    ,Ligatures={TeX}
    ,Scale=MatchLowercase
}
\setmainfont[Mapping=tex-text]{Linux Libertine O} 
\usepackage{showhyphens}
\usepackage{babel}

\begin{document}
Auflage

Auf{l}age

Auf"-lage

Auf\/lage

Auf"|lage

{\addfontfeatures{Ligatures=NoCommon}Auflage}
\end{document}

在此处输入图片描述

没有showhyphens缺失的分离更加明显。

在此处输入图片描述

答案1

让我们来看看所有的情况:

  • Au{f}lage(或Auf{l}ageAuf{}lage}

    结扎(我)

    这根本不会破坏 luatex 中的连字,事实上(与普遍看法相反)即使在 pre-luatex 引擎(例如 pdftex、tex)中也从未可靠地做到这一点。

  • Auf"-lage

    连字符断裂 - 没有字距调整(二)

    此德语快捷方式babel插入一个连字符点,允许在单词的其余部分使用连字符。副作用是连字符被断开,但字母之间没有字距调整,因为即使字体中定义了此对的字距调整,它也会被插入的内容所抑制。

  • Auf\/lage

    (结果与 II 相同)

    此原语用于斜体校正,将插入 0pt 的字距,也会导致连字断开,但(嗯……)不会进行字距调整。负面副作用是单词的其余部分将没有连字符。

  • {\addfontfeatures{Ligatures=NoCommon}Auflage}或者(为了不禁用整个单词的连字)甚至Au{\addfontfeatures{Ligatures=NoCommon}fl}age

    (结果与 II 相同)

    通过 禁用连字fontspec,但同样没有字距调整(这告诉我们字体中确实没有为这对字符定义字距调整)。而且无论如何输入太多了。

  • Auf"|lage

    断掉的连字符 - 字距调整(三)

    这个快捷键同样来自德语babel,实际上是为这种情况设计的。它将拆分连字符,允许在单词的其余部分使用连字符,并插入 0.03em 的字距,但对于此字体来说,这不足以完全分隔字母。字距量在语言定义文件中是固定的——不过,您仍可以更改它:见下文。

因此有三种不同的结果:(I)连字,(II)连字被破坏,但没有字距调整,以及(III)连字被破坏,并有少量的字距调整。

最后一种情况无疑是目前最好的方法。现在,要更改字距调整量,您可以重新定义现有的快捷键(在加载后,用/babel包围):\makeatletter\makeatother

\declare@shorthand{ngerman}{"|}{%
  \textormath{\penalty\@M\discretionary{-}{}{\kern.07em}% <- originally 0.03em
              \allowhyphens}{}}

或者你甚至可以创建一个新的,专门用于fl连字:

\declare@shorthand{ngerman}{"/}{%
  \textormath{\penalty\@M\discretionary{-}{}{\kern.07em}%
              \allowhyphens}{}}

然后写入Auf"/lage

另一种可能性已经提到:selnolig包。这肯定是最好的解决方案,因为它不需要用户付出任何努力。然而不幸的是,这selnolig也只会破坏连字,而不会插入任何字距调整。这将是@Mico 的一个功能请求,使其可自定义,最好是字体和字形相关。


Auf-最后,不太相关:您是否注意到,在完整连字符的情况下,后面没有连字符点?这不是德语连字符模式中的错误,而是 中的错误luaotfload,请参阅这里。可以通过加载字体来解决Renderer=Basic。当然,在这种情况下这不会有影响,但对于像这样的单词,就会有影响auffliegen

答案2

有几个可能的答案。

一种是用来{}包围(不能组成)连字符对的第二个字母,在本例中为:Auf{l}ageSuf{f}rage。哎呀,我刚刚注意到:此解决方案在 LuaLatex 下不起作用。相反,请尝试显式更正斜体,Auf\/lage

第二种可能的方法是selnolig(选择性无连字符)包。它被描述为提供广泛的规则,用于选择性抑制所谓的常见的为英语和德语文档添加连字符。该包可以在德语中通过调用以下命令使用:\usepackage[ngerman]{selnolig}

答案3

激活该选项Ligatures = NoCommon。请参阅fontspec下面的手册10.1

\documentclass{article}
\usepackage{fontspec}
\setmainfont[Ligatures={TeX,NoCommon}]{Linux Libertine O}
\begin{document}
Auflage
\end{document}

在此处输入图片描述

要关闭“单个案例”的连字(如果我理解正确您使用该短语的意思),您可以Ligatures = NoCommon随意添加选项\addfontfeatures,请参阅fontspec下的手册7.2

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\begin{document}
Auflage {\addfontfeatures{Ligatures=NoCommon}Auflage}
\end{document}

在此处输入图片描述

如果要将fl序列中的两个字符进一步分开,可以\kern在禁用连字时添加:

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\newcommand{\fl}{f{\kern0.075em}l}
\begin{document}
Auflage Au\fl{}age
\end{document}

在此处输入图片描述

我个人不会将字距调整到超过0.075em,因为我认为这两个字符的字干和字脚分开太多,在我看来,这在审美上是较差的。毕竟,原因为什么fl连字在非等宽字体中很常见。

正如 mico 所建议的,您可以使用f臂较短的。这样,fl就不会发生碰撞:

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\newcommand{\fl}{{\char"E0E0}l}
\begin{document}
Auflage Au\fl{}age
\end{document}

在此处输入图片描述

答案4

以下只是对之前回答中讨论的一些问题的长篇后续评论,这些评论解决了 OP 的问题。由于此评论太长,无法放在普通评论空间中,因此我将其作为单独的答案发布。

我认为原帖作者提出了两个不同的问题:

  • 如何分解“Auflage”等单词中的 fl 连字 - 但又不全局抑制所有 fl 连字,更不用说所有 f 连字了;
  • 如何确保现在分离的f字形l在视觉上不会“冲突”。

其他答案已经提到了各种基于 TeX 和babel的方法来逐个抑制 fl 连字符。快速评论一下依赖于插入“斜体校正”的方法,即\/(TeX 术语中的“显式字距”)来分解连字符:在我看来,这种方法可能对所有字体系列产生合理的结果(对于某些字体系列,但不一定),如果它用于直立形状和正常粗细的字母。不幸的是,如果所讨论的单词设置为斜体和/或粗体,它往往会产生可怕的结果。如果您不使用该selnolig包来抑制印刷连字,我强烈建议您使用babel快捷"|方法或插入“隐式字距”,例如\kern0pt\hspace{0pt}

无论如何,塞尔诺利格包(顺便说一下,它需要使用 LuaLaTeX 格式)采用完全不同的方法来抑制印刷连字:在排版过程阶段,当 LuaTeX 将各种字符对和三元组(例如fffiflffiffl、等)转换为单个字形时ft,它会插入所谓的fft“whatsits”。一旦连字被抑制,“whatsits”就会消失,因此不会影响段落构建过程的后续阶段,例如连字阶段。

f关于第二个问题:我认为在和之间添加一个非零(隐式)字距对于需要分解连字符l的单词是fl不太理想从印刷角度来看。这个问题对于字形f具有长“臂”的字体尤其严重——就像 的情况一样Linux Libertine。虽然插入足够宽的字距确实可以成功地在视觉上区分fl字形,但它的代价是在“Auflage”、“drauflegen”、“reiflich”等单词中创建一个明显的(因此分散注意力的)视觉空洞。

我认为,更好的解决方案是选择性地将普通的“长臂”f字符(如果后面跟着ijl(或任何其他可能产生难看冲突的字符))替换为f来自同一字体系列的“短臂”字形。好消息是,相当多的 Opentype 字体系列都提供此类“短臂”f字形。坏消息是执行此字符替换需要一些工作。在 的下一个版本中selnolig(我希望在接下来的几周内发布),此方法将针对字体系列实施,该字体系列具有和EB Garamond的短臂版本。我目前正在研究将 的长臂 f 替换为短臂 f 的可能性。敬请期待...fffLinux Libertine

相关内容