我一直在使用\overset
和\underset
来堆叠文本,例如:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
$\overset{\text{a}}{\text{b}}$ \\
$\underset{\text{c}}{\text{d}}$
\end{document}
与我为堆叠文本找到的其他解决方案相比,结果似乎具有更好的字体大小、行距和基线定位比例,但是,最近,我发现另一个包和之间存在一些不兼容性amsmath
。
- 我如何创建这些命令的替代方案,使其不使用数学模式,但具有相同的字体大小和比例(以便输出在视觉上相同)?
我找到了源\overset
代码\underset
amsmath.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
定义进行一些操作来强制在文本模式下排版参数:
\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}