\fussy、\sloppy、\emergencystretch、\tolerance、\hbadness 是什么意思?

\fussy、\sloppy、\emergencystretch、\tolerance、\hbadness 是什么意思?

有很多方法可以影响换行,并避免在长而不可换行的文本上出现溢出。我很困惑。我们被告知使用\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 无法将段落设置为低于\tolerancebadness 值的情况,但是为了避免产生溢出的框,它会尝试额外的传递“假装”每行都有额外\emergencystretch 的可拉伸胶水,这允许将整体 badness 保持在 1000 以下,并阻止 TeX“放弃”并将所有拉伸放在一行中。因此\emergencystretch不会改变“好”段落的设置,它只会改变会产生溢出框的段落的设置。请注意,您会收到有关真实的TeX 的不良度计算,尽管它通过\emergencystretch额外的拉伸重试来控制排版,但对于记录的目的而言,它并不被认为是好的。

\hfuzz不会以任何方式影响排版,但如果框只是稍微过满,就会停止 TeX 的抱怨。

\hbadness未用于\sloppy但用于下面的最后一个示例` 类似,它不会影响排版,但如果不良程度低于给定量,则会停止 TeX 对未满框的警告。


主要问题\sloppy是将设置\tolerance为 9999,这几乎是无限糟糕的。这不会均匀分布空白,但会鼓励段落的各行将空白拉伸到任意大的数量。这是 TeX 中公认的缺陷,也是 TeX3 中\emergencystretch添加新参数的原因。不幸的是,在\emergencystretch\sloppyLaTeX2e 定义它时,我们没有降低设置\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}

相关内容