有很多方法可以影響換行,並避免在長的不可破壞的文字片段上出現過滿。我很困惑。我們被告知使用\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 就會停止抱怨。
\hbadness
notused 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}