第一个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
有一些改进需要应用。
- 当你打开时
\hbox
,TeX 不再处于数学模式,因此\ifmmode
总是返回 false。 - 您需要考虑当前的数学风格,它是用 完成的
\mathpalette
。 - 硬连线
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}