我尝试阅读各种资料(特别是 Tex By Topic;我没有 TeXBook 的副本)并自己进行实验,但我仍然不清楚多行数学环境中的行距究竟是如何由参数决定的
\abovedisplayskip
,,,,\belowdisplayskip
\abovedisplayshortskip
\belowdisplayshortskip
\lineskip
,\lineskiplimit
\jot
有人可以准确解释跳过是如何计算的吗?(理想情况下,它应该包括当这些参数中的一个或多个为负时会发生什么的描述。)
\lineskip
我对和特别感兴趣\lineskiplimit
,因为我从中看到了一些奇怪的结果。
对于 MWE,请参见设置显示数学运算上方和下方的最小空间
答案1
您的三类跳过在行为上几乎完全不同:
\abovedisplayskip
,,,,\belowdisplayskip
\abovedisplayshortskip
\belowdisplayshortskip
\lineskip
,,\lineskiplimit
\baselineskip
\jot
第一组仅与(原始)显示数学和包含它的部分段落之间的边界有关。
第二组(我添加了\baselineskip
)与数学根本没有直接关系,并且控制 TeX 在垂直模式下堆叠盒子的方式,特别是(但不仅限于)在堆叠由将段落分成行而构建的水平盒子时。
第三个,,\jot
是使用 latex 格式声明的 dimen 寄存器(从 plain 复制而来)。
与组不同lineskip
,组本质上是“目标”长度,指定 TeX 应如何尝试定位垂直堆叠的框,而组 displayskip
是更简单的构造:指定的长度在显示数学构造之前和之后完整添加$$
。您询问负数设置,这些设置不会得到不同的处理,您总是会得到指定的空间。
\documentclass{article}
\usepackage{amsmath}
\showoutput
\showboxdepth3
\parindent0pt
\begin{document}
\baselineskip=12pt
\abovedisplayskip=10pt
aaa\dotfill aa
$$x$$
bb
\end{document}
生产
...\hbox(4.30554+0.0)x345.0, glue set 319.99992fill []% a line
...\penalty 10000
...\glue(\abovedisplayskip) 10.0
...\glue(\baselineskip) 7.69446
...\hbox(4.30554+0.0)x5.71527, shifted 169.64236, display []% x math
...\penalty 0
...\glue(\belowdisplayskip) 10.0 plus 2.0 minus 5.0
...\glue(\baselineskip) 5.05556
...\hbox(6.94444+0.0)x345.0, glue set 333.88885fil []% b line
同一文档,将 更改\abovedisplayskip
为 -10pt 会产生
...\hbox(4.30554+0.0)x345.0, glue set 319.99992fill []%a line
...\penalty 10000
...\glue(\abovedisplayskip) -10.0
...\glue(\baselineskip) 7.69446
...\hbox(4.30554+0.0)x5.71527, shifted 169.64236, display []%x math
...\penalty 0
...\glue(\belowdisplayskip) 10.0 plus 2.0 minus 5.0
...\glue(\baselineskip) 5.05556
...\hbox(6.94444+0.0)x345.0, glue set 333.88885fil []%b line
它们的间距完全相同,只是数学符号高出 20pt,并覆盖了上面的线。
TeX 要么插入\abovedisplayskip
and\belowdisplayskip
或
\abovedisplayshortskip
and \belowdisplayshortskip
(绝不混合),并且(大致)如果段落的最后一行不与数学重叠,它会使用短格式,因此
blah blah blah blah
x=1
会得到\abovedisplayskip
但是
blah
x=1
将得到\abovedisplayshortskip
由于可能存在方程编号和其他细节,因此计算重叠的确切规则很复杂,我现在将忽略这些细节,但值得注意的是,这里的机制是经典 TeX 中可用的唯一方法,用于测量段落最后一行的长度,该长度显示\predisplaysize
在显示数学中,几个软件包使用隐藏的显示数学块只是为了这种用途。
上面的框输出也显示了的效果,\baselineskip
但与不同\abovedisplayskip
,\baselineskip
通常不会完整添加,它是垂直堆叠框基线的目标间距。
这里a...a
线的深度为零(0.0
中的...\hbox(4.30554+0.0)x345.0
),数学x
高度为 4.3pt(4.30554
中的...\hbox(4.30554+0.0)x5.71527
,以便安排这些框的基线间隔 12pt(指定的值\baselineskip
),TeX 插入 12pt-4.3pt=7.7pt,如下所示请...\glue(\baselineskip) 7.69446
注意,它纯粹根据前一个框的深度和当前框的高度进行此计算,忽略\abovedisplayskip
可能由于其他原因插入的任何其他胶水(此处)。
插入的自动\baselineskip
胶水量永远不会小于\lineskiplimit
如果低于该值(因为前一行有很大的深度或者当前行有很大的高度)则 TeX 放弃强制等距行的尝试并仅\lineskip
在行之间插入胶水(完整)。
LaTeX 默认设置\lineskiplimit
为 0pt 和\lineskip
1pt(再次遵循 plain)这些设置可能真的有点奇怪,因为它们会导致间距不连续,当您逐渐减少\baselineskip
两个框使其靠得更近,就像看不见的 1sp 一样小,但如果它们接触,它们的间距为 1pt。将\lineskiplimit
和设置\lineskip
为相同的值会给出一个在值上连续的间距\baselineskip
,但是设置为 0pt 的目的\lineskiplimit
可能是“直到最后一分钟”尝试保持基线间距。
这些设置在对齐中发挥作用,因为对齐通常是在每行\halign
中用内联(但\displaystyle
)数学构造的。行\halign
就像段落的线一样堆叠,并且是主题\baselineskip
和\lineskip
间距。
然而在开始显示之前,Latex(再次,遵循平原)会增加\baselineskip
,\lineskip
并且\baselineskip
会增加\jot
。
因此,尽管 10pt LaTeX 文档通常设置为\baselineskip
12pt 的 a,但align
它却是 15pt(并且\lineskip
是 4pt 的 a,带有\lineskiplimit
3pt 的 a(假设标准\jot
为 3pt)
\documentclass{article}
\usepackage{amsmath}
\showoutput
\showboxdepth3
\parindent0pt
\begin{document}
\baselineskip=12pt
aaaa\dotfill aa
\begin{align}1\\
2
\showthe\baselineskip
\showthe\lineskiplimit
\showthe\lineskip
\\3
\end{align}
\jot=10pt
aaa\dotfill aa
$$x$$
bb
aaaa\dotfill aa
aaaa\dotfill aa
\begin{align}1\\
2
\showthe\baselineskip
\showthe\lineskiplimit
\showthe\lineskip
\\3
\end{align}
\end{document}
第一场align
演出
> 15.0pt.
<argument> 1\\ 2 \showthe \baselineskip
> 3.0pt.
<argument> ...aselineskip \showthe \lineskiplimit
> 4.0pt.
<argument> ...e \lineskiplimit \showthe \lineskip
第二个
> 22.0pt.
<argument> 1\\ 2 \showthe \baselineskip
> 10.0pt.
<argument> ...aselineskip \showthe \lineskiplimit
> 11.0pt.
<argument> ...e \lineskiplimit \showthe \lineskip
排版为