喂食
\documentclass{article}
\pagestyle{empty}
\usepackage[ngerman]{babel}
%%% The following 3 lines may be uncommented; it doesn't really matter.
%\hyphenpenalty=49% one less than the default value 50.
%\exceptionpenalty=50%%% ad-hoc value greater than \hyphenpenalty.
%\exhyphenpenalty=48%%% ad-hoc value less than \hyphenpenalty (though usually they coincide).
\babelhyphenation[ngerman]{Fuß{-}{}{}[1]gän{-}{}{}[2]ger-am{-}{}{}[2]pel}
\begin{document}\noindent
% Right:
\hspace*{30em}\emph{Fußgängerampel}\\
\hspace*{30em}\textbf{Fußgängerampel}\\
{\Huge
\hspace*{10em}\emph{Fußgängerampel}\\
\hspace*{10em}\textbf{Fußgängerampel}}\\
% Wrong:
\hspace*{31em}\emph{Fußgängerampel}\\
\hspace*{31em}\textbf{Fußgängerampel}\\
{\Huge
\hspace*{11em}\emph{Fußgängerampel}\\
\hspace*{11em}\textbf{Fußgängerampel}}
\end{document}
产量lualatex
如您所见,当且仅当相应的连字符点由普通的 给出时,行尾自动生成的连字符才具有正确的样式(直立/斜体、正常/粗体、大小)-
。如果使用由 生成的连字符{-}{}{}[priority]
,则无论环境如何,它都会排版为直立、非粗体、正常大小。这显然是错误的。
谁是罪魁祸首?我们该怎么办?
PS. 题外话:由于优先连字似乎仍处于试验阶段,因此,与其将惩罚设为 50、52、104、156 等,不如将惩罚设为更接近的惩罚,例如 50、52、54、56 等。这将更符合公式 \hyphenpenalty +
答案1
这看起来像是引擎级别的错误,因此无法在 babel 中真正修复,如果自由裁量中的字段为空,则字体会丢失,如这个普通的 TeX 示例所示。解决方法是通过将以下字符放置在“after-break”和“no-break”插槽中来确保字段不为空。
\hyphenation{hyphen{before}{after}{}ation}
\font\test=cmss10
\hsize=3cm
\hfuzz10pt
{
x hyphenation
x {\test hyphenation}
xxx {\test hyphenation} xxx
xxx \test hyphenation xxx
}
\bigskip
{
\hyphenation{hyphen{before}{afterat}{at}ion}
\font\test=cmss10
\hsize=3cm
\hfuzz10pt
x hyphenation
x {\test hyphenation}
xxx {\test hyphenation} xxx
xxx \test hyphenation xxx
}
\bye
\documentclass{article}
\pagestyle{empty}
\usepackage[ngerman]{babel}
%%% The following 3 lines may be uncommented; it doesn't really matter.
%\hyphenpenalty=49% one less than the default value 50.
%\exceptionpenalty=50%%% ad-hoc value greater than \hyphenpenalty.
%\exhyphenpenalty=48%%% ad-hoc value less than \hyphenpenalty (though usually they coincide).
\babelhyphenation[ngerman]{Fuß{-}{g}{g}[1]än{-}{g}{g}[2]er-am{-}{p}{p}[2]el}
\begin{document}\noindent
% Right:
\hspace*{30em}\emph{Fußgängerampel}\\
\hspace*{30em}\textbf{Fußgängerampel}\\
{\Huge
\hspace*{10em}\emph{Fußgängerampel}\\
\hspace*{10em}\textbf{Fußgängerampel}}\\
% Wrong:
\hspace*{31em}\emph{Fußgängerampel}\\
\hspace*{31em}\textbf{Fußgängerampel}\\
{\Huge
\hspace*{11em}\emph{Fußgängerampel}\\
\hspace*{11em}\textbf{Fußgängerampel}}
\end{document}
答案2
这篇文章并不是对原始问题的回答(至少不是直接回答),而是对评论。这是一个完整的答案,因为解释有点长,另一方面,它提供了一种定义“排名”连字符的替代方法,以防您需要它们。与 不同\babelhyphenation
,它是 的包装器\hyphenation
,此处解释的过程是针对一般规则(允许使用 lua 模式)而不是针对特定单词而设计的,但它也可以用于后者,尽管在某些情况下,生成的声明可能有些麻烦。
这里我们定义了一个规则,在 TeX 连字过程之后应用于ngerman
(第一个参数),模式为Fuß|gän|ger|am|pel
,其中|
代表自由裁量项。如果匹配此模式,则用第三个参数中的节点替换相应的节点,第三个参数是一个逗号分隔的列表。{}
表示“保留节点,不执行任何操作”,而{ pre=-, penalty=100, data=3}
表示“用一个自由裁量项替换当前节点(在本例中为自由裁量项),其中作为-
字符串pre
,惩罚为 100,并使用来自第三个节点的数据(例如字体)。在本例中,我刚刚从前一个字母中获取了字体。
\documentclass{article}
\pagestyle{empty}
\usepackage[ngerman]{babel}
\babelposthyphenation{ngerman}{ Fuß|gän|ger|am|pel }
{ {}, {}, {}, % Fuß
{ pre=-, penalty=50, data=3 },
{}, {}, {}, % gän
{ pre=-, penalty=100, data=7 },
{}, {}, {}, {}, {}, {}, % ger|am
{ pre=-, penalty=100, data=14 },
{}, {}, {}
}
\begin{document}\noindent
\hspace*{30em}\emph{Fußgängerampel}\\
\hspace*{30em}\textbf{Fußgängerampel}\\
{\Huge
\hspace*{10em}\emph{Fußgängerampel}\\
\hspace*{10em}\textbf{Fußgängerampel}}\\
\hspace*{31em}\emph{Fußgängerampel}\\
\hspace*{31em}\textbf{Fußgängerampel}\\
{\Huge
\hspace*{11em}\emph{Fußgängerampel}\\
\hspace*{11em}\textbf{Fußgängerampel}}
\end{document}