% +--------------------------------------------------+
% | Typeset titlesec.tex to get the documentation.   |
% +--------------------------------------------------+
%
% This file is copyrighted (c) 1998 by Javier Bezos.
% All Rights Reserved.
% 
% This program can be redistributed and/or modified under the terms
% of the LaTeX Project Public License Distributed from CTAN
% archives in directory macros/latex/base/lppl.txt; either
% version 1 of the License, or any later version.
%
% Release
% ~~~~~~~

\ProvidesPackage{tensind}[1998/05/01 v1.0 Tensorial Indexes]

\@tempcnta=\the\catcode`^
\@tempcntb=\the\catcode`_
\catcode`^=7\catcode`_=8

\newdimen\tsi@dimen

\newif\iftsi@sp
\newif\iftsi@sb

\newif\iftsi@e
\newif\iftsi@b
\newif\iftsi@l
\newif\iftsi@r
\newif\iftsi@o
\newif\iftsi@c
\newif\iftsi@s
\newif\iftsi@nodot

\def\tsi@thedots{}
\def\tsi@theprimes{}
\def\tsi@thesb{}
\def\tsi@thesp{}
\def\tsi@lastloc{x}
\def\tsi@lastindex{}%
\def\tsi@addindex{\tsi@addpr}

\let\tsi@bl\relax
\let\tsi@br\relax
\let\tsi@bm\relax
\let\tsi@tl\relax
\let\tsi@tr\relax
\let\tsi@tm\relax

\let\tsi@choice\mathchoice

\newif\iftsi@top
\newif\iftsi@bot

\let\tsi@gap\relax

\def\tensorformat#1{\tsi@lfalse\tsi@rfalse\tsi@efalse
  \tsi@bfalse\tsi@ofalse\tsi@cfalse\tsi@sfalse
  \@tfor\tsi@a:=#1\do{\csname tsi@\tsi@a true\endcsname}}

\tensorformat{}
\def\indexdot{\cdot}

\def\tsi@appendto#1#2{\protected@edef#2{#2#1}}

\def\tensor{\catcode`_=8\catcode`^=7 %
  \def\tsi@end{\end}\tsi@ifnextchar[{\tsi@otensor}{\tsi@xtensor}}

\begingroup

\catcode`?=13
\gdef\tensordelimiter#1{\mathcode`#1="8000{\catcode`?=13\lccode`?=`#1
  \lowercase{%
    \gdef?{\begingroup\catcode`_=8 \catcode`^=7 %
        \def\tsi@end{#1}\def?{\endtensor\endgroup}%
        \@ifnextchar[{\tsi@otensor}{\tsi@xtensor}}}}}
        
\endgroup

\def\tsi@otensor[#1]{\tensorformat{#1}\tsi@xtensor}

\gdef\tsi@xtensor#1{%
   \def\tsi@nucl{#1}%
   \futurelet\nxt\tsi@process}

\def\tsi@process#1{%
  \def\next{\futurelet\nxt\tsi@process}%
  \def\tsi@theindex{#1}\def\tsi@a{_}%
  \ifx\tsi@theindex\tsi@a
    \if\tsi@lastloc x\let\tsi@first\@empty\fi
    \if\tsi@lastloc b\else\tsi@switchsb\fi
  \else
    \def\tsi@a{^}%
    \ifx\tsi@theindex\tsi@a
      \if\tsi@lastloc p\else\tsi@switchsp\fi
    \else
      \ifx\tsi@theindex\tsi@end
        \let\next\tsi@end
      \else
        \tsi@nodotfalse
        \ifx\nxt\bgroup
          \def\tsi@lastindex{}%
        \else
          \csname tsi@cmd\string#1\endcsname
          \def\tsi@lastindex{#1}%
        \fi
        \tsi@addindex
      \fi
    \fi
  \fi
  \next}

\def\tsi@switchsp{%
  \let\tsi@addindex\tsi@addsp
  \iftsi@top
    \def\tsi@gap{\tsi@tm}%
  \else
    \def\tsi@gap{\tsi@tl}%
  \fi
  \tsi@appendto{\tsi@thedots}\tsi@thesp
  \let\tsi@gap\relax
  \def\tsi@thedots{}}
  
\def\tsi@switchsb{%
  \let\tsi@addindex\tsi@addsb
  \iftsi@bot
    \def\tsi@gap{\tsi@bm}%
  \else
    \def\tsi@gap{\tsi@bl}%
  \fi
  \tsi@appendto{\tsi@thedots}\tsi@thesb  
  \let\tsi@gap\relax
  \def\tsi@thedots{}}

\def\tsi@addpr{%
  \tsi@appendto{\tsi@theindex}\tsi@theprimes}

\def\tsi@addsp{%
  \tsi@toptrue
  \tsi@appendto{\tsi@theindex}\tsi@thesp
  \iftsi@nodot
    \tsi@appendto{\protect\tsi@phantom{\tsi@theindex}}\tsi@thedots
  \else
    \tsi@appendto{\tsi@gap{\tsi@theindex}}\tsi@thedots
  \fi
  \def\tsi@lastloc{p}}

\def\tsi@addsb{%
  \tsi@bottrue
  \tsi@appendto{\tsi@theindex}\tsi@thesb
  \iftsi@nodot
    \tsi@appendto{\protect\tsi@phantom{\tsi@theindex}}\tsi@thedots
  \else
    \tsi@appendto{\tsi@gap{\tsi@theindex}}\tsi@thedots
  \fi
  \def\tsi@lastloc{b}}

\def\tsi@dot#1{%
  \setbox\z@\hbox{$\tsi@fam\m@th\tsi@index#1$}%
  \hbox to\wd\z@{\hss$\tsi@fam\m@th\tsi@index\indexdot$\hss}}
  
\newdimen\primes

\def\endtensor{%
  \if\tsi@lastloc p
    \def\tsi@gap{\tsi@br}%
    \tsi@appendto{\tsi@thedots}\tsi@thesb
  \else
    \def\tsi@gap{\tsi@tr}%
    \tsi@appendto{\tsi@thedots}\tsi@thesp
  \fi
  \let\tsi@bl\tsi@phantom  \let\tsi@br\tsi@phantom
  \let\tsi@bm\tsi@phantom  \let\tsi@tm\tsi@phantom
  \def\tsi@tl##1{\tsi@phantom{##1}\global\advance\tsi@dimen\wd\z@}%
  \iftsi@top
    \let\tsi@tr\tsi@phantom
  \else
    \let\tsi@tr\tsi@tl
  \fi
  \iftsi@bot
    \iftsi@l\let\tsi@bl\tsi@dot\let\tsi@bm\tsi@dot\fi
    \iftsi@r\let\tsi@br\tsi@dot\let\tsi@bm\tsi@dot\fi
  \else
    \iftsi@e\let\tsi@br\tsi@dot\tsi@bottrue\fi
  \fi
  \iftsi@b\else
    \iftsi@top
      \iftsi@l\let\tsi@tl\tsi@dot\let\tsi@tm\tsi@dot\fi
      \iftsi@r\let\tsi@tr\tsi@dot\let\tsi@tm\tsi@dot\fi
    \else
      \iftsi@e\let\tsi@tr\tsi@dot\tsi@toptrue\fi
    \fi
  \fi
  \ifx\tsi@theprimes\@empty\else\tsi@toptrue\fi
  \edef\tsi@fam{\fam\the\fam}%
  \tsi@choice
    {\tsi@endtensor\displaystyle\scriptstyle}%
    {\tsi@endtensor\textstyle\scriptstyle}%
    {\tsi@endtensor\scriptstyle\scriptscriptstyle}%
    {\tsi@endtensor\scriptscriptstyle\scriptscriptstyle}}

    
\def\tsi@endtensor#1#2{%
  \let\tsi@text#1\let\tsi@index#2%
  \setbox\z@ \hbox{$\tsi@fam\m@th#1\tsi@nucl_{x}$}%
  \setbox\@ne\hbox{$\tsi@fam\m@th#1\tsi@nucl{}_{x}$}%
  \tsi@dimen\wd\z@   \advance\tsi@dimen-\wd\@ne  
  \@tempdimb-\tsi@dimen
  \setbox\z@ \hbox{$\kern\tsi@dimen\tsi@fam\m@th#2\tsi@thesp$}%
  \setbox\@ne\hbox{$\tsi@fam\m@th#2\tsi@thesb$}%
  \setbox\tw@\hbox{$\tsi@fam\m@th#2{\tsi@theprimes}$}%
  \dp\z@\z@
  \ifdim\tsi@dimen>\wd\tw@
    \tsi@dimen\z@
  \else
    \advance\tsi@dimen-\wd\tw@
  \fi
  \wd\tw@\z@
  \iftsi@s
    \ifx\tsi@text\displaystyle
      \tsi@otrue\tsi@cfalse
    \else
      \tsi@ofalse\tsi@ctrue
    \fi
  \fi
  \let\tsi@a\@empty
  \tsi@nucl
  \iftsi@bot_{\kern-\tsi@dimen\copy\@ne}%
    \iftsi@o\tsi@toptrue\else\iftsi@c\tsi@toptrue
       \ifx\tsi@text\displaystyle\else
         \def\tsi@a{\raise.1ex}%
       \fi
       \kern-\wd\@ne\kern\tsi@dimen
       \kern\@tempdimb\kern-\scriptspace
    \fi\fi
  \fi
  \iftsi@top^{\tsi@a\box\tw@\kern-\tsi@dimen\tsi@a\box\z@}\fi}
  
\def\tsi@phantom#1{%
  \setbox\tw@\null
  \setbox\z@\hbox{$\tsi@fam\m@th\tsi@index#1$}%
  \wd\tw@\wd\z@
  \box\tw@}%

\def\whenindex#1#2#3{%
  \expandafter\def\csname tsi@cmd\expandafter\string#1\endcsname{%
    \def\tsi@theindex{#2}#3}}
    
\whenindex{'}{\prime}{}

\def\spadjust#1#2{%
  \def\tsi@a{#1}%
  \ifx\tsi@a\tsi@lastindex
   \iftsi@l\else
    \iftsi@r\else
     \ifx\tsi@addindex\tsi@addsp
      \if\tsi@lastloc b%
       \protected@edef\tsi@theindex{\mskip#2\thinmuskip\tsi@theindex}%
      \fi
     \fi
    \fi
   \fi
  \fi}

\def\sbadjust#1#2{%
  \def\tsi@a{#1}%
  \ifx\tsi@a\tsi@lastindex
   \iftsi@l\else
    \iftsi@r\else
     \ifx\tsi@addindex\tsi@addsb
      \if\tsi@lastloc p%
       \protected@edef\tsi@theindex{\mskip#2\thinmuskip\tsi@theindex}%
      \fi
     \fi
    \fi
   \fi
  \fi}
  

\def\omitdot{\tsi@nodottrue}
\def\finishdots{\tsi@nodottrue\let\tsi@nodotfalse\relax}

\catcode`^=\@tempcnta\catcode`_=\@tempcntb
