為什麼沒有參數\emergencytolerance?

為什麼沒有參數\emergencytolerance?

如果無法透過重新措詞、變更版面配置等方式刪除過滿的框,則基本上有兩種刪除策略:

  1. 增加值\tolerance
  2. 增加值\emergencystretch

第二種策略的一個經常被引用的優點是,增加\emergencystretch只影響「壞」段落(即無法滿足排版的段落\tolerance),而不會改變「好」段落(即可以滿足排版的段落\tolerance)。

另一方面,\emergencystretch改變斷行過程的方式對我來說似乎不太正確:\emergencystretch在計算壞處時添加到每行的可拉伸性。因此,增加\emergencystretch會減少第三遍中的不良情況,但會保留包含在總缺點計算中的其他參數(\hyphenpenalty\adjdemerits\doublehyphendemerits、 ...)不變。這減少了壞處的影響,同時增加了以連字符等結尾的行的影響。此外,額外的拉伸性對於僅具有四個空格的行與具有十個空格的行具有不同的效果。

(我知道這\emergencystretch可能很有用,例如對於自動排版,因為通過將\emergencystretch取決於設置得足夠高\hsize,您可以確保永遠不會發生過滿的框[除非輸入包含一些奇怪的東西,例如比行寬的不可連字符的單字] \tolerance=10000

我想知道為什麼沒有參數\emergencytolerance(或任何合適的名稱)允許您有選擇地指定 TeX 的換行演算法在第三遍中用作容差的值。第三遍的工作原理如下:

  • 有一個名為 的參數,\emergencytolerance其預設值為-1
  • 如果第二遍失敗且\emergencystretch為正或非\emergencytolerance負,則執行第三遍。
  • 第三遍的過程如下:如果\emergencystretch為正,則在計算壞度時將該值加到每條線的可拉伸性中。如果\emergencytolerance為非負數,則該值將用作壞度的限制,而不是\tolerance,否則\tolerance如第二遍中那樣使用。

\emergencystretch這將允許您排版“壞”段落,而不會出現過滿的框,無需更改“好”段落,也不會產生如上所述的增加的缺點。為什麼這個(大概很容易實現)功能至少在 eTeX 或 pdfTeX 等較新的引擎中不可用(Knuth 的 TeX 基本上被凍結了)?

答案1

跟進我的評論(也許不是你問題的真正答案,但我認為人們可以從了解中受益)。

正如大衛在評論中所寫,要回答為什麼沒有添加某些內容並不容易。我聽說 LuaTeX 被凍結了,所以它可能不會被添加到那裡,但我希望你能感受到現在在 LuaMetaTeX 中它是可能的訊息。

正如評論中所指出的,可以做的不僅僅是增加容忍度。然而,下面的最小範例僅增加了兩個 parpass,並增加了容差。

\setuppapersize[A6]

\showmakeup[page]

\startsetups align:pass:test
    \pretolerance 100
    \tolerance    200
    \parpasses    2
        threshold            0.025pt
        tolerance            400
      next
        threshold            0.025pt
        tolerance            800
    \relax
\stopsetups

\starttext

\samplefile{hawking}

\page[yes]

\setupalignpass[test]
% \tracingonline2
% \tracingpasses2

\samplefile{hawking}

\stoptext

兩頁並排:

輸出,具有額外的容差

取消註釋追蹤巨集將在終端機中顯示更多資訊。

順便說一句,這幾乎不會增加運行時間。對於一本 300 頁的書,我認為 4 個額外的通道(包括擴展)增加了不到一秒鐘。 (所以,這並不是 TeX 真正花時間的地方...)

相關內容