有很多方法可以影响换行,并避免在长而不可换行的文本上出现溢出。我很困惑。我们被告知使用\sloppy
文档范围的不好,另一种解决方案\sloppy
是\紧急拉伸, 那microtype 包可以帮助调整换行ETC。
有人能解释一下所有枚举命令的效果吗?
我自己的实验:
\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
将值设置回 latex 默认值
\def\fussy{%
\emergencystretch\z@
\tolerance 200%
\hfuzz .1\p@
\vfuzz\hfuzz}
\tolerance
设置 tex 在设置段落时允许使用的最大“不良程度”,即插入断点,允许空白延伸并进行惩罚,只要不良程度保持在此阈值以下。如果它不能做到这一点,那么您将得到满框。因此,不同的值会产生不同的排版结果。
\emergencystretch
(在 TeX3 中添加)用于 TeX 无法将段落设置为低于\tolerance
badness 值的情况,但是为了避免产生溢出的框,它会尝试额外的传递“假装”每行都有额外\emergencystretch
的可拉伸胶水,这允许将整体 badness 保持在 1000 以下,并阻止 TeX“放弃”并将所有拉伸放在一行中。因此\emergencystretch
不会改变“好”段落的设置,它只会改变会产生溢出框的段落的设置。请注意,您会收到有关真实的TeX 的不良度计算,尽管它通过\emergencystretch
额外的拉伸重试来控制排版,但对于记录的目的而言,它并不被认为是好的。
\hfuzz
不会以任何方式影响排版,但如果框只是稍微过满,就会停止 TeX 的抱怨。
\hbadness
未用于\sloppy
但用于下面的最后一个示例` 类似,它不会影响排版,但如果不良程度低于给定量,则会停止 TeX 对未满框的警告。
主要问题\sloppy
是将设置\tolerance
为 9999,这几乎是无限糟糕的。这不会均匀分布空白,但会鼓励段落的各行将空白拉伸到任意大的数量。这是 TeX 中公认的缺陷,也是 TeX3 中\emergencystretch
添加新参数的原因。不幸的是,在\emergencystretch
为\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}