Change vertical space in overset
To get better horizontal spacing of the \oset
macro -- specifically, to make its spacing the same as that of a "relational operator" (which is the case for \to
) -- you could encase the macro's definition in a \mathrel
wrapper.
To make the \oset
macro usable for different symbols/letters in the base and superscript positions, it's necessary to introduce a third, optional, argument: the argument of \vbox
. Its default value, 0pt
is suitable for single uppercase letters in the superscript position and arrows in the base position. For other combinations, you'll need to experiment a bit to find the suitable distance by which the superscript term should be raised; the values given in the example below may be OK for the selected math font (newpxmath
). Different values will probably need to be chosen if you use a different math font.
\documentclass[11pt]{book}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{booktabs} % for '\midrule' macro
\usepackage{amsmath} % for '\overset' macro
\usepackage{newpxmath,newpxtext}
% new \oset macro:
\makeatletter
\newcommand{\oset}[3][0ex]{%
\mathrel{\mathop{#3}\limits^{
\vbox to#1{\kern-2\ex@
\hbox{$\scriptstyle#2$}\vss}}}}
\makeatother
\begin{document}
\[
\begin{array}[t]{@{}c@{}}
\text{with \texttt{\string\overset}}\\
\midrule
X_n\overset{P}{\to} X \\
X_n\overset{D}{\to} X \\
X_n\overset{j}{\to} X \\
X_n\overset{\text{rth}}{\to} X \\
X_n\overset{\text{i.i.d.}}{\sim} X
\end{array}
\qquad
\begin{array}[t]{@{}c@{}}
\text{with \texttt{\string\oset}}\\
\midrule
X_n\oset{P}{\to} X \\
X_n\oset{D}{\to} X \\
X_n\oset[.35ex]{j}{\to} X \\
X_n\oset[.45ex]{\text{rth}}{\to} X \\
X_n\oset[.6ex]{\text{i.i.d.}}{\sim} X
\end{array}
\]
\end{document}
I came around \lower
and \raise
TeX "primitives" here at https://www.tug.org/utilities/plain/cseq.html. And manually lower and raise a box in the \overset
works fine for me.
\overset{\lower.5em\hbox{aaa}}{bbb}