在文本模式下同时使用下标和上标

在文本模式下同时使用下标和上标

我想在文本模式下同时使用下标和上标。我发现这个宏可以解决这个问题

\def\textsubsuperscript#1#2{\rlap{\textsubscript{#1}}\textsuperscript{#2}}

但是当下标很长的时候,这种方法就不太适用了。下标会和后面的字符重叠。

在所有情况下,启用下标和上标的宏是什么?

答案1

我们需要为两个上标/下标中的最长者留出足够的空间。为此,我们可以计算两个上标/下标宽度的最大值,并制作一个与最大值一样宽的框:

\documentclass{article}

\usepackage{fixltx2e} % For \textsubscript

\makeatletter
\newcommand{\textsubsuperscript}[2]{%
  \begingroup
    \settowidth{\@tempdima}{\textsubscript{#1}}%
    \settowidth{\@tempdimb}{\textsuperscript{#2}}%
    \ifdim\@tempdima<\@tempdimb
      \setlength{\@tempdima}{\@tempdimb}%
    \fi
    \makebox[\@tempdima][l]{%
      \rlap{\textsubscript{#1}}\textsuperscript{#2}}%
  \endgroup}
\makeatother

\begin{document}

A\textsubsuperscript{x}{yyy}B

A\textsubsuperscript{xxx}{y}B

\end{document}

结果

我避免使用数学模式,\text因为\textsuperscript和的\textsubscript实现可能比看起来更复杂(见realscripts, 例如)。

答案2

\makeatletter
\DeclareRobustCommand*\textsubsuperscript[2]{%
  \@textsubsuperscript{\selectfont#1}{\selectfont#2}}
\def\@textsubsuperscript#1#2{%
  {\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}
                    ^{\mbox{\fontsize\sf@size\z@#2}}}}}
\makeatother

\textsuperscript它与 LaTeX 内核中的代码相同,但添加了下标。

结果和Andrey的一样。

答案3

版本expl3

\cs_new_protected:Nn \my_super_sub:nn
  {
    \group_begin:
      \hbox_set:Nn \l_tmpa_box { \textsuperscript {#1} }
      \hbox_set:Nn \l_tmpb_box { \textsubscript {#2} }
      \hbox_to_wd:nn
        { \dim_max:nn { \box_wd:N \l_tmpa_box } { \box_wd:N \l_tmpb_box } }
        { \hbox_overlap_right:n { \box_use:N \l_tmpa_box } \box_use:N \l_tmpb_box }
    \group_end:
  }

相关内容