自动避免线条拉伸

自动避免线条拉伸

我希望不惜一切代价避免线条拉伸,而不是手动强制拉伸。我将为您提供一个例子来阐明我的意思。

代码如下:

\documentclass{article}

\begin{document}
 \textbf{Standard output:}

 This is for test purposes. This is just for test purposes. This is for test purposes. This is for test purposes. This is just for test purposes. This is for test purposes.

 \textbf{Desired output:}

 This is for test purposes. This is just for test purposes. This~is~for~test~purposes. This is for test purposes. This is just for test purposes. This~is~for~test~purposes.
\end{document}

换句话说,我希望序言中有一些命令可以帮我省去添加所有那些 ~ 符号的工作。为了确保您理解,我想不惜一切代价在一行中放入更多单词。

答案1

如果仔细查看所需的输出,您会注意到:第二行上的连字符比第一行上的连字符突出一点(准确地说是 1.88937pt)。所以我不会尝试重新创建它。

相反,值得了解的是 TeX 引擎中与换行相关的几个参数:

  • \pretolerance是 TeX 愿意说一个段落已经足够好的水平,甚至不需要尝试连字。默认情况下,它设置为 100,这意味着它可以稍微拉伸空格,但不能拉伸太多。还有一个\tolerance设置,用于设置即使在连字之后允许的不良程度,默认情况下为 200。¹
  • \hyphenpenalty是一行中出现连字符的惩罚。默认设置为 50。因此,TeX 会尽力将每段的连字符数控制在不超过 4 个。

这两个参数足以让你接近你想要的输出。我们可以把

\pretolerance=0
\hyphenpenalty=0

在前言中,我们几乎可以得到指定的输出。第二行会有些不同,因为如上所述,即使使用连字符,也无法使行适合,尽管间距不是太差。

Ulrike 在她的回答中提出了另一种可能性,即干预当前字体的字体尺寸并消除所有可拉伸性。但这会导致与原始输出相同的问题,将段落第二行的输出再次稍微放入边距中。为了完整起见,与间距相关的字体尺寸是:

  • \fontdimen2单词间距 (⅓ em)
  • \fontdimen3词间延伸 (⅙ em)
  • \fontdimen4词间缩小 (⅟₉ em)
  • \fontdimen7句末有额外空格(⅟₉ em)

我认为这些值不是很好。在我的排版课上,默认的单词间距是 ¼ em,缩小到 ⅕ em 或扩大到 ⅓ em,这将产生以下值

\fontdimen2\font = 0.25em % ¼
\fontdimen3\font = 0.0833em % ⅓ - ¼
\fontdimen4\font = 0.05em % ¼ - ⅕

我会编辑排版时使用的字体的 VF 文件Serif 杂志以反映这些数字,因为旧的 afm2tfm 工具默认会使用更广泛的 TeX 默认值。

\pretolerance值得注意的是,将这些设置添加到原始文档中后,您将获得使用我的和设置获得的换行符,而\hyphenpenalty无需设置它们使用 s 修复设置中的换行问题~。添加\frenchspacing(以摆脱 TeX 排版的另一个方面,即在段落中放置过多的空白)并且所有内容始终设置为相同。


  1. 如果您\sloppy在 LaTeX 中这样做\tolerance,则将其设置为 10,000,就 TeX 而言,这是无穷大。这就是为什么您经常会看到这种情况,尤其是在设置了\sloppy段落的窄列中,其中只有一行在两个单词之间有一个巨大的空格,而段落的其余部分则正常。可以说,TeX 将无穷大设置得有点太低了(这是使用 16 位值保存整数值的结果,这种选择在 1982 年比在 2021 年更有意义),并且不需要太多的拉伸就可以达到无穷大,并且拥有一条非常糟糕的线条比拥有多条糟糕但又无限糟糕的线条要好。

答案2

\documentclass{article}
\begin{document}
 \textbf{Standard output:}

 \fontdimen3\font =0pt This is for test purposes. This is just for test purposes. This is for test purposes. This is for test purposes. This is just for test purposes. This is for test purposes.

 \textbf{Desired output:}

 This is for test purposes. This is just for test purposes. This~is~for~test~purposes. This is for test purposes. This is just for test purposes. This~is~for~test~purposes.
\end{document}

相关内容