多行数学环境内和周围的间距究竟是如何确定的?

多行数学环境内和周围的间距究竟是如何确定的?

我尝试阅读各种资料(特别是 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 要么插入\abovedisplayskipand\belowdisplayskip\abovedisplayshortskipand \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 和\lineskip1pt(再次遵循 plain)这些设置可能真的有点奇怪,因为它们会导致间距不连续,当您逐渐减少\baselineskip两个框使其靠得更近,就像看不见的 1sp 一样小,但如果它们接触,它们的间距为 1pt。将\lineskiplimit和设置\lineskip为相同的值会给出一个在值上连续的间距\baselineskip,但是设置为 0pt 的目的\lineskiplimit可能是“直到最后一分钟”尝试保持基线间距。

这些设置在对齐中发挥作用,因为对齐通常是在每行\halign中用内联(但\displaystyle)数学构造的。行\halign就像段落的线一样堆叠,并且是主题\baselineskip\lineskip间距。

然而在开始显示之前,Latex(再次,遵循平原)会增加\baselineskip\lineskip并且\baselineskip会增加\jot

因此,尽管 10pt LaTeX 文档通常设置为\baselineskip12pt 的 a,但align它却是 15pt(并且\lineskip是 4pt 的 a,带有\lineskiplimit3pt 的 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 

排版为

在此处输入图片描述

相关内容