我无法理解 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}age
或Auf{}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}age
,Suf{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
臂较短的。这样,f
和l
就不会发生碰撞:
\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 将各种字符对和三元组(例如ff
、fi
、fl
、ffi
、ffl
、等)转换为单个字形时ft
,它会插入所谓的fft
“whatsits”。一旦连字被抑制,“whatsits”就会消失,因此不会影响段落构建过程的后续阶段,例如连字阶段。
f
关于第二个问题:我认为在和之间添加一个非零(隐式)字距对于需要分解连字符l
的单词是fl
不太理想从印刷角度来看。这个问题对于字形f
具有长“臂”的字体尤其严重——就像 的情况一样Linux Libertine
。虽然插入足够宽的字距确实可以成功地在视觉上区分f
和l
字形,但它的代价是在“Auflage”、“drauflegen”、“reiflich”等单词中创建一个明显的(因此分散注意力的)视觉空洞。
我认为,更好的解决方案是选择性地将普通的“长臂”f
字符(如果后面跟着i
、j
、l
(或任何其他可能产生难看冲突的字符))替换为f
来自同一字体系列的“短臂”字形。好消息是,相当多的 Opentype 字体系列都提供此类“短臂”f
字形。坏消息是执行此字符替换需要一些工作。在 的下一个版本中selnolig
(我希望在接下来的几周内发布),此方法将针对字体系列实施,该字体系列具有和EB Garamond
的短臂版本。我目前正在研究将 的长臂 f 替换为短臂 f 的可能性。敬请期待...f
ff
Linux Libertine