答案1
我们可以添加垂直幻影,但必须小心保持正确的间距。我会使用一个新的宏\varoverset
。
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newcommand{\varoverset}[2]{\binrel@{#2}%
\binrel@@{\mathop{\vphantom{M}{#2}}\limits^{#1}}}
\makeatother
\begin{document}
\begin{gather*}
\overset{0}{\neg} Aa \overset{0}{\lor}
(\overset{0}{Mcc} \overset{0}{\leftrightarrow} \overset{1}{Mba})
\\
\varoverset{0}{\neg} Aa \varoverset{0}{\lor}
(\varoverset{0}{\mathit{Mcc}} \varoverset{0}{\leftrightarrow} \varoverset{1}{\mathit{Mba}})
\end{gather*}
\end{document}
\binrel@
/结构\binrel@@
继承自 的原始定义,\overset
并负责处理间距。 将 的第二个参数\varoverset
放在括号中,以便将\mathord
其变成 ,否则 的间距\vphantom
通常是错误的。
还要注意,如果Mcc
和Mba
是多字母变量,最好将它们放入\mathit
(正如我在第二个公式中所做的那样)。
编辑为了完全控制,您可以定义一个通常使用的新长度,以及一个可选参数来本地更改它。
\newlength{\varoversetheight}
\settoheight{\varoversetheight}{M}
\makeatletter
\newcommand{\varoverset}[3][\varoversetheight]{\binrel@{#3}%
\binrel@@{\mathop{\vrule width\z@ height#1{#3}}\limits^{#2}}}
\makeatother
答案2
在这里,我使用堆栈来创建重叠。(我也偷了 campa 的\binrel@
技巧,+1)。这里的优点是重叠位置是可调整的,可以通过逐个使用可选参数或重置默认值来调整\oversetnorm
。如果对象的高度异常高(例如,如果戴帽子),这很方便。
MWE 显示\oversetnorm
针对第二行调整后的默认值。
\documentclass{article}
\usepackage{stackengine,amsmath}
\newcommand\oversetnorm{.7\normalbaselineskip}
\makeatletter
\newcommand\myoverset[3][\oversetnorm]{%
\binrel@{#3}\binrel@@{\mathop{\ensurestackMath{%
\stackengine{#1}{#3}{\scriptstyle#2}{O}{c}{F}{F}{L}}}}}
\makeatother
\begin{document}
\[
\myoverset{0}{\neg} Aa \myoverset{0}{\lor}
(\myoverset{0}{\mathit{Mcc}} \myoverset{0}{\leftrightarrow} \myoverset{1}{\mathit{Mba}})
\]
\renewcommand\oversetnorm{11pt}
\[
\myoverset{0}{\neg} Aa \myoverset{0}{\lor}
(\myoverset{0}{\mathit{\hat M\!cc}} \myoverset{0}{\leftrightarrow} \myoverset{1}{\mathit{\hat M\!ba}})
\]
\end{document}