如何让定义的`\oline`随文本调整?

如何让定义的`\oline`随文本调整?

第一个MWE如下:

\documentclass{amsart}
\usepackage{amsmath,amsfonts}
\newcommand*\oline[1]{%
\kern.2em%add the left space
\vbox{%
\hrule height 0.3pt%  % Line above with certain width
\kern0.3ex% % Distance between line and content
\hbox{%
\kern -0.1em%  % Distance between content and left side of box, negative values for lines shorter than content
\ifmmode#1\else\ensuremath{#1}\fi%  % The content, typeset in dependence of mode
\kern -0.1em% % Distance between content and left side of box, negative values for lines shorter than content
}% end of hbox
}% end of vbox
\kern.2em} %add the right spacce

\begin{document}
\[2^{\oline{S}abc}=\oline{S}0.\]

\end{document}

在示例中,我定义了一个命令\oline来生成我想要的上述线条。但它无法根据下图中的文本进行调整:\oline{S}大于abc而实际上它应该与 大小相同abc

在此处输入图片描述

问题: 谁能帮助我改进它以使其与文本相适应?

答案1

有一些改进需要应用。

  1. 当你打开时\hbox,TeX 不再处于数学模式,因此\ifmmode总是返回 false。
  2. 您需要考虑当前的数学风格,它是用 完成的\mathpalette
  3. 硬连线0.3ex将导致上标的间距过大。

这是一个建议,并与标准\bar命令进行了比较。

\documentclass{amsart}
\usepackage{amsmath,amsfonts}

\makeatletter
\newcommand*\oline[1]{{\mspace{2mu}\mathpalette\o@line{#1}\mspace{2mu}}}
\newcommand*\o@line[2]{%
  \vbox{
    \sbox\z@{$\m@th#1\mspace{2mu}$}
    \hrule height 0.3pt
    \kern\wd\z@
    \hbox{$\m@th\mspace{-2mu}#1#2\mspace{-2mu}$}
  }%
}
\makeatother

\begin{document}

\begin{gather*}
2^{\oline{S}abc}=\oline{S}0 \\
2^{\bar{S}abc}=\bar{S}0
\end{gather*}

\end{document}

在此处输入图片描述

相关内容