如何绝对防止 ConTeXt 中的行过满?

如何绝对防止 ConTeXt 中的行过满?

我使用 ConTeXt 已有几年了,我很清楚,确定换行符的算法并不是孤立地查看每一行,而是基本上试图将整个段落的“糟糕程度”降至最低。因此,有时,行数过满只是“游戏的一部分”,必须通过使用或hzfullhz或等hanging来最小化。tolerantverytolerantstretch

然而,我现在面临的情况是真的喜欢绝对、彻底、最终和永远防止节头中出现过满的行。也就是说,无论根据 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

为了避免在禁用连字符时出现文本过满且不整齐的情况,您可以将关键字添加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 中可用于解决此问题的所有选项。请参阅下面 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所有其他选项,因为它只有在箱子过满时才会生效。

相关内容