如何通过放宽 Underfull 或理由来全局严格地防止 Overfull?

如何通过放宽 Underfull 或理由来全局严格地防止 Overfull?

为了抑制溢出,在一个极端情况下,我们有破烂抑制对齐的布局:

\usepackage{ragged2e} % https://tex.stackexchange.com/questions/168480/why-does-tex-prefer-an-overfull-box-to-hyphenating-here
\RaggedRight

另一方面,我们有标准对齐文本,尽管可以使用,\sloppy但这并不能解决所有问题。

两者都会导致糟糕的事情为我

到目前为止,我已经到:

\usepackage{hyphenat}
\hyphenpenalty=750
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[babel=true,kerning=french,protrusion=true,expansion=auto,spacing,tracking]{microtype}
\pretolerance=1500
\tolerance=2000
\setlength{\emergencystretch}{2em}

就我的用法而言,我能想到的最佳解决方案是哪一个(法语中有复合词和撇号,它们在连字符处理方面表现不佳 - 对于复合词,我使用\BreakableHyphen{})。很好的讨论这里这里

但理想情况下,我希望标准容差,并在某些特殊情况下放宽对齐并将其替换为左对齐。但我希望在序言中将其参数化,因为我希望用户参数化他们将获得的电子书的格式,并希望它们无需控制即可正确对齐。所以这里禁止使用局部解决方案。

我想象的情况是这样的:

% previous lines identical
\pretolerance=300
\tolerance=500
\setlength{\emergencystretch}{2em}
pseudo-code: if (overflow) then underflow the current line by moving the last word to the next line

请问有什么想法吗?

答案1

举个例子(总是)有帮助,但我怀疑答案是,如果不在有问题的换行符处添加标记,你就无法做到这一点。或者至少你不能在 TeX 的换行算法中一次性完成。TeX 并没有真正以这种方式考虑每一行,而是试图将段落的不良性降到最低。

如果您准备保存每个段落并重新处理(或使用 luatex 的回调)那么我认为您想要做的是将段落设置成较大的紧急拉伸,这样就不会出现过满的行,除非有一个比 更宽的牢不可破的框(或单词)\textwidth

然后逐行拆开框(使用 lua 或循环\lastbox)并找到每个非常拉伸的行框:例如,如果该行正在\box0使用中,则如果框 2 比使用的\setbox2\hbox{\unhbox0}短很多(因此将所有空白放在右侧)否则使用保留原始对齐的行,然后继续检查已保存段落的另一行,直到调整整个段落。\hsize\box2\box0

这当然是可能的,但这是一个非常侵入性的改变,并且几乎肯定会与很多事物不兼容。

相关内容