\RequirePackage{xparse,mathtools}
\ProvidesExplPackage{leftindex}{2024/01/31}{0.2beta}{}

%----------------------------------------------------------------
%	leftindex -- left indices with better spacing
%	Version: 0.2beta
%	Maintained by Sebastian Ørsted
%	E-mail: sorsted@gmail.com
%	Released under the LaTeX Project Public License v1.3c or later
%	See http://www.latex-project.org/lppl.txt
%----------------------------------------------------------------

\DeclareDocumentCommand\manualleftindex { mmmm }
{
	% #1 = height phantom
	% #2 = slanting phantom
	% #3 = left superscript
	% #4 = left subscript
	\mathpalette \__leftindex_auxiliary_mathpalette_command:nn { {#1}{#2}{#3}{#4} }
}

\ExplSyntaxOff

\DeclareDocumentCommand\leftindex { o o E{^_}{{}{}} m }
{
	% #1 = slanting phantom
	% #2 = height phantom
	% #3 = left superscript
	% #4 = left subscript
	% #5 = symbol
	\IfValueTF {#1}
	{
		\IfValueTF{#2}
		{
			\manualleftindex { #2 } { #1 } { #3 } { #4 }
		}
		{
			\manualleftindex { #1 } { #1 } { #3 } { #4 }
		}
	}
	{
		\manualleftindex { #5 } { #5 } { #3 } { #4 }
	}
	#5
}

\DeclareDocumentCommand\LeftIndex { o o E{^_}{{}{}} }
{
	% #1 = slanting phantom
	% #2 = height phantom
	% #3 = left superscript
	% #4 = left subscript
	\IfValueTF {#1}
	{
		\IfValueTF{#2}
		{
			\manualleftindex { #2 } { #1 } { #3 } { #4 }
		}
		{
			\manualleftindex { #1 } { #1 } { #3 } { #4 }
		}
	}
	{
		\manualleftindex { } { } { #3 } { #4 }
	}
}

\ExplSyntaxOn

\cs_new_protected:Npn\leftindex_kern_horizontal:n#1
{
	\kern #1 \relax
}

\cs_new_protected:Npn\leftindex_set_mathsurround_to_zero:
{
	 % This is equivalent to "\m@th"
	\dim_set:Nn \mathsurround { 0pt }
}

\cs_new_protected:Npn\__leftindex_auxiliary_mathpalette_command:nn#1#2
{
	\__leftindex_auxiliary:nnnnn { #1 } #2
}

\dim_new:N\l__leftindex_phantom_height_dim

\box_new:N \l__leftindex_slanting_phantom_with_subscript_box
\dim_new:N \l__leftindex_slanting_phantom_with_subscript_dim

\box_new:N \l__leftindex_slanting_phantom_with_subscript_without_indentation_box
\dim_new:N \l__leftindex_slanting_phantom_with_subscript_without_indentation_dim

\dim_new:N \l__leftindex_indentation_of_slanting_phantom_subscript

\box_new:N \l__leftindex_superscript_temp_box
\dim_new:N \l__leftindex_width_of_superscript_dim

\box_new:N \l__leftindex_subscript_temp_box
\dim_new:N \l__leftindex_width_of_subscript_dim

\cs_new_protected:Npn\__leftindex_auxiliary:nnnnn#1#2#3#4#5
{
	\group_begin:
		\hbox_set:Nn \l__leftindex_slanting_phantom_with_subscript_box
			{ $ #1 #3 \sb{xxxxxx} $ }
		\dim_set:Nn \l__leftindex_slanting_phantom_with_subscript_dim
			{ \box_wd:N \l__leftindex_slanting_phantom_with_subscript_box }
		\hbox_set:Nn \l__leftindex_slanting_phantom_with_subscript_without_indentation_box
			{ $ #1 \hbox:n {$ #1 #3 $} \sb{xxxxxx} $ }
		\dim_set:Nn \l__leftindex_slanting_phantom_with_subscript_without_indentation_dim
			{ \box_wd:N \l__leftindex_slanting_phantom_with_subscript_without_indentation_box }
		\dim_set:Nn \l__leftindex_indentation_of_slanting_phantom_subscript
		{
			\l__leftindex_slanting_phantom_with_subscript_without_indentation_dim
			-
			\l__leftindex_slanting_phantom_with_subscript_dim
		}
		\tl_if_blank:nTF { #4 }
		{
			\dim_zero:N \l__leftindex_width_of_superscript_dim
		}
		{
			\hbox_set:Nn \l__leftindex_superscript_temp_box
			{
				$
				\leftindex_set_mathsurround_to_zero:
				#1 \sp { #4 }
				$
			}
			\dim_set:Nn \l__leftindex_width_of_superscript_dim
			{
				\box_wd:N \l__leftindex_superscript_temp_box
				-
				\l__leftindex_indentation_of_slanting_phantom_subscript
			}
		}
		\tl_if_blank:nTF { #5 }
		{
			\dim_zero:N \l__leftindex_width_of_subscript_dim
		}
		{
			\hbox_set:Nn \l__leftindex_subscript_temp_box
			{
				$
				\leftindex_set_mathsurround_to_zero:
				#1 \sb { #5 }
				$
			}
			\dim_set:Nn \l__leftindex_width_of_subscript_dim
			{
				\box_wd:N \l__leftindex_subscript_temp_box
			}
		}
		\mathop{}
		\leftindex_kern_horizontal:n
		{
			\dim_max:nn
				{ \l__leftindex_width_of_superscript_dim }
				{ \l__leftindex_width_of_subscript_dim }
		}
		\mathopen{ \vphantom { #2 } }
		\tl_if_blank:nF { #4 }
		{
			\sp {
				\mathmakebox[0pt][l]{
					\mathmakebox[ \l__leftindex_indentation_of_slanting_phantom_subscript ][r]{ #4 }
				}
			}
		}
		\tl_if_blank:nF { #5 }
		{
			\sb {
				\mathmakebox[0pt][r]{ #5 }
			}
		}
	\group_end:
}