我尝试使用 David Carlisle 在此处概述的命令: 如果 \hfill 后面的内容不够,则将其刷新到下一行
但在这个 MWE 中它不起作用:
\documentclass[fontsize=10pt]{scrbook}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage[babel]{microtype}
\usepackage[textwidth=10cm]{geometry}
\def\foo{\hspace{\fill}\mbox{}\linebreak[0]\hspace*{\fill}}
\begin{document}
Schöne Verhältnis herzustellen, in
welchem sich erst das eigentliche Talent zeigt, bleibt abzuwarten.\foo\mbox{H. B.}
\end{document}
为什么?
答案1
您可以稍微努力一点来阻止此时的换行:
\documentclass[fontsize=10pt]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[babel]{microtype}
\usepackage[textwidth=10cm]{geometry}
\def\foo{\hspace{\fill}\mbox{}\nolinebreak[3]\hspace*{\fill}}
\begin{document}
Schöne Verhältnis herzustellen, in
welchem sich erst das eigentliche Talent zeigt, bleibt abzuwarten.\foo\mbox{H. B.}
\end{document}
TeX 之所以要扣掉三行,是因为它对倒数第二行的连字符扣分。如果你将换行扣分保留为 0,但将最后一个连字符扣分降低到 50,只需添加
\finalhyphendemerits=50
它也只需要两行。
答案2
问题在于上一行的连字符。LaTeX 通常会尝试避免在倒数第二行出现连字符。这样做的代价是\finalhyphendemerits
。这就是为什么 TeX-Book 中的代码(参见下面的链接)将其本地设置为 0(并且将 \parfillskip 设置为 0)。如果您将其设置为零,它会按预期进行编译:
\documentclass[fontsize=10pt]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[babel]{microtype}
\usepackage[textwidth=10cm]{geometry}
\def\foo{\hspace{\fill}\mbox{}\linebreak[0]\hspace*{\fill}}
\begin{document}\finalhyphendemerits=0
Schöne Verhältnis herzustellen, in
welchem sich erst das eigentliche Talent zeigt, bleibt abzuwarten.\foo\mbox{H. B.}
\end{document}
为了更安全的实施请参见此处https://tex.stackexchange.com/a/16333/2388。