sub- and superscripting together in text mode

I want to use sub- and superscript together in text mode. I've found this macro to solve the problem

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

But it doesn't works well when the subscript is long. In that case the subscript overlaps with the following character.

What could be the macro to enable sub- and superscripting in all cases?

-
Check out the comment to this answer: tex.stackexchange.com/questions/1013/… –  Andrey Vihrov Jul 25 '11 at 12:10

We need to have enough space for the longest of the two sub-/superscripts. For that we can calculate the maximum of both sub-/superscripts' widths and make a box as wide as the maximum:

\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}


I refrained from using mathmode and \text because \textsuperscript and \textsubscript may have more complex implementations than it would seem (see realscripts, for example).

-
Thanks for the answer. Can I ask, why there is a need to put a comment character in the end of each line? –  jutky Jul 26 '11 at 18:53
–  Andrey Vihrov Jul 26 '11 at 23:07
\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


It's just the same code as for \textsuperscript in the LaTeX kernel with subscripts added.

The result is the same as Andrey's.

-