\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將值設定回乳膠預設值

\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 就會停止抱怨。

\hbadnessnotused in\sloppy但在下面的最後一個例子中使用是類似的,它不會影響排版,但如果壞度低於給定的數量,則會停止關於未滿框的TeX警告。


主要問題\sloppy是設定\tolerance為 9999,這幾乎是無限糟糕的。這不會均勻地分配空白,而是會鼓勵段落中的各個行將空白拉伸到任意大的量。這是 TeX 中公認的缺陷,也是 TeX3 中\emergencystretch新增參數的原因。不幸的是,在為 LaTeX2e 定義它時添加\emergencystretch\sloppy時,我們沒有減少設置\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}

相關內容