
我已經使用 ConTeXt 幾年了,我很清楚確定換行符的演算法並不是孤立地查看每一行,而是基本上試圖最小化整個段落的「壞處」。因此,有時,過滿的行只是「遊戲的一部分」 ,必須透過使用hz
or fullhz
、hanging
、tolerant
or等來最小化。verytolerant
stretch
然而我現在面臨的情況是真的喜歡絕對地、完全地、最終地、永遠地防止剖面頭中的線條過滿。也就是說,根據 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
為了避免在關閉連字號時出現文字不齊的過滿行,您可以將關鍵字新增broad
至align
選項以改善換行。
\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
所有其他選項,因為它僅在存在任何超滿框時才生效。