我过去认为这就是决定环境\jot
中行间距的因素。gather
align
但设置
\def\jot{0pt}
有了这个 MWE,我可以指定我想要的正确间距
\documentclass{article}
\usepackage{amsmath}
\setlength{\fboxsep}{0pt}
\setlength{\fboxrule}{.1pt}
\begin{document}
\renewcommand\arraystretch{0}
\[
\begin{array}{c}
\fbox{$a=b$} \\[0pt] % exact height between rows
\fbox{$\dfrac22$}
\end{array}
\]
\end{document}
所以我的问题是 amsmath 环境中行与行之间使用的精确间距是多少?这样我就可以在这里将其\\[...]
与上面 MWE 中的数组环境指定为相同吗?
回顾:
我需要的只是一个维度数字(类似34.1pt
),但它必须是精确的。目测间距是不行的。需要根据源代码进行证明。
答案1
这不是一个完全自动化的解决方案,而是为了重现距离,
- 在每一行上添加一个支撑
\baselineskip
(通常array
环境会自动执行,如果\arraystretch
是1
,且\baselineskip
等于\normalbaselineskip
;尽管如此,我们还是想对行距进行一些调整,我们将手动执行此操作--请参阅下面的注释) - 然后,距离就是
\jot
如果线“不高”(特别是如果内部框不互相接触),否则\jot+\lineskip
。
在此特定情况下,可以通过以下方式重现:
%! TEX program = lualatex
\documentclass{article}
\usepackage{prettytok} % ← alternatively comment this out and replace \pretty:x with \tl_show:x. This is just for debug printing
\usepackage{amsmath}
\usepackage{zref-savepos}
\begin{document}
%\def\texta{\dfrac22}
\def\texta{a=b}
\def\textb{\dfrac22}
%\def\textb{a=b}
\begin{gather*}
\texta \zsavepos{a1} \\
\textb \zsavepos{b1}
\end{gather*}
\[
\edef\oldlineskip{\the\lineskip}
\def\arraystretch{0}
\begin{array}{c}
\texta \zsavepos{c1} \strut
\\[0pt]\\[\dimexpr\jot+\oldlineskip\relax]
%\\[0pt]\\[\jot]
\textb \zsavepos{d1} \strut
\end{array}
\]
\ExplSyntaxOn
\pretty:x{
\int_eval:n{\zposy{a1} - \zposy{b1}}sp
=
\int_eval:n{\zposy{c1} - \zposy{d1}}sp
}
\ExplSyntaxOff
\end{document}
(您需要\oldlineskip
因为\lineskip
在环境中设置为 0。array
或者,只需对 的默认值进行硬编码\lineskip
,即3pt
。)
证明zref-savepos
垂直长度相等。
然而,如果\textb
改为a=b
,则垂直框不会互相“接触”,并且您需要第二个版本(\\[\jot]
)来获得相同的间距。
笔记:Struts 并不总能正确地重现 TeX 间隔基线的行为——例如,我认为如果在一个align
环境中两行都有height=0
和,depth=0.5\baselineskip
那么基线跳跃将正好是\baselineskip
;然而,如果添加了支柱,下面行的高度就会变成0.7\baselineskip
,而距离将会变成类似于1.2\baselineskip+\lineskip
?
要自动确定...我认为有两种方法
你需要把内容分别放入两个框中,然后取
\dp
上一行的 与\ht
下一行的 ,将它们相加并与 进行比较\baselineskip
。或者,使用 zref-savepos 本身并检查两条线是否
\baselineskip
分开,在这种情况下添加\lineskip
。
示例(然而这可能需要最多 3 次编译,或者在某些情况下可能需要 4 次……?)
确保你理解代码的作用并进行相应的修改如果引用名称/辅助宏名称冲突等,您就会遇到麻烦。
%! TEX program = lualatex
\documentclass{article}
\usepackage{prettytok} % ← alternatively comment this out and replace \pretty:x with \tl_show:x. This is just for debug printing
\usepackage{amsmath}
\usepackage{zref-savepos}
\begin{document}
%\def\texta{\dfrac22}
\def\texta{a=b}
%\def\textb{\dfrac22}
\def\textb{a=b}
\begin{gather*}
\texta \zsavepos{a1} \\
\textb \zsavepos{b1}
\end{gather*}
% if this is first run \extradistance will be undefined
\ifx\extradistance\relax
\gdef\extradistance{0pt}
\fi
% then compute extradistance
\ifdim
\dimexpr \zposy{c1}sp - \zposy{d1}sp \relax
=
\dimexpr \extradistance+\baselineskip \relax
% the rows appears to be short, don't need add \lineskip
\xdef\extradistance{\the\dimexpr\jot\relax} % \jot is probably not an internal dimen but just in case
\else
% otherwise, add \lineskip
\xdef\extradistance{\the\dimexpr\jot+\lineskip\relax}
\fi
\makeatletter
% store the extradistance to aux file
\write\@auxout{\gdef\noexpand\extradistance{\extradistance}}
\makeatother
\[
\def\arraystretch{0}
\begin{array}{c}
\texta \zsavepos{c1} \strut
\\[0pt]\\[\extradistance]
\textb \zsavepos{d1} \strut
\end{array}
\]
\ExplSyntaxOn
\pretty:x{
\int_eval:n{\zposy{a1} - \zposy{b1}}sp
=
\int_eval:n{\zposy{c1} - \zposy{d1}}sp
}
\pretty:x{
\dim_to_decimal_in_sp:n {\jot+\baselineskip}sp
}
\ExplSyntaxOff
\end{document}