为了抑制溢出,在一个极端情况下,我们有破烂抑制对齐的布局:
\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
这当然是可能的,但这是一个非常侵入性的改变,并且几乎肯定会与很多事物不兼容。