这个问题导致了一个新的方案的出现:
underoverlap
我一直\overunderbrace
在使用这个答案。对于简单的示例,它工作得很好,但由于原始定义使用\vcenter
,当“内容”的轴未与其垂直中心对齐时,垂直对齐不正确。例如,为了在以下公式中获得正确的对齐,我不得不对进行一些手动调整\raisebox
。不理想。
我正在尝试完善宏;也许编写一个小包。(有几种可能的扩展,例如,\underoverbrace
自定义垂直间距、自定义大括号命令(\underoverline
)等。)
问题:除了“天真地”使用\vcenter
,有没有办法将整个结构升高/降低到所需的精确量,以使其轴与“内容”(即中的一行\halign
)的轴对齐?
我想到了几种可能的解决方案:
- 对我来说,最简单的方法是向宏添加两个可选参数,分别用于括号前后的内容。然后我可以将它们放在“内容行”中。但我宁愿不这么做。
- 如果必须的话,我大概可以测量各个部分并计算出正确的升高/降低量。
我只是希望有一个我还不知道的更简单的解决方案。
编辑:以下是基于原始答案的示例的错位的简单 MWE:
\documentclass{article}
\makeatletter
\def\overunderbrace#1#2#3{%
\begingroup
\let\overunderbrace@sup\empty
\let\overunderbrace@sub\empty
\@ifnextchar^%
{\@overunderbracesup{#1}{#2}{#3}}%
{\@ifnextchar_%
{\@overunderbracesub{#1}{#2}{#3}}%
{\@overunderbrace{#1}{#2}{#3}}%
}%
}
\def\@overunderbracesup#1#2#3^#4{%
\def\overunderbrace@sup{#4}%
\@ifnextchar_%
{\@overunderbracesub{#1}{#2}{#3}}%
{\@overunderbrace{#1}{#2}{#3}}%
}
\def\@overunderbracesub#1#2#3_#4{%
\def\overunderbrace@sub{#4}%
\@ifnextchar^%
{\@overunderbracesup{#1}{#2}{#3}}%
{\@overunderbrace{#1}{#2}{#3}}%
}
\def\@overunderbrace#1#2#3{%
\mathop {\vcenter {\m@th \ialign {##&##&##\crcr
\noalign {\kern 3\p@}%
\span\omit\hfil\hbox{\vbox to 0pt{\vss\hbox{\vbox{\hbox{$\m@th\scriptstyle\overunderbrace@sup$}\vspace{0pt}}}}}\hfil
&%
\crcr \noalign {\kern 5\p@\nointerlineskip}%
\span\omit\downbracefill&%
\crcr \noalign {\kern 3\p@\nointerlineskip}%
$\hfil \displaystyle {#1}\hfil $&%
$\hfil \displaystyle {#2}\hfil $&%
$\hfil \displaystyle {#3}\hfil $%
\crcr \noalign {\kern 3\p@\nointerlineskip}%
& \span\omit \upbracefill
\crcr \noalign {\kern 5\p@\nointerlineskip}%
&\span\omit\hfil\hbox{\vbox to 0pt{\hbox{\vbox{\vspace{0pt}\hbox{$\m@th\scriptstyle\overunderbrace@sub$}}}\vss}}\hfil
\crcr \noalign {\kern 3\p@ }%
}}}%
\endgroup
}
\makeatother
\begin{document}
$$
a+b+
\overunderbrace
{c+\mathord{\mathop{\Sigma}_d} + \mathord{}}
{e+f+g}
{\mathord{}+h+i}^{x}_{y}
= e^2
$$
\end{document}
答案1
您不想将其置于中心:只需取下下支撑,这样构造的基线就是底座的基线,然后重建它:
\documentclass{article}
\makeatletter
\def\overunderbrace#1#2#3{%
\begingroup
\let\overunderbrace@sup\empty
\let\overunderbrace@sub\empty
\@ifnextchar^%
{\@overunderbracesup{#1}{#2}{#3}}%
{\@ifnextchar_%
{\@overunderbracesub{#1}{#2}{#3}}%
{\@overunderbrace{#1}{#2}{#3}}%
}%
}
\def\@overunderbracesup#1#2#3^#4{%
\def\overunderbrace@sup{#4}%
\@ifnextchar_%
{\@overunderbracesub{#1}{#2}{#3}}%
{\@overunderbrace{#1}{#2}{#3}}%
}
\def\@overunderbracesub#1#2#3_#4{%
\def\overunderbrace@sub{#4}%
\@ifnextchar^%
{\@overunderbracesup{#1}{#2}{#3}}%
{\@overunderbrace{#1}{#2}{#3}}%
}
\def\@overunderbrace#1#2#3{%
\mathop {\setbox\z@\vbox{\m@th \ialign {##&##&##\crcr
\noalign {\kern 3\p@}%
\span\omit\hfil\hbox{\vbox to 0pt{\vss\hbox{\vbox{\hbox{$\m@th\scriptstyle\overunderbrace@sup$}\vspace{0pt}}}}}\hfil
&%
\crcr \noalign {\kern 5\p@\nointerlineskip}%
\span\omit\downbracefill&%
\crcr \noalign {\kern 3\p@\nointerlineskip}%
$\hfil \displaystyle {#1}\hfil $&%
$\hfil \displaystyle {#2}\hfil $&%
$\hfil \displaystyle {#3}\hfil $%
\crcr \noalign {\kern 3\p@\nointerlineskip}%
& \span\omit \upbracefill
\crcr \noalign {\kern 5\p@\nointerlineskip}%
&\span\omit\hfil\hbox{\vbox to 0pt{\hbox{\vbox{\vspace{0pt}\hbox{$\m@th\scriptstyle\overunderbrace@sub$}}}\vss}}\hfil
\crcr %\noalign {\kern 3\p@ }%
}%
\global\setbox\@ne\lastbox
\unkern
\global\setbox\thr@@\lastbox
\unkern
}%
\vtop{\box\z@\kern3\p@\nointerlineskip\box\thr@@\kern5\p@\nointerlineskip\box\@ne\kern3\p@}%
}%
\endgroup
}
\makeatother
\begin{document}
$$
a+b+
\overunderbrace
{c+\mathord{\mathop{\Sigma}_d} + \mathord{}}
{e+f+g}
{\mathord{}+h+i}^{x}_{y}
= e^2
$$
\end{document}
答案2
以下是我的看法,基于赫伯特的回答回答你提到的问题。为了简单起见,我定义了\overunderbrace
一个五参数(最后两个是要放在括号上/下的东西),但也可以按照示例代码中的方式完成。
\documentclass{article}
\usepackage{mathtools}
\newcommand*\overunderbrace[5]{%
\mathrlap{\overbrace{\phantom{#1#2}}^{\mathclap{#4}}}%
#1\mathord{\underbrace{#2#3}_{\mathclap{#5}}}%
}
\begin{document}
\[
a+b+\overunderbrace{c+\mathord{\mathop{\Sigma}_d}+}{e+f+g}{+h+i}{x}{y}+k+l=e^2
\]
\end{document}