笔记:这个问题是关于增加垂直空间以补偿高符号。因此,它不是如何更改数学显示上方和下方的空白?。
我正在尝试修改我大学的论文课程,以产生显示数学的间距,使用双倍间距效果会更好一些(这是必需的)。我的想法是这样的:
- 显示的数学环境的上方和下方的距离应与典型文本行的顶部和前一行的底部之间的距离相同。特别是,即使略高于“通常”高度的符号也应降低基线。
- 在多行显示的数学环境(例如
align
或eqnarray
)中,基线之间的距离应该与 相同,\baselineskip
除非这会导致符号之间的距离低于(比如说)6pt
,在这种情况下应该降低基线,以便符号之间的距离正好是8pt
。
例如,在下面的文档中,Z=
需要增加两行之间的空间,并且底部数学行下方的空间需要进一步增加。
如何实现这一点?(通过改变序言中的设置;我正在编写文档类,而不是玩弄特定的数学运算。)
以下是我目前得到的信息:
\documentclass[10pt]{article}
%Code that belongs in the class file:
\makeatletter
\RequirePackage[doublespacing]{setspace}
\AtBeginDocument{%
% \lineskiplimit=0pt%
% \lineskip=\dimexpr\baselineskip-\f@size pt\relax%
\abovedisplayshortskip=0pt%
\belowdisplayshortskip=0pt%
\abovedisplayskip=0pt%
\belowdisplayskip=0pt%
\jot=0pt%
}
\makeatother
%Code that belongs in the preamble:
\usepackage{amsmath}
\usepackage{lipsum}
\begin{document}
\lipsum*[2]
\begin{align*}
f \colon X &\to Y \\
x &\mapsto y \\
Z &= \left\lfloor\frac{\mathcal E \hat{} \otimes \mathcal E}{g\mathcal E \hat{} \otimes \mathcal E} \right\rfloor \\
Z &= \left\lfloor\frac{\mathcal E \hat{} \otimes \mathcal E}{g\mathcal E \hat{} \otimes \mathcal E} \right\rfloor
\end{align*}
\lipsum*[2]
\end{document}
答案1
我同意@egreg(尤其是)的观点,即排版 10/20pt 不是好排版的标志。我在我的论文中提到了关于这种不良做法的特别而广泛的通知论文模板。但从技术角度来看,这个问题非常有趣,而且似乎并不简单。这就是我尝试一些东西的原因……
我们需要在两种模式之间切换:
普通段落,where
\lineskiplimit=0pt
是不错的选择,因为文内求和或积分可以在这里发生,但主要偏好是在这里保持等距基线跳跃。\lineskiplimit
这里也可以尝试否定,因为罕见的文内高大对象可能不会正好位于彼此之上。显示数学,其中
\lineskiplimit=10pt
,\lineskip=10pt
是解决所需任务的不错选择。
最困难的问题在于这两种模式之间的边界,尤其是下面的显示公式:下一个段落的第一行设置为零\lineskiplimit
,需要将支柱插入到第一行中。这可以通过\aftergroup
和\belowdislayABCD
宏来解决。此外,我们还要测试段落是否在这里结束。
此外,我还解决了以下问题:
我破坏了显示中本地命名的支柱,
\strut@
因为它严重干扰了正向\lineskiplimit
设置。我设置了正确的值
\strutbox
以使数组环境正常工作。请注意,这是setspace/doublespacing
包的一个错误。如果我们不做其他更改(仅使用此包),则\begin
/生成的矩阵\end{array}
是错误的。我将
\above
/设置below*skip
为零。这将产生段落行和显示行(如果没有高)的网格。如果需要添加额外空间,可以在此处设置正值。
我的实验不作任何保证。这不是最终的解决方案,只是进一步研究的材料。正常文档很可能会出现一些问题,并且这些更改可能会干扰大量 LaTeX 软件包。
\documentclass[10pt]{article}
%Code that belongs in the class file:
\makeatletter
\RequirePackage[doublespacing]{setspace}
\AtBeginDocument{%
\abovedisplayshortskip=0pt
\belowdisplayshortskip=0pt
\abovedisplayskip=0pt
\belowdisplayskip=0pt
\jot=0pt
\everydisplay={\lineskiplimit=10pt \lineskip=10pt \normallineskiplimit=10pt
\let\strut@=\relax
\setbox\strutbox=\hbox{\vrule height8pt depth4pt width0pt}
\aftergroup\belowdisplayA}
}
\makeatother
\def\belowdisplayA {\afterassignment\belowdisplayB \let\tmp= }
\def\belowdisplayB {\ifx\tmp\spacetoken \expandafter \belowdisplayC
\else \expandafter\belowdisplayD \fi}
\def\belowdisplayC {\afterassignment\belowdisplayD \let\tmp= }
\def\belowdisplayD {\raise20pt\vbox{}\ifx\tmp\par \vskip-\baselineskip \fi \tmp}
\edef\tmp{\let\noexpand\spacetoken= \space}\tmp
%Code that belongs in the preamble:
\usepackage{amsmath}
\usepackage{lipsum}
\begin{document}
\lipsum*[2]
\begin{align*}
%Z &= \left\lfloor\frac{\mathcal E \hat{} \otimes \mathcal E}{g\mathcal E
%\hat{} \otimes \mathcal E} \right\rfloor \\
f \colon X &\to Y \\
x &\mapsto y \\
Z &= \left\lfloor\frac{\mathcal E \hat{} \otimes \mathcal E}{g\mathcal E
\hat{} \otimes \mathcal E} \right\rfloor \\
Z &= \left\lfloor\frac{\mathcal E \hat{} \otimes \mathcal E}{g\mathcal E
\hat{} \otimes \mathcal E} \right\rfloor
\end{align*}
This is a display formula with matrix. This is a display formula with matrix.
$$
a=b, \quad
{1\over2}
\left(\begin{array}{cc|c}
a & b & c \\
d & e & f
\end{array}\right)
$$
This is a simple display formula. This is a simple display formula.
$$
a=b
$$
\lipsum*[2]
\end{document}