Если переполненные поля невозможно удалить путем перефразирования, изменения макета и т. д., то есть две основные стратегии их удаления:
- Увеличить ценность
\tolerance
- Увеличить ценность
\emergencystretch
Часто упоминаемым преимуществом второй стратегии является то, что увеличение \emergencystretch
влияет только на «плохие» абзацы (т. е. абзацы, которые невозможно набрать удовлетворительным образом \tolerance
) и не изменяет «хорошие» абзацы (т. е. абзацы, которые можно набрать удовлетворительным образом \tolerance
).
С другой стороны, способ \emergencystretch
изменения процесса разрыва строк мне кажется не совсем правильным: \emergencystretch
добавляется к растяжимости каждой строки при вычислении несовершенств. Таким образом, увеличение \emergencystretch
уменьшает несовершенства в третьем проходе, но оставляет другие параметры, которые включены в расчет общих недостатков ( \hyphenpenalty
, \adjdemerits
, \doublehyphendemerits
, ...), неизменными. Это уменьшает влияние несовершенств, в то время как влияние строк, заканчивающихся дефисом и т. д., увеличивается. Кроме того, дополнительная растяжимость имеет разный эффект для строк, которые имеют только четыре пробела, чем для строк, которые имеют десять пробелов.
(Я знаю, что это \emergencystretch
может быть полезно, например, для автоматического набора текста, поскольку, установив \emergencystretch
достаточно высокое значение в зависимости от \hsize
, можно гарантировать, что переполненные поля никогда не возникнут [если только входные данные не содержат чего-то странного, например, непереносимого слова, которое шире строки]. \tolerance=10000
также никогда не создает переполненных полей, но может привести к ужасным решениям по переносу строк.)
Интересно, почему нет параметра \emergencytolerance
(или как там его можно назвать), который позволяет опционально указать значение, которое алгоритм переноса строк TeX использует в качестве допуска в третьем проходе. Третий проход тогда будет работать примерно так:
- Существует параметр,
\emergencytolerance
имеющий значение по умолчанию-1
. - Если второй проход не удается и
\emergencystretch
результат положительный или\emergencytolerance
неотрицательный, выполняется третий проход. - Процедура для третьего прохода следующая: Если
\emergencystretch
положительно, то это значение добавляется к растяжимости каждой линии при вычислении неисправностей. Если\emergencytolerance
неотрицательно, то это значение используется как предел для неисправностей вместо\tolerance
, в противном случае\tolerance
используется как во втором проходе.
Это позволило бы вам набирать "плохие" абзацы без переполненных полей, без изменения "хороших" абзацев и без недостатков увеличения, \emergencystretch
как описано выше. Почему эта (предположительно простая в реализации) функция недоступна, по крайней мере, в новых движках, таких как eTeX или pdfTeX (TeX Кнута в основном заморожен)?
решение1
В продолжение моего комментария (возможно, это не совсем ответ на ваш вопрос, но я думаю, что людям будет полезно быть в курсе).
Как пишет Дэвид в комментарии, не так-то просто ответить, почему что-то не было добавлено. Я слышал, что LuaTeX заморожен, так что, скорее всего, его туда не добавят, но я надеюсь, что вы почувствуете себя раскрытым благодаря информации о том, что это теперь возможно, в LuaMetaTeX.
Как указано в комментарии, можно сделать гораздо больше, чем просто увеличить толерантность. Однако минимальный пример ниже добавляет только два дополнительных парпасса с увеличенной толерантностью.
\setuppapersize[A6]
\showmakeup[page]
\startsetups align:pass:test
\pretolerance 100
\tolerance 200
\parpasses 2
threshold 0.025pt
tolerance 400
next
threshold 0.025pt
tolerance 800
\relax
\stopsetups
\starttext
\samplefile{hawking}
\page[yes]
\setupalignpass[test]
% \tracingonline2
% \tracingpasses2
\samplefile{hawking}
\stoptext
Две страницы рядом:
Раскомментирование макросов трассировки позволит увидеть в терминале дополнительную информацию.
Кстати, это почти ничего не добавляет к времени выполнения. На 300-страничной книге, я думаю, 4 дополнительных прохода (включая расширение) добавили меньше секунды. (Так что это не совсем то, где TeX проводит свое время...)