如何絕對防止 ConTeXt 中的行過滿?

如何絕對防止 ConTeXt 中的行過滿?

我已經使用 ConTeXt 幾年了,我很清楚確定換行符的演算法並不是孤立地查看每一行,而是基本上試圖最小化整個段落的「壞處」。因此,有時,過滿的行只是「遊戲的一部分」 ,必須透過使用hzor fullhzhangingtolerantor等來最小化。verytolerantstretch

然而我現在面臨的情況是真的喜歡絕對地、完全地、最終地、永遠地防止剖面頭中的線條過滿。也就是說,根據 TeX 的演算法,無論該行變得多麼“糟糕”,它都應該絕不訴諸超滿的線路。我創建了一個 MWE 來說明我的問題:

\definefontsize[e]
\definefontsize[f]

\definebodyfontenvironment[default][
  a=1.200,
  b=1.400,
  c=1.728,
  d=2.0,
  e=4.0,
  f=24.0,
  x=0.9,
  xx=0.8,
  big=1.2,
  small=0.8]

\setuphead[section][
  style=\tfe\em,
  align={flushleft, nothyphenated, fullhz, hanging, verytolerant, stretch},
  number=no,
  alternative=margin,
  after={\blank[4*line]},
  ]


\starttext

\section{Test overfull headings}

\input{knuth}

\input{knuth}

\stoptext

看起來像這樣:

在此輸入影像描述

我怎樣才能告訴演算法休息在“標題”一詞之前添加一行,而不是使用一個過滿的框。中的所有選項align似乎都沒有任何效果。

非常感謝所有幫助。

答案1

為了避免在關閉連字號時出現文字不齊的過滿行,您可以將關鍵字新增broadalign選項以改善換行。

\definefont [SectionFont] [Italic sa 4]

\setuphead
  [section]
  [ style=SectionFont,
    align={flushleft,broad,nothyphenated},
   number=no]

\starttext

\section{Test overfull headings}

\samplefile{knuth}

\stoptext

答案2

然而,我現在面臨的情況是,我真的很想絕對、完全、最終、始終防止節頭中的線路過滿。也就是說,根據 TeX 的演算法,無論該行變得多麼“糟糕”,它都不應該訴諸於過滿的行。

對於這個問題,您幾乎用盡了 ConTeXt 中可用的選項。請參閱下面沃爾夫岡的評論,以了解解決此問題的更好方法。原答案如下:

幸運的是,我們仍然可以使用一些 Plain TeX 選項。我在這裡可以想到4個選擇:

\tolerance=10000

TeXbook 中是這樣建議的:

唉,滿箱的箱子又回來了;所以嘗試輸入

\tolerance=10000
\input story

以便看看會發生什麼。 TeX 將 10000 視為「無限」容差,允許任意寬的空間;因此,10000 的容差將絕不產生一個過滿的盒子,除非發生奇怪的事情,例如一個比列本身更寬的不可連字符的單字。

\emergencystretch=\maxdimen

再次來自TeXbook:

如果您想不惜一切代價避免箱子過滿而不嘗試手動修復它們,您可能會想設置 \tolerance=10000;這使得在困難的情況下任意糟糕的線路都是可以接受的。但無限容差並不是一個好主意,因為 TeX 無法區分非常糟糕和極其可怕的行。事實上,10000 的容差鼓勵 TeX 將所有不良行為集中在一個地方,從而形成一條真正難看的行,而不是兩條中等不良的行,因為根據規則,單次「註銷」產生的總缺陷最少。有一個更好的方法來獲得所需的效果:TeX 有一個名為 的參數,\emergencystretch在計算壞度和缺點時將其添加到每行的假定可拉伸性中,以防盒子過滿的情況,否則不可避免。如果 是正數,當第一次遍歷沒有找到滿足和 的\emergencystretch方法時,TeX 將在選擇換行符之前對段落進行第三次遍歷。的效果是縮小壞處,以便區分大無窮大和小無窮大。透過設定足夠高(基於),您可以確保永遠不會超過;因此,除非斷行任務確實不可能,否則永遠不會發生盒子過滿的情況。\pretolerance\tolerance\emergencystretch\emergencystretch\hsize\tolerance

\rightskip=0pt plus 1fil

再次摘自TeXbook:

例如,可以設置\rightskip=0pt plus1fil,則每行右側都會填充空格。但這並不是製作右邊距參差不齊的特別好方法,因為無限的可拉伸性會將非常短的行的不良度分配為零。

在這裡,我們可以接受非常短的行,因此我們可以愉快地做它告訴我們不要做的事情。

\spaceskip=\fontdimen2\font plus \maxdimen minus \fontdimen4\font

這具有允許單字空間無限延伸的效果,並產生與其他選項截然不同的效果。


在這個例子中,前三個選項都產生相同的效果:

(圖片無法上傳,稍後再編輯)

而最後一個選項有完全不同的效果:

(圖片無法上傳,稍後再編輯)

您可以將這些命令中的任何一個放置在文件中的任何位置,但為此目的,最簡單的方法是將它們添加到鍵中,style如下所示:

\setuphead[section][
  style=\tfe\em\emergencystretch=\maxdimen,
  align={flushleft, nothyphenated, fullhz, hanging, verytolerant, stretch},
  number=no,
  alternative=margin,
  after={\blank[4*line]},
]

一般來說,我更喜歡使用\emergencystretch=\maxdimen所有其他選項,因為它僅在存在任何超滿框時才生效。

相關內容