我试图理解为什么即使存在合理的断点,目录中的某些条目也会过满。我将问题(以及 的定义\@dottedtocline
)归结为以下示例:
\documentclass[a4paper,twoside, 12pt]{article}
\usepackage[inner=27mm, outer=27mm]{geometry}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\begin{document}
\makeatletter
\def\@dottedtocline#1#2#3#4#5{%
{\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
\parindent #2\relax
\leavevmode
\@tempdima #3\relax
\advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
{#4}\nobreak\par}}
\tracingparagraphs=1
\@dottedtocline{2}{1.5em}{2.3em}{%
\numberline {0.2}Marktabgrenzung für Sekundärrohstoffe aus der Eisen- und Stahlerzeu\-gung}{1}
\@dottedtocline{2}{1.5em}{2.3em}{%
\numberline {0.2}Marktabgrenzung für Sekundärrohstoffe aus der Eisen- und Stahlerzeu\-gu\-ng}{1}
\end{document}
在 TL14 中给出了以下换行符:
这两行之间的唯一区别是额外的断点。为什么这很重要?为什么没有它,TeX 就不会随意中断?(删除\nobreak
(可能)不是一个解决方案,因为在我看来,在实际的目录中,它会保留附加到目录条目的点。)
编辑
删减 Joseph 的 tex 示例:
\hsize330pt
\parfillskip-2.55em
Marktabgrenzung fur Sekundarrohstoffe aus der Eisen- und Stahlerzeu\-gung
\par
Marktabgrenzung fur Sekundarrohstoffe aus der Eisen- und Stahlerzeu\-gu\-ng\bye
反面的例子\parfillskip
解释了为什么 TeX 在第一行接受了过满的盒子,但是却没有解释为什么在第二行(我们得到了一个水平盒子未满的消息)没有发生同样的情况。
答案1
很好的例子。
这实际上并不是 TeX 的错误,而是段落拆分算法中的一种设计方法(或者更确切地说是一些升级,以保持较低的计算成本 --- 记得 TeX 的设计时间)。
简而言之,TeX 会不断查看段落中的断点,从开头开始,一直到结尾。通过这种方式,它会构建一个贯穿段落的可能路径图,这些路径从条形图开头开始,然后散开,最终在 处再次汇合\par
。然后,该算法本质上是根据某些标准(例如线条的粗细程度)找到贯穿该图的最短路径。
现在您可以绘制一个非常大的图形,比如说一个节点以“Marktabgrenzung”之后的第 1 行结束,以“fur”之后的第 2 行结束,还有一个节点以“fur”之后的第 1 行结束,等等。然而,其中许多都是完全垃圾,所以 TeX 根本不理会它们(糟糕透顶,即空行)。相反,如果这些线之间的距离太大(就构建此图形而言,断点将被“停用”),TeX 将停止考虑从某个断点到后面的断点构建线。
换句话说:如果 TeX 有一个断点 A,现在它发现了下一个断点 B,并且 A 和 B 之间的距离正好可以形成一条线,那么这个断点就会被添加到图中(如果 B 也能与之前的断点形成一条线,那么其他边也会被添加到图中)
但是,在某个时候,TeX 会发现断点 G,虽然 AF 是一条不错的线,但 AG 会溢出。此时,TeX 会停用“A”,因此当遇到断点 H 时,它甚至不会尝试形成一条返回 A 的线,而只会返回 B 或 C... 如果它们仍处于活动状态。
因此,这意味着 TeX 假设一旦一行溢出,就不会再出现缩短行的现象,这样 AH 就会突然再次起作用。这对于普通文本来说相当合理,但如果您确实有巨大的负空间(如上\parfillskip
例中的特殊情况),它就不起作用了。
这就解释了为什么额外的\-
断点很重要:没有它,段落开头仍将处于“活动”状态,因为“Stahlerzeu-”后的断点可以形成一条线。下一个断点是 and ,\par
它也能正常工作,因为额外字母的宽度被负号 抵消了\parfillskip
。然而,有了额外的连字符,TeX 会回头看,发现没有办法回到开头,因此段落的开头被停用,所以当我们到达时,\par
它不再是一个有效的选项。
出色地 ...
还有一些想法:现在可以通过将活动断点列表保留得更长来做得更好,例如,仅在行数超过 X 后才激活它们,其中 X 可以通过第一次快速扫描整个段落来确定,以找到最大的负空间(请记住,§826 不赞成不定式收缩,因此这将是一个有限值)。这种方法不会使实际图表变得更大,因为过满的行不会在图表中生成新的可行节点,但这显然意味着在构建图表时需要进行更多检查。