4

How can I modify the command below to obtain a version (of the question: recursive multiple subscript and superscript with xparse) which does not stack the sub/superscripts horizontally but moves all together

like

T_{bc}^{arf}

I tried to remove the \object but this did not work "double superscript error"

I don't want to change the command syntax (so that I am flexible :-)!

\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{\tensorkor}{m >{\SplitList{,}}O{}}
 {\begingroup
  \mathsf{#1}%
  \newcommand\object{\vphantom{\mathsf{#1}}}%
  \ProcessList{#2}{\dotensorkor}%
  \endgroup}
\NewDocumentCommand{\dotensorkor}{m}
 {%
  \object#1%
 }
\begin{document}
$\tensorkor{T}[^a,_b,_c,^r,^f]$

what I want is $T_{bc}^{arf}$
\end{document}

enter image description here

Gabriel
  • 1,574
  • So you'd like that \somemacro{T}[^a,_b,_c,^r,^f]$ produces the same result as $\mathsf{T}^{arf}_{bc}$? – egreg May 10 '13 at 14:10

1 Answers1

5

You can get both behaviors with the same command, just using a *-variant:

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\tensorkor}{ s m O{} }
 {
  \IfBooleanTF{#1}
   { \gabriel_nonstacked:nn { #2 } { #3 } }
   { \gabriel_stacked:nn { #2 } { #3 } }
 }

\cs_new_protected:Npn \gabriel_stacked:nn #1 #2
 {
  \mathsf{#1}%
  \clist_map_inline:nn { #2 }
   {
    \vphantom{\mathsf{#1}} ##1
   }
 }

\tl_new:N \l_gabriel_sup_tl
\tl_new:N \l_gabriel_sub_tl

\cs_new_protected:Npn \gabriel_nonstacked:nn #1 #2
 {
  \tl_clear:N \l_gabriel_sup_tl
  \tl_clear:N \l_gabriel_sub_tl
  \clist_map_inline:nn { #2 }
   {
    \gabriel_decide:Nn ##1
   }
  \mathsf{#1}\sp{\l_gabriel_sup_tl}\sb{\l_gabriel_sub_tl}
 }

\cs_new_protected:Npn \gabriel_decide:Nn #1 #2
 {
  \token_if_math_superscript:NTF #1
   {
    \tl_put_right:Nn \l_gabriel_sup_tl { #2 }
   }
   {
    \tl_put_right:Nn \l_gabriel_sub_tl { #2 }
   }
 }

\ExplSyntaxOff
\begin{document}
$\tensorkor{T}[^a,_b,_c,^r,^f]$

$\tensorkor*{T}[^a,_b,_c,^r,^f]$
\end{document}

enter image description here

egreg
  • 1,121,712