我喜欢 (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
为您想要的理想宽度、可拉伸性和可收缩性的任何值即可。