当大量使用 \phantom、\mathrlap 等时,如何修复数学间距?

当大量使用 \phantom、\mathrlap 等时,如何修复数学间距?

这个问题导致了一个新的方案的出现:
underoverlap

介绍

基于这个问题进而这个问题,我正在尝试完善\overunderbrace宏。现在,我正在尝试正确设置间距。

最小工作示例

\documentclass[varwidth=20cm,margin=3mm]{standalone}

\usepackage{mathtools}
\usepackage{xcolor}

\makeatletter
\def\overunderbrace#1#2#3{%
    \begingroup%
    \let\overunderbrace@sup\empty%
    \let\overunderbrace@sub\empty%
    \ignorespaces%
    \@ifnextchar^{%
        \@overunderbracesup{#1}{#2}{#3}%
    }{%
        \ignorespaces%
        \@ifnextchar_%
            {\@overunderbracesub{#1}{#2}{#3}}%
            {\@overunderbrace   {#1}{#2}{#3}}%
    }%
}

\def\@overunderbracesup#1#2#3^#4{%
    \def\overunderbrace@sup{#4}%
    \ignorespaces%
    \@ifnextchar_%
        {\@overunderbracesub{#1}{#2}{#3}}%
        {\@overunderbrace   {#1}{#2}{#3}}%
}

\def\@overunderbracesub#1#2#3_#4{%
    \def\overunderbrace@sub{#4}%
    \ignorespaces%
    \@ifnextchar^%
        {\@overunderbracesup{#1}{#2}{#3}}%
        {\@overunderbrace   {#1}{#2}{#3}}%
}

\def\@overunderbrace#1#2#3{%
    \mathrlap{\overbrace{\textcolor{red}{#1#2}}^{\mathclap{\overunderbrace@sup}}}%
    #1%
    \mathrlap{\underbrace{\textcolor{green}{#2#3}}_{\mathclap{\overunderbrace@sub}}}%
    #2%
    #3%
    \endgroup%
}
\makeatother

\newcommand{\config}[2]{\left\langle\,#1, #2\,\right\rangle}

\begin{document}
    $$
        \config{F\vphantom{F'}}{p}
        \longrightarrow
        \config{F'}{p}
        \longrightarrow
        \config{F'}{p'}
        \longrightarrow
        \cdots
    $$
    $$
        \overbrace
            {\config{F\vphantom{F'}}{p}\longrightarrow\config{F'}{p}}^{test}
        \longrightarrow
        \config{F'}{p'}
        \longrightarrow
        \cdots
    $$
    $$
        \overunderbrace
            {\config{F\vphantom{F'}}{p}\longrightarrow}
            {\config{F'}{p}}
            {\longrightarrow\config{F'}{p'}}
            ^{\text{environmental}}
            _{\text{local}}
        \longrightarrow
        \cdots
    $$
\end{document}

在此处输入图片描述

如您所见,括号与内容在水平方向上未对齐。

笔记

这里的代码\@overunderbrace可能看起来(不必要地)比以下代码更复杂:我所依据的答案,但那是因为我试图设置一个重复模式,所以我们可以得到不止两个重叠的括号。这样做的方法似乎是:

  • 将 [brace 1] 与 [phantom+rlap 参数 1+2] 一起设置
  • 设置 [参数 1]
  • 设置 [括号 2 与 [phantom+rlap 参数 2+3]
  • 设置 [参数 2]
  • ETC...

诊断

为了诊断问题,我替换了\phantom以下\textcolor代码:

\def\@overunderbrace#1#2#3{%
    \mathrlap{\overbrace{\textcolor{red}{#1#2}}^{\mathclap{\overunderbrace@sup}}}%
    #1%
    \mathrlap{\underbrace{\textcolor{green}{#2#3}}_{\mathclap{\overunderbrace@sub}}}%
    #2%
    #3%
    \endgroup%
}

在此处输入图片描述

黑色输出与上图相同。红色(绿色)内容是上(下)支撑所依据的位置。

我突然想到 TeX 根据数学“原子”各自的类型(ord、bin、rel 等)确定它们之间的间距。我通过重新排序、重新排列这些段来打乱这个\phantom过程\mathrlap

尝试的解决方案

因此我增强了形式参数,确保它们总是遇到相同的“环境”(尽我所能):

\def\@overunderbrace#1#2#3{%
    \@@overunderbrace%
        {\mathord{}#1\vphantom{#2}}%
        {\vphantom{\mathord{}#1}#2\vphantom{#3\mathord{}}}%
        {\vphantom{#2}#3\mathord{}}%
}

\def\@@overunderbrace#1#2#3{%
    ... the old \@overunderbrace ...
}

在此处输入图片描述

为了进行比较,我添加了相同的公式,但不添加任何括号,然后只添加了过度括号(来自 TeX 命令)。如您所见,不再显示任何颜色(除了我手动添加的标尺),因此打印的内容与其幻影图像对齐。

这个解决方案是可用的,但从比较中可以看出,间距仍然不正确。可能是因为它现在连续两次使用了一些“原子间”胶水。

这是我放弃并寻求帮助的地方。

问题:在这样的设置中我怎样才能获得完美的间距?

答案1

很好的色彩调试(+1 :-)

#1您可以测量和之间的正常额外空间#2,然后重新插入它:

在此处输入图片描述

\def\@overunderbrace#1#2#3{%
    \setbox\z@\hbox{${#1#2}$}\setbox\tw@\hbox{${#1}{#2}$}\dimen@\dimexpr\wd\z@-\wd\tw@
    \mathrlap{\overbrace{\textcolor{red}{{#1#2}}}^{\mathclap{\overunderbrace@sup}}}%
    {#1}%
    \kern\dimen@
    \mathrlap{\underbrace{\textcolor{green}{{#2#3}}}_{\mathclap{\overunderbrace@sub}}}%
    {#2%
     #3}%
    \endgroup%
}

相关内容