创建不依赖于 amsmath 包的 \overset 和 \underset 的非数学模式替代品

创建不依赖于 amsmath 包的 \overset 和 \underset 的非数学模式替代品

我一直在使用\overset\underset来堆叠文本,例如:

\documentclass{article}
\usepackage{amsmath}
\begin{document}
    $\overset{\text{a}}{\text{b}}$ \\
$\underset{\text{c}}{\text{d}}$
\end{document}

与我为堆叠文本找到的其他解决方案相比,结果似乎具有更好的字体大小、行距和基线定位比例,但是,最近,我发现另一个包和之间存在一些不兼容性amsmath

  • 我如何创建这些命令的替代方案,使其不使用数学模式,但具有相同的字体大小和比例(以便输出在视觉上相同)?

我找到了源\overset代码\undersetamsmath.dtx

\newcommand{\overset}[2]{\binrel@{#2}%
    \binrel@@{\mathop{\kern\z@#2}\limits^{#1}}}

\newcommand{\underset}[2]{\binrel@{#2}%
    \binrel@@{\mathop{\kern\z@#2}\limits_{#1}}}

它似乎使用一些代码来\limits定义堆叠,但是,我无法在包的其余源代码中找到任何内容amsmath来展示如何\limits工作或如何在不首先指定数学模式的情况下使用它。

答案1

\limits是用于指定数学运算符的上标和下标的 TeX 原语。

\overset您仍然可以使用数学模式,但只需通过对原始和\underset定义进行一些操作来强制在文本模式下排版参数:

\overset 和 \underset(不使用 AMSmath)

\documentclass{article}
\usepackage{amsmath}% http://ctan.org/pkg/amsmath

\begin{document}
\mbox{}\phantom{Without}\llap{With} \verb|amsmath|: $\overset{\text{x}}{\text{a}}~\quad~\underset{\text{x}}{\text{a}}$

\makeatletter
\renewcommand{\overset}[2]{\ensuremath{\mathop{\kern\z@\mbox{#2}}\limits^{\mbox{\scriptsize #1}}}}
\renewcommand{\underset}[2]{\ensuremath{\mathop{\kern\z@\mbox{#2}}\limits_{\mbox{\scriptsize #1}}}}
\makeatother

\mbox{}Without \verb|amsmath|: \overset{x}{a}~\quad~\underset{x}{a}

\end{document}

在上述最小示例中,\overset\underset样式的重新定义将两个参数设置为数学模式,尽管不需要明确指定。此外,由于您对数学模式应用程序不感兴趣,因此二元关系间距已被删除。

答案2

如何实现\textunderset宏及其配套功能\textoverset取决于您的实际需要。下面是一个尝试保持正文和下标相互对齐,同时避免上标和下标之间发生冲突的功能

\documentclass{article}
\makeatletter
\newcommand{\dynscriptsize}{\check@mathfonts\fontsize{\sf@size}{\z@}\selectfont}
\makeatother
\newcommand\textunderset[2]{%
  \leavevmode
  \vtop{\offinterlineskip
    \halign{%
      \hfil##\hfil\cr % center
      \strut#2\cr
      \noalign{\kern-.3ex}
      \dynscriptsize\strut#1\cr
    }%
  }%
}
\newcommand\textoverset[2]{%
  \leavevmode
  \vbox{\offinterlineskip
    \halign{%
      \hfil##\hfil\cr % center
      \dynscriptsize\strut#1\cr
      \noalign{\kern-.3ex}
      \strut#2\cr
    }%
  }%
}

\begin{document}
Abc \textunderset{du}{axy} \textunderset{ud}{axy} def

\bigskip

Abc \textoverset{du}{axy} \textoverset{ud}{axy} def

\bigskip

Abc \textoverset{du}{axy} \textunderset{ud}{axy} def
\end{document}

在此处输入图片描述

答案3

另一种更简单、更易于理解的可能性是使用tabular环境(100% LaTeX 代码)

  • 为了调整尺寸堆叠文本的大小只需更改\scriptsize为所需的大小即可。例如,\tiny
  • 要调整分离将堆叠文本的值修改-0.3为您想要的实际值。

梅威瑟:

\documentclass{article}

\newcommand{\textunderset}[2]{\begin{tabular}[t]{@{}c@{}}#2\\[-0.3em]\scriptsize#1\end{tabular}}
\newcommand{\textoverset}[2]{\begin{tabular}[b]{@{}c@{}}\scriptsize#1\\[-0.3em]#2\end{tabular}}

\begin{document}
Abc \textunderset{du}{axy} \textunderset{ud}{axy} def

\bigskip

Abc \textoverset{du}{axy} \textoverset{ud}{axy} def

\bigskip

Abc \textoverset{du}{axy} \textunderset{ud}{axy} def
\end{document}

在此处输入图片描述

相关内容