
Я работаю с 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
вариант среди всех остальных, поскольку он вступает в силу только в том случае, если есть переполненные ящики.