Почему нет параметра \emergencytolerance?

Почему нет параметра \emergencytolerance?

Если переполненные поля невозможно удалить путем перефразирования, изменения макета и т. д., то есть две основные стратегии их удаления:

  1. Увеличить ценность\tolerance
  2. Увеличить ценность\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 проводит свое время...)

Связанный контент