Как полностью предотвратить переполнение строк в ConTeXt?

Как полностью предотвратить переполнение строк в ConTeXt?

Я работаю с ConTeXt уже несколько лет и прекрасно понимаю, что алгоритм определения переносов строк не рассматривает каждую отдельную строку в отдельности, а в основном пытается минимизировать «плохость» всего абзаца. Поэтому иногда наличие переполненных строк — это просто «часть игры», и ее нужно минимизировать, используя hzили fullhz, hanging, tolerantили verytolerantи stretchт. д.

Однако сейчас я столкнулся с ситуацией, в которой мне бы пришлосьДействительнонравитсяабсолютно, полностью, в конечном итоге и всегдапредотвращать переполнение строк в заголовке раздела. То есть, независимо от того, насколько "плохой" становится строка согласно алгоритму TeX, она должнаникогдаприбегать к переполненным строкам. Я создал MWE, который иллюстрирует мою проблему:

\definefontsize[e]
\definefontsize[f]

\definebodyfontenvironment[default][
  a=1.200,
  b=1.400,
  c=1.728,
  d=2.0,
  e=4.0,
  f=24.0,
  x=0.9,
  xx=0.8,
  big=1.2,
  small=0.8]

\setuphead[section][
  style=\tfe\em,
  align={flushleft, nothyphenated, fullhz, hanging, verytolerant, stretch},
  number=no,
  alternative=margin,
  after={\blank[4*line]},
  ]


\starttext

\section{Test overfull headings}

\input{knuth}

\input{knuth}

\stoptext

который выглядит так:

введите описание изображения здесь

Как я могу сказать алгоритмуперерывстроку перед словом "заголовки" вместо того, чтобы прибегать к переполненному полю. Ни один из вариантов, alignкажется, не имеет никакого эффекта здесь.

Любая помощь будет высоко оценена.

решение1

Чтобы избежать переполненных строк с неровным текстом, которые могут появиться при отключении переносов, вы можете добавить broadключевое слово в alignопцию для улучшения переноса строк.

\definefont [SectionFont] [Italic sa 4]

\setuphead
  [section]
  [ style=SectionFont,
    align={flushleft,broad,nothyphenated},
   number=no]

\starttext

\section{Test overfull headings}

\samplefile{knuth}

\stoptext

решение2

Однако сейчас я столкнулся с ситуацией, когда мне бы очень хотелось абсолютно, тотально, окончательно и всегда предотвращать переполнение строк в заголовке раздела. То есть, какой бы "плохой" ни была строка согласно алгоритму TeX, она никогда не должна прибегать к переполнению строк.

Вы практически исчерпали все доступные в ConTeXt варианты решения этой проблемы. Смотрите комментарий Вольфганга ниже, чтобы узнать о гораздо лучшем способе решения этой проблемы. Исходный ответ ниже:

К счастью, есть еще несколько вариантов Plain TeX, которые мы можем использовать. Я могу придумать 4 варианта:

\tolerance=10000

Это предлагается в TeXbook:

Увы, переполненные ящики возвращаются; поэтому попробуйте ввести

\tolerance=10000
\input story

чтобы посмотреть, что произойдет. TeX рассматривает 10000 как «бесконечный» допуск, допускающий произвольно большое пространство; таким образом, допуск 10000 будетникогдаприводит к переполнению поля, если только не происходит что-то странное, например, непереносимое слово, которое шире самого столбца.

\emergencystretch=\maxdimen

Опять же из TeXbook:

Если вы хотите избежать переполненных ящиков любой ценой, не пытаясь исправить их вручную, у вас может возникнуть соблазн установить \tolerance=10000; это позволяет произвольно плохим строкам быть приемлемыми в сложных ситуациях. Но бесконечный допуск — плохая идея, потому что TeX не различает ужасно плохие и нелепо ужасные строки. Действительно, допуск 10000 побуждает TeX концентрировать все плохое в одном месте, создавая одну действительно неприглядную строку вместо двух умеренно плохих, потому что одно «списание» дает наименьшее количество общих недостатков в соответствии с правилами. Есть гораздо лучший способ получить желаемый эффект: в TeX есть параметр, называемый , \emergencystretchкоторый добавляется к предполагаемой растяжимости каждой строки, когда вычисляются плохость и недостатки, в случаях, когда переполненные ящики в противном случае неизбежны. Если \emergencystretchположительно, TeX выполнит третий проход по абзацу перед выбором разрывов строк, когда первые проходы не нашли способа удовлетворить \pretoleranceи \tolerance. Эффект \emergencystretchзаключается в уменьшении масштаба плохих вещей, так что большие бесконечности можно отличить от меньших. Установив \emergencystretchдостаточно высокое значение (на основе \hsize), вы можете быть уверены, что \toleranceникогда не будет превышено; следовательно, переполненные ящики никогда не возникнут, если только задача разрыва строки действительно невыполнима.

\rightskip=0pt plus 1fil

Еще раз из TeXbook:

Например, человек может задать \rightskip=0pt plus1fil, и каждая строка будет заполнена пространством справа. Но это не особенно хороший способ сделать рваные правые поля, потому что бесконечная растяжимость присвоит нулевую плохость строкам, которые очень короткие.

Здесь нас вполне устраивают очень короткие строки, поэтому мы можем с радостью делать то, что нам говорят не делать.

\spaceskip=\fontdimen2\font plus \maxdimen minus \fontdimen4\font

Это позволяет растягивать пробелы между словами до бесконечности и создает совершенно иной эффект, чем другие варианты.


В этом примере первые три варианта дают одинаковый эффект:

(изображение не загружается, отредактирую позже)

в то время как последний вариант имеет совершенно иной эффект:

(изображение не загружается, отредактирую позже)

Вы можете разместить любую из этих команд в любом месте документа, но для этой цели проще всего добавить их к ключу styleследующим образом:

\setuphead[section][
  style=\tfe\em\emergencystretch=\maxdimen,
  align={flushleft, nothyphenated, fullhz, hanging, verytolerant, stretch},
  number=no,
  alternative=margin,
  after={\blank[4*line]},
]

В целом я бы предпочел использовать этот \emergencystretch=\maxdimenвариант среди всех остальных, поскольку он вступает в силу только в том случае, если есть переполненные ящики.

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