Есть много способов повлиять на перенос строки и избежать переполнения в длинных неразрывных фрагментах текста. Я озадачен. Нам говорят, что использование\sloppy
document-wideне хорошо, что альтернативное решение\sloppy
является\emergencystretch, чтоПакет microtype может помочь настроить перенос строки т. д.
Может ли кто-нибудь объяснить действие всех перечисленных команд?
Мой собственный эксперимент:
\documentclass[12pt]{article}
\usepackage{showframe}
\begin{document}
\fussy
Long made-up words, fussy:
abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl
\sloppy
Long made-up words, sloppy:
abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl
\fussy
Long made-up words, textit, fussy:
\textit{abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl}
\sloppy
Long made-up words, textit, sloppy:
\textit{abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl}
\fussy
Here is a line with long unbreakable rule, fussy. \rule{3cm}{.2cm} \rule{3cm}{.2cm}
\sloppy
Here is a line with long unbreakable rule, sloppy. \rule{3cm}{.2cm} \rule{3cm}{.2cm}
\fussy
Extreme unbreakable rule, fussy. \rule{8cm}{.2cm} \rule{8cm}{.2cm}
\sloppy
Extreme unbreakable rule, sloppy. \rule{8cm}{.2cm} \rule{8cm}{.2cm}
\end{document}
Как мы видим, \sloppy
помогает избежать переполнений, но не в крайних случаях:
решение1
\sloppy
это латексный макрос, который делает
\def\sloppy{%
\tolerance 9999%
\emergencystretch 3em%
\hfuzz .5\p@
\vfuzz\hfuzz}
\fussy
возвращает значения к значениям по умолчанию для латекса
\def\fussy{%
\emergencystretch\z@
\tolerance 200%
\hfuzz .1\p@
\vfuzz\hfuzz}
\tolerance
устанавливает максимальную "плохость", которую tex разрешено использовать при установке абзаца, то есть он вставляет контрольные точки, позволяя растягивать пробелы и брать штрафы, пока плохость остается ниже этого порога. Если он не может этого сделать, то вы получаете переполненные блоки. Таким образом, разные значения дают разный результат набора.
\emergencystretch
(добавлено в TeX3) используется, если TeX не может установить абзац ниже плохого \tolerance
, но вместо того, чтобы делать переполненные блоки, он пытается выполнить дополнительный проход, «притворяясь», что каждая строка имеет дополнительный \emergencystretch
растягиваемый клей, это позволяет удерживать общее плохое ниже 1000 и не дает TeX «сдаться» и помещать все растягивание в одну строку. Итак\emergencystretch
не изменяет настройки «хороших» абзацев, он изменяет только настройки абзацев, которые могли бы создать переполненные блоки. Обратите внимание, что вы получаете предупреждения онастоящийРасчет некачественности от TeX, даже несмотря на то, что он повторяет попытки с \emergencystretch
дополнительным растяжением, используется для управления набором текста, но он не считается хорошим для целей регистрации.
\hfuzz
никак не влияет на набор текста, а просто прекращает жаловаться TeX, если поле заполнено лишь немного.
\hbadness
не используется, \sloppy
но используется в последнем примере ниже. Аналогично, оно не влияет на набор текста, но прекращает выдачу предупреждений TeX о неполных полях, если уровень неисправностей ниже заданного значения.
Основная проблема с \sloppy
— это настройка \tolerance
на 9999, что почти бесконечно плохо. Это не распределяет пробелы равномерно, а побуждает отдельные строки абзаца растягивать пробелы до произвольно больших величин. Это был признанный недостаток TeX, и поэтому в TeX3 \emergencystretch
был добавлен новый параметр. К сожалению, при добавлении \emergencystretch
to \sloppy
при его определении для LaTeX2e мы не уменьшили настройку \tolerance
, а оставили ее на 9999, что, вероятно, хорошо для совместимости с LaTeX2.09, но плохо для всего остального.
Обратите внимание, что окончательные настройки показывают, что часто вы получаете лучшую настройку, просто устанавливая \emergencystretch
и не меняя \tolerance
вообще, настройка одинакова в обоих случаях, но \hbadness=10000
отключает предупреждения. Не всехотетьокончательную настройку без предупреждения об этом, но в контекстах автоматического набора текста, где изменение ввода невозможно и вы никогда не хотите, чтобы поля были переполнены, это возможно.
\documentclass[12pt]{article}
\usepackage{showframe}
\begin{document}
\def\test#1{{#1
\texttt{\detokenize{#1}}
Long made-up words, sloppy:
abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl
\textit{abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl}
Long made-up words, textit, sloppy:
\textit{abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl abcdefghijklabcdefghijkl}
Here is a line with long unbreakable math, sloppy. ${a+b+c+d a+b+c+d}$ ${a+b+c+d a+b+c+d }$
Extreme unbreakable math, sloppy. ${a+b+c+d+e a+b+c+d+e a+b+c+d+e a+b+c+d+e }$ break ${a+b+c+d+e a+b+c+d+e a+b+c+d+e a+b+c+d+e }$
\nobreak\bigskip\hrule\filbreak}}
\test{}
\test{\sloppy}
\test{\setlength\emergencystretch{\hsize}}
\test{\setlength\emergencystretch{\hsize}\hbadness=10000}
\end{document}