回顾:

回顾:

我过去认为这就是决定环境\jot中行间距的因素。gatheralign

在此处输入图片描述

但设置

\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环境会自动执行,如果\arraystretch1,且\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}

也可以看看https://tex.stackexchange.com/a/95915/250119

相关内容