(备注:也许这是一个典型的德国问题,我不确定在其他哪些语言中可能存在此问题)
有时有些单词以连字符开头,因为它们与之前使用的单词相连,例如材料研究与开发是一种更短(我认为更优雅)的说法物料研究和物料消耗。
但是,如果以连字符开头的第二个单词位于新行的开头,则可能会发生连字符保留在上一行而单词本身是下一行的第一个单词。
最小示例:
\documentclass[11pt]{scrreprt}
\usepackage[ngerman]{babel}
\begin{document}
Das ist ein Mustertext, der dazu da ist, um diese aa Textsatzproblematik
bzw. -schwierigkeit zu demonstrieren
\end{document}
(我希望这个例子能够“起作用”来演示这个问题,当我用 pdflatex 排版时,“-”位于第一行的末尾,而“schwierigkeit”位于第二行,这是不想要的。)
有没有一种聪明的*方法可以避免这个问题?
* pdflatex 会自动处理这个问题并且“知道”单词开头的连字符必须始终与单词保持连接并且不能与单词分开。
答案1
更新:babel
2013 年 3 月发布的 v3.9 引入了一组\babelhyphen
宏 - 有关详细信息,请参阅手册第 1.6 节。特别是,\babelhyphen{nobreak}
(无星号版本)提供了一个不可断开的连字符允许在单词的其余部分使用连字符——对于当前的问题,这可用于定义一种新的简写,从而无需查找允许的断点。(注意:有时,第一个允许的断点位于不可断开的连字符后三个或更少的字符处;如果您认为这样的断点不够充分,请使用我的原始答案。)
\documentclass[11pt]{scrreprt}
\usepackage[ngerman]{babel}
% The following requires babel v3.9 (released March 2013)
\defineshorthand[ngerman]{"+}{\babelhyphen{nobreak}}
\begin{document}
Das ist ein Mustertext, der dazu da ist, um diese aa Textsatzproblematik
bzw. "+schwierigkeit zu demonstrieren
\end{document}
原始答案:使用babel
的"~
简写形式添加带有禁止换行符的明确连字符;通过使用"-
简写形式来指定第一个允许的后续断点,对此进行补充。(您必须查找带有 的断点\showhyphens{Schwierigkeit}
。请参阅文档的第 5-7 页german
包中的详细信息和其他简写。(注意:这些babel
简写源自german
包,现在被认为已经过时了。)
顺便说一句,在您的示例中使用"~
但"-
不会产生过满的 hbox。
\documentclass[11pt]{scrreprt}
\usepackage[ngerman]{babel}
\begin{document}
Das ist ein Mustertext, der dazu da ist, um diese aa Textsatzproblematik
bzw. "~schwie"-rigkeit zu demonstrieren
\end{document}
答案2
(编辑答案;我最初的重新定义的想法\-
很糟糕;感谢 lockstep 指出这一点并提出建议\declare@shorthand
。)
根据 Ulrike 的解决方案,我想出了一个版本不是副作用是-
禁用“Arbeiter-Unfallversicherung”中的连字符;您也不必指定第一个允许的后续断点(参见 lockstep 的答案)。我不知道它是否还有其他副作用。缺点是您必须键入"_
才能获得不允许在其后换行的连字符。
\documentclass[11pt]{scrreprt}
\usepackage[ngerman]{babel}
\makeatletter
\declare@shorthand{ngerman}{"_}{\hyphenchar\font=-1 -\hyphenchar\font=`\-}
\makeatother
\begin{document}
Das ist ein Mustertext, der dazu dient, diese unsch"one Textsatzproblematik
bzw. "_schwierigkeit zu demonstrieren.
Im n"achsten Satz gibt es einen Test f"ur die Arbeiter-Unfallversicherung.
\end{document}
请注意,此解决方案确实不是依赖于T1编码。
答案3
您可以使用 T1 编码并设置\hyphenchar
为 127。但您必须对所有字体都这样做,这最终意味着您必须更正字体定义(这里以 T1cmr.fd 中的条目为例:
\documentclass[11pt]{scrreprt}
\makeatletter
\providecommand{\EC@family}[5]{%
\DeclareFontShape{#1}{#2}{#3}{#4}%
{<5><6><7><8><9><10><10.95><12><14.4>%
<17.28><20.74><24.88><29.86><35.83>genb*#5}{\hyphenchar\font=127}}
\DeclareFontFamily{T1}{cmr}{}
\EC@family{T1}{cmr}{m}{n}{ecrm}
\EC@family{T1}{cmr}{m}{sl}{ecsl}
\EC@family{T1}{cmr}{m}{it}{ecti}
\EC@family{T1}{cmr}{m}{sc}{eccc}
\EC@family{T1}{cmr}{bx}{n}{ecbx}
\EC@family{T1}{cmr}{b}{n}{ecrb}
\EC@family{T1}{cmr}{bx}{it}{ecbi}
\EC@family{T1}{cmr}{bx}{sl}{ecbl}
\EC@family{T1}{cmr}{bx}{sc}{ecxc}
\EC@family{T1}{cmr}{m}{ui}{ecui}
\makeatother
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\begin{document}
Das ist ein Mustertext, der dazu da ist, um diese aa Textsatzproblematik bzw. -schwierigkeit zu demonstrieren
\end{document}
答案4
从 TeX 看待该问题的角度来说,考虑在这个明确的连字符处断行也许很有用。
根据 TeXbook 第 96 页底部的说法,在单词的明确连字符处进行连字符连接会受到惩罚\exhyphenpenalty
,其默认值为 50(至少在纯 TeX 中)。
\exhyphenpenalty=10000
因此,在我看来,禁止在文档前言中的明确连字符处换行是最省力的解决方案。我在这里测试过,它适用于您的 MWE。