这个问题导致了一个新的方案的出现:
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%
}