例子

例子

我喜欢 (La)TeX 默认在句子之间添加额外的空格,但我发现对于大多数字体来说,默认设置会使句子间的空格与常规空格相比过于“有弹性”,而当一行必须被拉伸才能实现完全对齐时。

我想调整我的文档类,使其在句号和问号等后面添加额外的空格,但这样这些空格就会比常规空格大持续的数量:它们仍应伸展以实现完全对齐,但它们应该伸展不多于常规空间将会延伸。

(例如,如果常规空间为 3.3pt,句间空间为 4.4pt 且没有拉伸,则如果给定行上的常规空间拉伸到 4.3pt,则句间空间应该拉伸到 5.4pt,并且拉伸的幅度不应超过常规空间。)

或者至少我认为那是我想要的。我还没有真正实现它,所以很难确定我是否会喜欢它!

我读了第 20 章TeX 按主题分类,它处理了一些问题。有些时候我有点不明白,但据我所知,值\fontdimen7,即句号和问号后的额外空格,只有在\sfcode为相关标点符号设置的空间因子为 2000 或更大时才会使用。但是,根据定义,生成的空间的“拉伸度”乘以 2。如果空间因子小于 2000,则不会添加额外空间,如本例所示:

\documentclass[12pt]{article}
\usepackage{kantlipsum}

\begin{document}
% this sets a really high fontdim7 to make it obvious 
% when the extra space is added
\fontdimen7\font=15pt

\sfcode`.=2000

\kant[1]

% i really want this to be 1000, but anything lower than 2000 makes
% \fontdimen7 irrelevant
\sfcode`.=1999

\kant[1]

\end{document}

有没有办法实现非法语间距,其中添加的额外空间是一个恒定量?

答案1

是的,这是可能的。例如,你可以这样做

\xspaceskip=\fontdimen2\font plus \fontdimen3\font minus \fontdimen4\font
\advance\xspaceskip by \fontdimen7\font

例子

结果

\hsize = 0.7\hsize
\parindent=0pt

\bigskip Without stretch:

In this line. Do spaces stretch? Equally or not?

\bigskip Default stretch:

\line{In this line. Do spaces stretch? Equally or not?}

\xspaceskip=\fontdimen2\font plus \fontdimen3\font minus \fontdimen4\font
\advance\xspaceskip by \fontdimen7\font

\bigskip Modified stretch:

\line{In this line. Do spaces stretch? Equally or not?}

\bye

查看默认值

首先,为了了解“正常”粘合值是什么,以及这些值是如何计算的,您可以尝试使用以下文件tex

A sentence. Another.
\tracingoutput=1 \tracingonline=1 \showboxbreadth=30
\bye

或者,使用 LaTeX:

\documentclass{article}
\begin{document}
A sentence. Another.
\showoutput
\end{document}

(您还可以添加\showthe\fontdimen7\font\showthe\sfcode`.来查看相应的值。)输出显示的是词间粘合和句子间粘合分别是:

3.33333 plus 1.66498 minus 1.11221
4.44444 plus 4.99997 minus 0.37036

\documentclass[12pt]{article}当然具有更大的值。

这些是从哪里来的?TeX 如何决定空格?

TeX 如何将空格变成胶水

第 75-76 页对此进行了解释TeXbook(另请参阅如何在 TeX 中找到空格的长度?) 基本上,TeX 维护一个称为当前“空间因子”的整数(表示为f),该整数在每个字符(水平列表中的每个框)之后更新。

  • 最初(大多数时候)f是 1000。

  • 每个字符都有一个\sfcode。默认情况下,大写字母 (AZ) 的 值为 999,其他所有字符的 值为 1000。此外,纯 TeX 还\sfcode为其他一些字符设置了 :

    • )']0,
    • (以下\nonfrenchspacing.?!3000
    • (以下\nonfrenchspacing:至2000年,
    • (以下\nonfrenchspacing;至 1500,
    • (以下\nonfrenchspacing,至 1250。

    实际上,\nonfrenchspacing和的唯一效果\frenchspacing是分别将上述字符的 s 设置\sfcode为上述值和重新设置为 1000。在字符 等于\sfcode某个数字(例如g)之后, 的效果f是:

    • 如果g = 0,则f保持不变。
    • 如果f < 1000 < g,则f获取值 1000。(考虑M.
    • 否则,f获取的值g
  • 还有正常的单词间粘连。如果\spaceskip设置为非零,则为\spaceskip。否则它来自字体:具体来说,它是\fontdimen2\font plus \fontdimen3\font minus \fontdimen4\font。无论它是什么(无论是来自\spaceskip还是字体),我们都假设它是<x> plus <y> minus <z>,这意味着理想宽度为的粘连X,拉伸性是,收缩性为

明白了吗?很好,现在当 TeX 遇到空格时,它会按如下方式计算粘连:

  • 如果f ≥ 2000\xspaceskip非零,则粘合完成\xspaceskip。完成。(忽略以下所有情况。)否则,
  • 如上所述,假设“正常”的单词间粘合(来自\spaceskip或字体)是<x> plus <y> minus <z>
  • 如果f ≥ 2000那么“理想”的宽度是<x> + \fontdimen7\font。这里添加的是来自字体的“额外空间”参数。
  • 拉伸率为y * f/1000。(即法向拉伸乘以f/1000。)
  • 收缩率为z * 1000/f。(即正常收缩乘以1000/f。)

结论

就这个问题而言,要记住的主要一点是,在拥有 3000 的正常数量的\nonfrenchspacing情况下,.\sfcode

  • 单词间粘合度要么是\spaceskip(如果非零),要么\fontdimen2\font具有可拉伸性\fontdimen3\font和可收缩性\fontdimen4\font
  • 句子间粘合度\xspaceskip(如果非零)或者\fontdimen7\font大于词间粘合度(如上所述),其可拉伸性是词间粘合度的 3 倍,可收缩性是其 1/3。

请注意,在默认设置下,句子间粘合的可拉伸性是单词间粘合的三倍,这就是您所抱怨的。但要改变这一点,您真的不必费心\sfcode;您只需将\spaceskip和设置\xspaceskip为您想要的理想宽度、可拉伸性和可收缩性的任何值即可。

相关内容