我使用 ConTeXt 已有几年了,我很清楚,确定换行符的算法并不是孤立地查看每一行,而是基本上试图将整个段落的“糟糕程度”降至最低。因此,有时,行数过满只是“游戏的一部分”,必须通过使用或hz
、fullhz
或等hanging
来最小化。tolerant
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
看起来像这样:
我怎样才能告诉算法休息单词“headings”之前的行,而不是使用满框。 中的选项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 中可用于解决此问题的所有选项。请参阅下面 Wolfgang 的评论,了解解决此问题的更好方法。原始答案如下:
幸运的是,我们仍然可以使用一些 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
所有其他选项,因为它只有在箱子过满时才会生效。