
TeXbook(在第 14 章)詳細描述了 TeX 如何計算與將段落分成幾行相關的總缺點,以及 TeX 如何選擇產生最少總缺點的斷點序列(在包含 3 遍的過程中)。然而,它只是簡單地描述瞭如果不存在滿足要求的斷點序列,到底會發生什麼:
粗略地說,\TeX\ 按以下方式將段落分成行:在單字之間或連字符之後插入斷點,以便生成其不良程度不超過當前 ^|\tolerance| 的行。如果無法插入此類斷點,則會設定 ^{overfull box}。
下面沒有關於裝滿盒子的情況的更多細節。我對這些細節感興趣:能否用簡單的術語描述在這種情況下 TeX 選擇將哪些單字突出到邊緣? (或者你必須閱讀 TeX 原始碼才能理解這一點?)由於 TeX 將段落視為一個整體,因此沒有允許的斷點序列的問題實際上並不是由單字引起的。
此外,我認為TeXbook的上述說法並不完全正確:當一個段落包含a時\linebreak
,它可能會被設定為未滿行。這種情況基本上滿足了「沒有辦法插入這樣的斷點」的前提,但 TeX 設定的是未滿行而不是如上所述的過滿行。
(這個問題主要是出於興趣。但確實有一種情況,在完成的文檔中可能會出現一個過滿行的段落,即如果過滿行的超出尺寸不超過\hfuzz
。)
答案1
TeX 根據行缺陷的計算來選擇換行符,這些缺陷的總和稱為記過總分。
不應用 TeX 連字功能的第一遍可能無法遵守整數參數設定的限制\pretolerance
。但TeX的第二遍總是成功。從 TeX 必須創建過滿的行的意義上來說,它可能並不成功。僅當使用者需要時才會建立欠滿線。
我的意思是。您可以設定\parfillskip=0pt
並給 TeX 一條短行,例如,只有一個空格,然後 TeX 報告和未滿行。作者始終對最後換行負責; TeX 不會在一行段落中插入任何內容。類似地,輸出的換行指令\penalty-10000
強制 TeX 遵循作者的意願,在此時換行。這是 TeX 插入的強制中斷。
TeX 的運作方式如下:我嘗試使用簡單的單詞,但這是一個技術主題:TeX 在粘連處斷行(包括緊接著緊跟粘連處以及在內聯數學末尾緊接著粘連處)或懲罰處,即文本中的連字符、 TeX在第二遍中插入的連字符,位於數學模式中的關係之後,等等以及\penalty-10000
如上所述的 a 。
當然,TeX 將文字的開頭視為初始斷點。要建立段落,TeX 從可能中斷的位置開始——在第二遍中,TeX 可能會透過插入的連字符來建立該位置——到下一個段落,直到收集到的材料的寬度(包括收縮或縮小)可拉伸性允許TeX 建立一條符合當前容差的線以及先前發現的(或強制的)斷點之一。 TeX 將這樣的位置標記為斷點,並為其記住關聯的前一個斷點,以便稍後可以從段落末尾回到開頭,並使用最小化總缺陷的行。
如果 TeX 看到使用者插入,它也會建立一個斷點\penalty-10000
。然後它開始該過程,就像在段落的開頭一樣。後面的斷點不能越過該斷點,即下一個斷點必須將該使用者強制斷點記錄為前一個斷點。
如果找不到地方可以建造壞度最多與當前容差一樣大的線,則 TeX 會停止處理(如果它在第一遍中),然後開始第二遍。否則,如果 TeX 在第二遍中,它將尋找下一個可能中斷的位置,而不會建構未滿的行。儘管該行已滿,但這會成為斷點。接下來,TeX 繼續這個過程。因此,第二遍貫穿整個段落。請注意,一個段落可以有多個過滿行。
如果\emergencystretch
不是 0pt 且第二遍無法執行所要求的操作,即找到沒有超滿行的斷點或減少行數 if \looseness=-1
,則 TeX 開始第三遍,其運作方式與第二遍相同。不同之處在於 TeX 將 的尺寸添加\emergencystretch
到每條線的可拉伸性中。因此,TeX 接受一個位置作為斷點,儘管收集的材料的寬度和材料的拉伸性無法以小於或等於當前容差的壞度填充該線。但寬度加上可拉伸性加上尺寸
\emergencystretch
就夠大了;從視覺上看,這樣的線條不夠飽滿。
有幾個參數會影響報告和標記。正如您所說,\hfuzz
尺寸可以省略超滿規則,但它不會改變事實:存在超滿線。\hbadness
如果發出警告,則呼叫另一個參數。
因此,我不明白為什麼 TeXbook 的引用文本是錯誤的,因為它是高層次的非正式描述。