优先的软连字符不会随着环境而改变样式,但应该这样做

优先的软连字符不会随着环境而改变样式,但应该这样做

喂食

\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}

结果是: 在此处输入图片描述

相关内容