From 45703352bcad374f3e88099a40425df3ba5c3395 Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Sun, 13 Jan 2019 23:30:37 +0000
Subject: systeme (13jan19)

git-svn-id: svn://tug.org/texlive/trunk@49690 c570f23f-e606-0410-a88d-b1316a301751
---
 Master/texmf-dist/tex/generic/systeme/systeme.tex | 1035 +++++++++++----------
 1 file changed, 518 insertions(+), 517 deletions(-)

(limited to 'Master/texmf-dist/tex/generic/systeme/systeme.tex')

diff --git a/Master/texmf-dist/tex/generic/systeme/systeme.tex b/Master/texmf-dist/tex/generic/systeme/systeme.tex
index 1bceaa21725..9bda0ef0460 100644
--- a/Master/texmf-dist/tex/generic/systeme/systeme.tex
+++ b/Master/texmf-dist/tex/generic/systeme/systeme.tex
@@ -1,657 +1,651 @@
 % !TeX encoding = ISO-8859-1
 % Ce fichier contient le code de l'extension "systeme"
-\expandafter\edef\csname SYS@savedatcatcode\endcsname{\number\catcode`\@}
-\catcode`\@11
 %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %                                                                    %
 \def\SYSname                   {systeme}                             %
-\def\SYSver                      {0.31}                              %
+\def\SYSver                      {0.32}                              %
 %                                                                    %
-\def\SYSdate                  {2018/01/01}                           %
+\def\SYSdate                  {2019/01/13}                           %
 %                                                                    %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% --------------------------------------------------------------------
-% Author     : Christian Tellechea
-% Status     : Maintained
-% Email      : unbonpetit@netc.fr
-% Package URL: https://www.ctan.org/pkg/systeme
-% Bug tracker: https://framagit.org/unbonpetit/systeme/issues
-% Repository : https://framagit.org/unbonpetit/systeme/tree/master
-% Copyright  : Christian Tellechea 2017
-% Licence    : Released under the LaTeX Project Public License v1.3c
-%              or later, see http://www.latex-project.org/lppl.txt
-% Files      : 1) systeme.tex
-%              2) systeme.sty
-%              3) systeme-fr.tex
-%              4) systeme-fr.pdf
-%              5) README
-% --------------------------------------------------------------------
-% --------------------------------------------------------------------
-
-\def\SYS@newmacro#1{%
-	\ifdefined#1%
-		\errmessage{Package systeme Error: la macro \string#1\space existe deja. Contacter l'auteur svp.}%
-	\fi
-	\def#1%
-}
-\SYS@newmacro\SYSlongdate   {1\ier{} janvier 218}
+%                                                                    %
+% Author     : Christian Tellechea                                   %
+% Status     : Maintained                                            %
+% Email      : unbonpetit@netc.fr                                    %
+% Package URL: https://www.ctan.org/pkg/systeme                      %
+% Bug tracker: https://framagit.org/unbonpetit/systeme/issues        %
+% Repository : https://framagit.org/unbonpetit/systeme/tree/master   %
+% Copyright  : Christian Tellechea 2011-2019                         %
+% Licence    : Released under the LaTeX Project Public License v1.3c %
+%              or later, see http://www.latex-project.org/lppl.txt   %
+% Files      : 1) systeme.tex                                        %
+%              2) systeme.sty                                        %
+%              3) systeme-fr.tex                                     %
+%              4) systeme-fr.pdf                                     %
+%              5) README                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\unless\ifdefined\SYSstyfile
+	\immediate\write-1 {Package: \SYSname\space\SYSdate\space\space v\SYSver\space\space Saisie naturelle de systemes d'equations}%
+\fi
 
-\newtoks\SYS@systemecode
-\newtoks\SYS@systempreamble
+\expandafter\edef\csname SYS_restorecatcode\endcsname{\catcode\number`\_=\number\catcode`\_\relax}
+\catcode`\_11
 
-\newif\ifSYS@firstterm
-\newif\ifSYS@sortvariable
-\newif\ifSYS@star
-\newif\ifSYS@extracol
-\newif\ifSYS@autonum
-\newif\ifSYS@followautonum
-\newif\ifSYS@constterm
+\begingroup
+	\catcode`\_8
+	\gdef\SYSunder{_}
+\endgroup
+
+\unless\ifdefined\xstringversion
+	\def\SYS_nextaction{\input xstring.tex\relax}%
+	\expandafter\SYS_nextaction
+\fi
+
+\newtoks\SYS_systemecode
+\newtoks\SYS_systempreamble
+
+\newif\ifSYS_firstterm
+\newif\ifSYS_sortvariable
+\newif\ifSYS_star
+\newif\ifSYS_extracol
+\newif\ifSYS_autonum
+\newif\ifSYS_followautonum
+\newif\ifSYS_constterm
 
 \newcount\SYSeqnum
 
-\expandafter\ifx\csname @latexerr\endcsname\relax% on n'utilise pas LaTeX ?
-	\ifdefined\xstringversion\else\def\SYS@nextaction{\input xstring.tex}\expandafter\SYS@nextaction\fi
-	\immediate\write\m@ne{Package: \SYSname\space\SYSdate\space\space v\SYSver\space\space Saisie naturelle de systemes d'equations}%
-	\newskip\normalbaselineskip \normalbaselineskip=12pt
-	\long\def\@firstoftwo#1#2{#1}
-	\long\def\@secondoftwo#1#2{#2}
-	\long\def\@firstofone#1{#1}
-	\long\def\@gobble#1{}
-	\long\def\@ifnextchar#1#2#3{%
-		\let\reserved@d=#1%
-		\def\reserved@a{#2}%
-		\def\reserved@b{#3}%
-		\futurelet\@let@arg\@ifnch}
-	\def\@ifnch{%
-		\ifx\@let@arg\@sptoken
-			\let\reserved@c\@xifnch
-		\else
-			\ifx\@let@arg\reserved@d
-				\let\reserved@c\reserved@a
-			\else
-				\let\reserved@c\reserved@b
-			\fi
-		\fi
-		\reserved@c}
-	\def\:{\let\@sptoken= } \:
-	\def\:{\@xifnch} \expandafter\def\: {\futurelet\@let@arg\@ifnch}
-	\long\def\@testopt#1#2{\@ifnextchar[{#1}{#1[{#2}]}}
-	\def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}}
-	\def\@empty{}
-	\def\space{ }
+\long\def\SYS_execarg#1{#1}
+\long\def\SYS_gobtwoargs#1#2{}
+\def\SYS_addtotok#1#2{#1\expandafter{\the#1#2}}
+\def\SYS_expaddtotok#1#2{\xs_exparg{\SYS_addtotok#1}{#2}}
+\def\SYS_addtotab{\SYS_addtotok\SYS_systemecode}
+\def\SYS_cslet#1{\expandafter\let\csname#1\endcsname}
+\def\SYS_letcs#1#2{\expandafter\let\expandafter#1\csname#2\endcsname}
+\def\SYS_firstinlist#1,#2\_nil{#1}
+\def\SYS_removefirstinlist#1,{}
+\def\SYS_ifinstr#1#2{%
+	\def\SYS_ifinstr_i##1#2##2\_nil{\xs_ifempty{##2}\xs_execsecond\xs_execfirst}%
+	\SYS_ifinstr_i#1\__nil#2\_nil
+}
+
+\ifdefined\usepackage\else% on n'utilise pas LaTeX ?
+	\newskip\normalbaselineskip
+	\normalbaselineskip=12pt
 \fi
 
-% d\'efinit ce qu'est le s\'eparateur des \'equations par d\'efaut
-\SYS@newmacro\syseqsep{\def\SYS@defaulteqsep}
+% définit ce qu'est le séparateur des équations par défaut
+\def\syseqsep{\def\SYS_defaulteqsep}
 \syseqsep{,}
 
-% d\'efinit le coefficient pour l'espacement interligne
-\SYS@newmacro\syslineskipcoeff{\def\SYS@lineskipcoeff}
+% définit le coefficient pour l'espacement interligne
+\def\syslineskipcoeff{\def\SYS_lineskipcoeff}
 \syslineskipcoeff{1.25}
 
-% d\'efinit le signe qui marquera une colonne suppl\'ementaire \`a droite du tableau
-\SYS@newmacro\sysextracolsign{\def\SYS@extracolsign}
-\expandafter\sysextracolsign\expandafter{\string @}% on d\'efinit l'arobas avec le bon catcode.
+% définit le signe qui marquera une colonne supplémentaire à droite du tableau
+\def\sysextracolsign{\def\SYS_extracolsign}
+\xs_exparg\sysextracolsign{\string @}% on définit l'arobas avec le bon catcode.
 
-% d\'efinit ce qui sera ins\'er\'e au d\'ebut et \`a la fin de la colonne suppl\'ementaire
-\SYS@newmacro\syscodeextracol#1#2{\def\SYS@extracolstart{#1}\def\SYS@extracolend{#2}}
+% définit ce qui sera inséré au début et à la fin de la colonne supplémentaire
+\def\syscodeextracol#1#2{\def\SYS_extracolstart{#1}\def\SYS_extracolend{#2}}
 \syscodeextracol{\kern1.5em$}{$}
 
-\SYS@newmacro\sysreseteqnum{\global\SYSeqnum\z@}
-
-\SYS@newmacro\SYS@cslet#1{\expandafter\let\csname#1\endcsname}
+\def\sysreseteqnum{\global\SYSeqnum0 }
 
-% d\'efinit l'autonum\'erotation
-\SYS@newmacro\sysautonum{\@ifstar{\SYS@followautonumtrue\SYS@autonum}{\SYS@followautonumfalse\SYS@autonum}}
+% définit l'autonumérotation
+\def\sysautonum{%
+	\xs_ifstar
+		{\SYS_followautonumtrue\SYS_autonum}
+		{\SYS_followautonumfalse\SYS_autonum}%
+}
 
-\SYS@newmacro\SYS@autonum#1{%
-	\ifx\@empty#1\@empty
-		\SYS@extracolfalse
-		\SYS@autonumfalse
-	\else
-		\SYS@extracoltrue
-		\SYS@autonumtrue
-		\def\SYS@autonumarg{#1}%
-	\fi
+\def\SYS_autonum#1{%
+	\xs_ifempty{#1}
+		{\SYS_extracolfalse
+		\SYS_autonumfalse
+		}
+		{\SYS_extracoltrue
+		\SYS_autonumtrue
+		\def\SYS_autonumarg{#1}%
+		}%
 }
 
-% dimension qui sera ajout\'ee \`a la hauteur et \`a la profondeur du strutup ou strutdown
-% ins\'er\'e \`a la premi\`ere et la derni\`ere \'equation
-\SYS@newmacro\SYS@extrastrutdim{1.5pt}
+% dimension qui sera ajoutée à la hauteur et à la profondeur du strutup ou strutdown
+% inséré à la première et la dernière équation
+\def\SYS_extrastrutdim{1.5pt}
 
-% liste des signes devant \^etre compris comme signe d'\'egalit\'e s\'eparant les 2 membres de l'\'equation
-\SYS@newmacro\SYS@equalsignlist{<=,>=,=,<,>,\leq,\geq,\leqslant,\geqslant}
+% liste des signes devant être compris comme signe d'égalité séparant les 2 membres de l'équation
+\def\SYS_equalsignlist{<=,>=,=,<,>,\leq,\geq,\leqslant,\geqslant}
 
-\SYS@newmacro\sysaddeqsign#1{%
+\def\sysaddeqsign#1{%
 	\saveexpandmode\expandarg
-	\IfSubStr{\expandafter,\SYS@equalsignlist,}{,#1,}
-		\relax
-		{\expandafter\def\expandafter\SYS@equalsignlist\expandafter{\SYS@equalsignlist,#1}}%
+	\IfSubStr{\expandafter,\SYS_equalsignlist,}{,#1,}
+		{}
+		{\xs_exparg{\def\SYS_equalsignlist}{\SYS_equalsignlist,#1}}%
 	\restoreexpandmode
 }
 
-% enl\`eve l'item #2 de la sc #1 qui contient une liste
-\SYS@newmacro\SYS@removeiteminlist#1#2{%
+% enlève l'item #2 de la sc #1 qui contient une liste
+\def\SYS_removeiteminlist#1#2{%
 	\saveexpandmode\expandarg
 	\IfSubStr{\expandafter,#1,}{,#2,}
-		{\StrSubstitute{\expandafter\@nil\expandafter,#1,\@nil}{,#2,},[#1]%
-		\StrDel#1{\noexpand\@nil,}[#1]%
-		\StrDel#1{,\@nil}[#1]%
+		{\StrSubstitute{\expandafter\_nil\expandafter,#1,\_nil}{,#2,},[#1]%
+		\StrDel#1{\noexpand\_nil,}[#1]%
+		\StrDel#1{,\_nil}[#1]%
 		}%
-		\relax
+		{}%
 	\restoreexpandmode
 }
 
-\SYS@newmacro\sysremoveeqsign#1{%
-	\SYS@removeiteminlist\SYS@equalsignlist{#1}%
-	\SYS@removeiteminlist\SYS@equivsignlist{#1}%
+\def\sysremoveeqsign#1{%
+	\SYS_removeiteminlist\SYS_equalsignlist{#1}%
+	\SYS_removeiteminlist\SYS_equivsignlist{#1}%
 }
 
-% d\'efinit le signe d'\'egalit\'e #1 comme devant \^etre remplac\'e par #2 lors de l'affichage
-\SYS@newmacro\sysequivsign#1#2{%
-	\IfSubStr\SYS@equivsignlist{\noexpand#1,}\relax{\expandafter\def\expandafter\SYS@equivsignlist\expandafter{\SYS@equivsignlist#1,}}%
-	\expandafter\def\csname SYS@equivsign@\string#1\endcsname{#2}%
+% définit le signe d'égalité #1 comme devant être remplacé par #2 lors de l'affichage
+\def\sysequivsign#1#2{%
+	\IfSubStr\SYS_equivsignlist{\noexpand#1,}
+		{}
+		{\xs_exparg{\def\SYS_equivsignlist}{\SYS_equivsignlist#1,}}%
+	\expandafter\def\csname SYS_equivsign_\string#1\endcsname{#2}%
 }
 
-\SYS@newmacro\SYS@equivsignlist{}
+\def\SYS_equivsignlist{}
 
 \sysequivsign{<=}\leq
 \sysequivsign{>=}\geq
 
-\SYS@newmacro\SYS@firstiteminlist#1,#2\@nil{#1}
-
-\SYS@newmacro\SYS@removefirstiteminlist#1,{}
-
-% #1 est l'\'equation courante. La macro la s\'epare en 2 membres -> \SYS@leftmember et \SYS@rightmember
-% le signe de s\'eparation entre les 2 membres se trouve dans \SYS@currenteqsign
-\SYS@newmacro\SYS@splitinmembers#1{%
-	\def\SYS@leftmember{#1}\let\SYS@currenteqsign\@empty\let\SYS@rightmember\@empty
-	\expandafter\SYS@splitinmembers@i\expandafter{\SYS@equalsignlist,}% parcourt \SYS@equalsignlist pour s\'eparer en 2 membres
-	\IfSubStr{\expandafter,\SYS@equivsignlist}{\expandafter,\SYS@currenteqsign,}% si le signe est dans la liste des substitutions
-		{\expandafter\let\expandafter\SYS@currenteqsign\csname SYS@equivsign@\detokenize\expandafter{\SYS@currenteqsign}\endcsname}% le remplacer
-		\relax
+% #1 est l'équation courante. La macro la sépare en 2 membres -> \SYS_leftmember et \SYS_rightmember
+% le signe de séparation entre les 2 membres se trouve dans \SYS_currenteqsign
+\def\SYS_splitinmembers#1{%
+	\def\SYS_leftmember{#1}%
+	\let\SYS_currenteqsign\empty
+	\let\SYS_rightmember\empty
+	\xs_exparg\SYS_splitinmembers_i{\SYS_equalsignlist,}% parcourt \SYS_equalsignlist pour séparer en 2 membres
+	\IfSubStr{\expandafter,\SYS_equivsignlist}{\expandafter,\SYS_currenteqsign,}% si le signe est dans la liste des substitutions
+		{\SYS_letcs\SYS_currenteqsign{SYS_equivsign_\detokenize\expandafter{\SYS_currenteqsign}}}% le remplacer
+		{}%
 }
 
-% #1 est la liste des signes d'\'egalit\'e
-\SYS@newmacro\SYS@splitinmembers@i#1{%
-	\ifx\@empty#1\@empty
-	\else
-		\IfSubStr\SYS@leftmember{\SYS@firstiteminlist#1\@nil}% si l'\'equation contient un des signes
-			{\expandafter\def\expandafter\SYS@currenteqsign\expandafter{\SYS@firstiteminlist#1\@nil}% sauvagarde le signe
-			\StrBehind\SYS@leftmember\SYS@currenteqsign[\SYS@rightmember]% proc\`ede \`a la s\'eparation
-			\StrBefore\SYS@leftmember\SYS@currenteqsign[\SYS@leftmember]% en deux membres
-			\let\SYS@nextaction\relax
+% #1 est la liste des signes d'égalité
+\def\SYS_splitinmembers_i#1{%
+	\xs_ifempty{#1}
+		{}
+		{\IfSubStr\SYS_leftmember{\SYS_firstinlist#1\_nil}% si l'équation contient un des signes
+			{\xs_exparg{\def\SYS_currenteqsign}{\SYS_firstinlist#1\_nil}% sauvagarde le signe
+			\StrBehind\SYS_leftmember\SYS_currenteqsign[\SYS_rightmember]% procède à la séparation
+			\StrBefore\SYS_leftmember\SYS_currenteqsign[\SYS_leftmember]% en deux membres
 			}%
-			{\def\SYS@nextaction{\expandafter\SYS@splitinmembers@i\expandafter{\SYS@removefirstiteminlist#1}}}% sinon, recommencer en enlevant le 1er signe
-		\expandafter\SYS@nextaction
-	\fi
-}
-
-\SYS@newmacro\SYS@ifcontains#1#2{%
-	\def\SYS@ifcontains@i##1#2##2\@nil{\ifx\@empty##2\@empty\expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi}%
-	\SYS@ifcontains@i#1\@@nil#2\@nil
+			{\xs_exparg\SYS_splitinmembers_i{\SYS_removefirstinlist#1}% sinon, recommencer en enlevant le 1er signe
+			}%
+		}%
 }
 
-% analyse une \'equation et la d\'ecoupe en termes et signes
-\SYS@newmacro\SYS@spliteqinterms#1{%
-	\IfSubStr{\noexpand#1}\SYS@extracolsign% y a t-il un signe de colonne suppl\'ementaire ?
-		{\StrBefore{\noexpand#1}\SYS@extracolsign[\SYS@leftmember]%
-		\StrBehind{\noexpand#1}\SYS@extracolsign[\SYS@rightmember]%
-		\SYS@cslet{SYS@extracol@\SYS@eqnumber}\SYS@rightmember
-		\SYS@extracoltrue
+% analyse une équation et la découpe en termes et signes
+\def\SYS_spliteqinterms#1{%
+	\IfSubStr{\noexpand#1}\SYS_extracolsign% y a t-il un signe de colonne supplémentaire ?
+		{\StrBefore{\noexpand#1}\SYS_extracolsign[\SYS_leftmember]%
+		\StrBehind{\noexpand#1}\SYS_extracolsign[\SYS_rightmember]%
+		\SYS_cslet{SYS_extracol_\SYS_eqnumber}\SYS_rightmember
+		\SYS_extracoltrue
 		}%
-		{\def\SYS@leftmember{#1}}%
-	\expandafter\SYS@splitinmembers\expandafter{\SYS@leftmember}% trouver les membres de gauche et droite et le signe qui les s\'epare
-	\unless\ifx\SYS@currenteqsign\@empty
-		\SYS@cslet{SYS@eqsign@\SYS@eqnumber}\SYS@currenteqsign% stocker ce signe s'il existe
-	\fi
-	\IfBeginWith\SYS@leftmember\space{\StrGobbleLeft\SYS@leftmember\@ne[\SYS@leftmember]}\relax% pas d'espace pour commencer le membre de gauche
-	\IfBeginWith\SYS@leftmember+% amputer le membre de gauche du premier signe et le stocker temporairement s'il existe et sinon...
-		{\StrSplit\SYS@leftmember\@ne\SYS@currentsign\SYS@leftmember}%
-		{\IfBeginWith\SYS@leftmember-%
-			{\StrSplit\SYS@leftmember\@ne\SYS@currentsign\SYS@leftmember}%
-			{\def\SYS@currentsign{+}}}% ce signe est "+"
-	\SYS@spliteqinterms@i\@ne
-	\SYS@cslet{SYS@right@\SYS@eqnumber}\SYS@rightmember
+		{\def\SYS_leftmember{#1}%
+		}%
+	\xs_exparg\SYS_splitinmembers{\SYS_leftmember}% trouver les membres de gauche et droite et le signe qui les sépare
+	\xs_ifx{\SYS_currenteqsign\empty}
+		{}%
+		{\SYS_cslet{SYS_eqsign_\SYS_eqnumber}\SYS_currenteqsign}% stocker ce signe s'il existe
+	\IfBeginWith\SYS_leftmember\space
+		{\StrGobbleLeft\SYS_leftmember1[\SYS_leftmember]}
+		{}% pas d'espace pour commencer le membre de gauche
+	\IfBeginWith\SYS_leftmember+% amputer le membre de gauche du premier signe et le stocker temporairement s'il existe et sinon...
+		{\StrSplit\SYS_leftmember1\SYS_currentsign\SYS_leftmember
+		}%
+		{\IfBeginWith\SYS_leftmember-%
+			{\StrSplit\SYS_leftmember1\SYS_currentsign\SYS_leftmember}%
+			{\def\SYS_currentsign{+}}% ce signe est "+"
+		}%
+	\SYS_spliteqinterms_i1%
+	\SYS_cslet{SYS_right_\SYS_eqnumber}\SYS_rightmember
 }
 
-\SYS@newmacro\SYS@spliteqinterms@i#1{%
-	\StrPosition\SYS@leftmember+[\SYS@posplus]%
-	\StrPosition\SYS@leftmember-[\SYS@posminus]%
-	\ifnum\numexpr\SYS@posplus+\SYS@posminus=\z@ % il n'y a ni "+" ni "-"
-		\let\SYS@currentterm\SYS@leftmember% prendre tout ce qui reste
-		\SYS@assignterm% et assigner ce dernier terme avec le dernier signe trouv\'e
-	\else
-		\edef\SYS@nextsign{\ifnum\SYS@posplus=\z@-\else\ifnum\SYS@posminus=\z@+\else\ifnum\SYS@posplus<\SYS@posminus+\else-\fi\fi\fi}% d\'ecider de ce qu'est le prochain signe
-		\StrBefore\SYS@leftmember\SYS@nextsign[\SYS@currentterm]% prendre ce qu'il y a avant
-		\StrBehind\SYS@leftmember\SYS@nextsign[\SYS@leftmember]% et stocker ce qu'il y a ensuite pour apr\`es
-		\SYS@assignterm% assigner ce qu'il y a avant avec le dernier signe trouv\'e
-		\let\SYS@currentsign\SYS@nextsign% on continue, le prochain signe devient le signe courant
-		\expandafter\SYS@spliteqinterms@i\expandafter{\number\numexpr#1+1\expandafter}%
-	\fi
+\def\SYS_spliteqinterms_i#1{%
+	\StrPosition\SYS_leftmember+[\SYS_posplus]%
+	\StrPosition\SYS_leftmember-[\SYS_posminus]%
+	\xs_ifnum{\numexpr\SYS_posplus+\SYS_posminus=0 }% il n'y a ni "+" ni "-"
+		{\let\SYS_currentterm\SYS_leftmember% prendre tout ce qui reste
+		\SYS_assignterm% et assigner ce dernier terme avec le dernier signe trouvé
+		}
+		{\edef\SYS_nextsign{\ifnum\SYS_posplus=0 -\else\ifnum\SYS_posminus=0 +\else\ifnum\SYS_posplus<\SYS_posminus+\else-\fi\fi\fi}% décider de ce qu'est le prochain signe
+		\StrBefore\SYS_leftmember\SYS_nextsign[\SYS_currentterm]% prendre ce qu'il y a avant
+		\StrBehind\SYS_leftmember\SYS_nextsign[\SYS_leftmember]% et stocker ce qu'il y a ensuite pour après
+		\SYS_assignterm% assigner ce qu'il y a avant avec le dernier signe trouvé
+		\let\SYS_currentsign\SYS_nextsign% on continue, le prochain signe devient le signe courant
+		\xs_exparg\SYS_spliteqinterms_i{\number\numexpr#1+1}%
+		}%
 }
 
-\SYS@newmacro\SYS@assignterm{%
-	\expandafter\SYS@findletter\expandafter{\SYS@currentterm}% trouver le nom de la variable
-	\ifx\SYS@letterfound\@empty
-		\SYS@consttermtrue
-		\ifcsname SYS@term@const@\SYS@eqnumber\endcsname% si terme constant d\'ej\`a rencontr\'e, l'ajouter \`a celui qui existe
-			\SYS@expaddtocs\SYS@currentsign\SYS@currentterm
-			\expandafter\SYS@expaddtocs\csname SYS@term@const@\SYS@eqnumber\endcsname{\SYS@currentsign}%
+\def\SYS_assignterm{%
+	\xs_exparg\SYS_findletter{\SYS_currentterm}% trouver le nom de la variable
+	\xs_ifx{\SYS_letterfound\empty}
+		{\SYS_consttermtrue
+		\ifcsname SYS_term_const_\SYS_eqnumber\endcsname% si terme constant déjà rencontré, l'ajouter à celui qui existe
+			\xs_eaddtomacro\SYS_currentsign\SYS_currentterm
+			\expandafter\xs_eaddtomacro\csname SYS_term_const_\SYS_eqnumber\endcsname{\SYS_currentsign}%
 		\else
-			\SYS@cslet{SYS@sign@const@\SYS@eqnumber}\SYS@currentsign% sinon proc\'eder aux assignations
-			\SYS@cslet{SYS@term@const@\SYS@eqnumber}\SYS@currentterm
+			\SYS_cslet{SYS_sign_const_\SYS_eqnumber}\SYS_currentsign% sinon procéder aux assignations
+			\SYS_cslet{SYS_term_const_\SYS_eqnumber}\SYS_currentterm
 		\fi
-	\else
-		\ifcsname SYS@term@\detokenize\expandafter{\SYS@letterfound}@\SYS@eqnumber\endcsname
-			\errmessage{Package systeme Error: l'inconnue "\detokenize\expandafter{\SYS@letterfound}" a deja ete trouvee dans l'equation !}%
+		}
+		{\ifcsname SYS_term_\detokenize\expandafter{\SYS_letterfound}_\SYS_eqnumber\endcsname
+			\errmessage{Package systeme Error: l'inconnue "\detokenize\expandafter{\SYS_letterfound}" a deja ete trouvee dans l'équation !}%
 		\fi
-		\ifSYS@sortvariable
-			\SYS@insletter\SYS@letterfound% l'ins\'erer si besoin dans la liste ordonn\'ee des variables
+		\ifSYS_sortvariable
+			\SYS_insletter\SYS_letterfound% l'insérer si besoin dans la liste ordonnée des variables
 		\fi
-% 		\show\SYS@letterlist
-		\SYS@cslet{SYS@sign@\detokenize\expandafter{\SYS@letterfound}@\SYS@eqnumber}\SYS@currentsign% proc\'eder aux assignations
-		\SYS@cslet{SYS@term@\detokenize\expandafter{\SYS@letterfound}@\SYS@eqnumber}\SYS@currentterm
-	\fi
+		\SYS_cslet{SYS_sign_\detokenize\expandafter{\SYS_letterfound}_\SYS_eqnumber}\SYS_currentsign% procéder aux assignations
+		\SYS_cslet{SYS_term_\detokenize\expandafter{\SYS_letterfound}_\SYS_eqnumber}\SYS_currentterm
+		}%
 }
 
-% cherche la premi\`ere lettre minuscule dans #1
-\SYS@newmacro\SYS@findletter#1{%
+% cherche la première lettre minuscule dans #1
+\def\SYS_findletter#1{%
 	\saveexploremode\exploregroups
-	\StrRemoveBraces{#1}[\SYS@currentfindletter]%
-	\let\SYS@letterfound\@empty
-	\SYS@findletter@i
+	\StrRemoveBraces{#1}[\SYS_currentfindletter]%
+	\let\SYS_letterfound\empty
+	\SYS_findletter_i
 	\restoreexploremode
 }
 
-\SYS@newmacro\SYS@findletter@i{%
-	\StrSplit\SYS@currentfindletter\@ne\SYS@currentchar\SYS@currentfindletter
-	\ifSYS@sortvariable% si le tri auto est activ\'e
-		\ifcat\relax\expandafter\noexpand\SYS@currentchar
-			\let\SYS@nextaction\@secondoftwo% faux si c'est une sc
+\def\SYS_findletter_i{%
+	\StrSplit\SYS_currentfindletter1\SYS_currentchar\SYS_currentfindletter
+	\ifSYS_sortvariable% si le tri auto est activé
+		\ifcat\relax\expandafter\noexpand\SYS_currentchar
+			\let\SYS_nextaction\xs_execsecond% faux si c'est une sc
 		\else
-			\ifnum\expandafter`\SYS@currentchar<`a
-				\let\SYS@nextaction\@secondoftwo% pas une lettre minuscule
-			\else
-				\ifnum\expandafter`\SYS@currentchar>`z
-					\let\SYS@nextaction\@secondoftwo% pas une lettre minuscule
-				\else
-					\SYS@testsubscript% tester s'il y a un indice
-					\let\SYS@nextaction\@firstoftwo
-				\fi
-			\fi
+			\xs_ifnum{\expandafter`\SYS_currentchar<`a }
+				{\let\SYS_nextaction\xs_execsecond% pas une lettre minuscule
+				}
+				{\xs_ifnum{\expandafter`\SYS_currentchar>`z }
+					{\let\SYS_nextaction\xs_execsecond% pas une lettre minuscule
+					}
+					{\SYS_testsubscript% tester s'il y a un indice
+					\let\SYS_nextaction\xs_execfirst
+					}%
+				}%
 		\fi
 	\else
 		\noexploregroups
-		\IfSubStr\SYS@letterlist\SYS@currentchar% ce qui est trouv\'e est dans la liste ?
-			{\SYS@testsubscript% tester s'il y a un indice apr\`es le caract\`ere courant
-			\let\SYS@nextaction\@firstoftwo
+		\IfSubStr\SYS_letterlist\SYS_currentchar% ce qui est trouvé est dans la liste ?
+			{\SYS_testsubscript% tester s'il y a un indice après le caractère courant
+			\let\SYS_nextaction\xs_execfirst
+			}%
+			{\let\SYS_nextaction\xs_execsecond
 			}%
-			{\let\SYS@nextaction\@secondoftwo}%
 		\exploregroups
 	\fi
-	\SYS@nextaction
-		{\let\SYS@letterfound\SYS@currentchar
-		\IfSubStr\SYS@letterfound_\relax{\SYS@addtocs\SYS@letterfound{_{-1}}}%
+	\SYS_nextaction
+		{\let\SYS_letterfound\SYS_currentchar
+		\IfSubStr\SYS_letterfound\SYSunder\relax{\xs_eaddtomacro\SYS_letterfound{\SYSunder{-1}}}%
+		}%
+		{\xs_ifx{\SYS_currentfindletter\empty}{}{\SYS_findletter_i}%
 		}%
-		{\unless\ifx\SYS@currentfindletter\@empty\expandafter\SYS@findletter@i\fi}%
 }
 
-\SYS@newmacro\SYS@addtocs#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
-
-\SYS@newmacro\SYS@expaddtocs#1#2{\expandafter\SYS@addtocs\expandafter#1\expandafter{#2}}
-
-% teste si \SYS@currentfindletter commence par "_" et si oui, rajoute les 2 caract\`eres \`a \SYS@currentchar et les enl\`eve \`a \SYS@currentfindletter
-\SYS@newmacro\SYS@testsubscript{%
+% teste si \SYS_currentfindletter commence par "_" et si oui, rajoute les 2 caractères à \SYS_currentchar et les enlève à \SYS_currentfindletter
+\def\SYS_testsubscript{%
 	\noexploregroups
-	\IfBeginWith\SYS@currentfindletter_%
-		{%\StrChar\SYS@currentfindletter\tw@[\SYS@currentletterafter]% TODO BUGFIX
-		\StrGobbleLeft\SYS@currentfindletter1[\SYS@currentletterafter]%
-%		\show\SYS@currentletterafter
+	\IfBeginWith\SYS_currentfindletter\SYSunder
+		{\StrGobbleLeft\SYS_currentfindletter1[\SYS_currentletterafter]%
 		\exploregroups
-		\StrRemoveBraces\SYS@currentletterafter[\SYS@currentletterafter]%
-		\IfInteger\SYS@currentletterafter
-			{\ifnum\SYS@currentletterafter=\m@ne\errmessage{L'indice ne doit pas etre -1.}\fi}%
-			{\errmessage{L'indice n'est pas un nombre entier !}}%
-		\SYS@expaddtocs\SYS@currentchar{\expandafter_\expandafter{\SYS@currentletterafter}}%
-		}\relax
+		\StrRemoveBraces\SYS_currentletterafter[\SYS_currentletterafter]%
+		\IfInteger\SYS_currentletterafter
+			{\xs_ifnum{\SYS_currentletterafter=-1 }
+				{\errmessage{L'indice ne doit pas etre -1.}}
+				{}%
+			}%
+			{\errmessage{L'indice n'est pas un nombre entier !}%
+			}%
+		\xs_eeaddtomacro\SYS_currentchar{\expandafter\SYSunder\expandafter{\number\SYS_currentletterafter}}% Bug 0.31 -> corrigé 0.32: si espace après l'inbdice : supprimé
+		}
+		{}%
 	\exploregroups
 }
 
-% ins\`ere l'inconnue dans la sc #1 \`a sa place dans \SYS@letterlist
-\SYS@newmacro\SYS@insletter#1{%
-	\IfSubStr\SYS@letterlist{#1}%
-		\relax
-		{\let\SYS@insunknown#1%
-		\StrChar{#1}\thr@@[\SYS@insnum]%
-		\StrRemoveBraces\SYS@insnum[\SYS@insnum]%
-		\StrChar{#1}\@ne[\SYS@currentinsletter]%
-		\let\SYS@letterlist@left\@empty
-		\let\SYS@letterlist@right\SYS@letterlist
-		\SYS@insletter@i}%
+% insère l'inconnue dans la sc #1 à sa place dans \SYS_letterlist
+\def\SYS_insletter#1{%
+	\IfSubStr\SYS_letterlist{#1}%
+		{}
+		{\let\SYS_insunknown#1%
+		\StrChar{#1}3[\SYS_insnum]%
+		\StrRemoveBraces\SYS_insnum[\SYS_insnum]%
+		\StrChar{#1}1[\SYS_currentinsletter]%
+		\let\SYS_letterlist_left\empty
+		\let\SYS_letterlist_right\SYS_letterlist
+		\SYS_insletter_i
+		}%
 }
 
-\SYS@newmacro\SYS@insletter@i{%
-	\ifx\SYS@letterlist@right\@empty% l'inconnue viendra \`a la fin de \SYS@letterlist
-		\SYS@expaddtocs\SYS@letterlist@left\SYS@insunknown
-		\let\SYS@letterlist\SYS@letterlist@left
-	\else
-		\StrChar\SYS@letterlist@right\@ne[\SYS@currentletter]% la lettre suivante
-		\unless\ifnum\expandafter`\SYS@currentinsletter>\expandafter`\SYS@currentletter% est elle la bonne ?
-			\let\SYS@letterlist@right@right\SYS@letterlist@right
-			\let\SYS@letterlist@right@left\@empty
-			\expandafter\expandafter\expandafter\SYS@insletter@ii%
-		\else% sinon
-			\StrSplit\SYS@letterlist@right\thr@@\SYS@currentletter\SYS@letterlist@right
-			\SYS@expaddtocs\SYS@letterlist@left\SYS@currentletter
-			\expandafter\expandafter\expandafter\SYS@insletter@i
-		\fi
-	\fi
+\def\SYS_insletter_i{%
+	\xs_ifx{\SYS_letterlist_right\empty}% l'inconnue viendra à la fin de \SYS_letterlist
+		{\xs_eaddtomacro\SYS_letterlist_left\SYS_insunknown
+		\let\SYS_letterlist\SYS_letterlist_left
+		}
+		{\StrChar\SYS_letterlist_right1[\SYS_currentletter]% la lettre suivante
+		\xs_ifnum{\expandafter`\SYS_currentinsletter>\expandafter`\SYS_currentletter\relax}% lettre pas bonne ?
+			{\StrSplit\SYS_letterlist_right3\SYS_currentletter\SYS_letterlist_right
+			\xs_eaddtomacro\SYS_letterlist_left\SYS_currentletter
+			\SYS_insletter_i
+			}% sinon
+			{\let\SYS_letterlist_right_right\SYS_letterlist_right
+			\let\SYS_letterlist_right_left\empty
+			\SYS_insletter_ii%
+			}%
+		}%
 }
 
-\SYS@newmacro\SYS@insletter@ii{%
-	\ifx\SYS@letterlist@right@right\@empty
-		\let\SYS@letterlist\SYS@letterlist@left
-		\SYS@expaddtocs\SYS@letterlist\SYS@letterlist@right@left
-		\SYS@expaddtocs\SYS@letterlist\SYS@insunknown
-	\else
-		\StrChar\SYS@letterlist@right@right\@ne[\SYS@currentletter]% la lettre suivante
-		\ifnum\expandafter`\SYS@currentinsletter<\expandafter`\SYS@currentletter% est elle une autre ?
-			\let\SYS@letterlist\SYS@letterlist@left
-			\SYS@expaddtocs\SYS@letterlist\SYS@letterlist@right@left
-			\SYS@expaddtocs\SYS@letterlist\SYS@insunknown
-			\SYS@expaddtocs\SYS@letterlist\SYS@letterlist@right@right
-		\else
-			\StrChar\SYS@letterlist@right@right\thr@@[\SYS@currentsubscript]% le prochain indice
-			\StrRemoveBraces\SYS@currentsubscript[\SYS@currentsubscript]%
-			\unless\ifnum\SYS@insnum>\SYS@currentsubscript% est-il le bon, c'est-\`a-dire trop grand ?
-				\let\SYS@letterlist\SYS@letterlist@left
-				\SYS@expaddtocs\SYS@letterlist\SYS@letterlist@right@left
-				\SYS@expaddtocs\SYS@letterlist\SYS@insunknown
-				\SYS@expaddtocs\SYS@letterlist\SYS@letterlist@right@right
-			\else
-				\StrSplit\SYS@letterlist@right@right\thr@@\SYS@currentletter\SYS@letterlist@right@right
-				\SYS@expaddtocs\SYS@letterlist@right@left\SYS@currentletter
-				\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\SYS@insletter@ii
-			\fi
-		\fi
-	\fi
+\def\SYS_insletter_ii{%
+	\xs_ifx{\SYS_letterlist_right_right\empty}
+		{\let\SYS_letterlist\SYS_letterlist_left
+		\xs_eaddtomacro\SYS_letterlist\SYS_letterlist_right_left
+		\xs_eaddtomacro\SYS_letterlist\SYS_insunknown
+		}
+		{\StrChar\SYS_letterlist_right_right1[\SYS_currentletter]% la lettre suivante
+		\xs_ifnum{\expandafter`\SYS_currentinsletter<\expandafter`\SYS_currentletter\relax}% est elle une autre ?
+			{\let\SYS_letterlist\SYS_letterlist_left
+			\xs_eaddtomacro\SYS_letterlist\SYS_letterlist_right_left
+			\xs_eaddtomacro\SYS_letterlist\SYS_insunknown
+			\xs_eaddtomacro\SYS_letterlist\SYS_letterlist_right_right
+			}
+			{\StrChar\SYS_letterlist_right_right3[\SYS_currentsubscript]% le prochain indice
+			\StrRemoveBraces\SYS_currentsubscript[\SYS_currentsubscript]%
+			\xs_ifnum{\SYS_insnum>\SYS_currentsubscript\relax}% est-il le bon, c'est-à-dire trop grand ?
+				{\StrSplit\SYS_letterlist_right_right3\SYS_currentletter\SYS_letterlist_right_right
+				\xs_eaddtomacro\SYS_letterlist_right_left\SYS_currentletter
+				\SYS_insletter_ii
+				}
+				{\let\SYS_letterlist\SYS_letterlist_left
+				\xs_eaddtomacro\SYS_letterlist\SYS_letterlist_right_left
+				\xs_eaddtomacro\SYS_letterlist\SYS_insunknown
+				\xs_eaddtomacro\SYS_letterlist\SYS_letterlist_right_right
+				}%
+			}%
+		}%
 }
 
-\SYS@newmacro\SYS@addtotok#1#2{#1\expandafter{\the#1#2}}
-
-\SYS@newmacro\SYS@expaddtotok#1#2{\expandafter\SYS@addtotok\expandafter#1\expandafter{#2}}
-
-\SYS@newmacro\SYS@addtocode{\SYS@addtotok\SYS@systemecode}
-
-\SYS@newmacro\SYS@expaddtocode#1{\expandafter\SYS@addtocode\expandafter{#1}}
-
 % reconstruit le code du tableau qui sera dans le \halign
-\SYS@newmacro\SYS@buildsystem#1#2{% #1=no ligne, #2=no inconnue
-	\StrSplit\SYS@letterlist@tmp3\SYS@currentvariable\SYS@letterlist@tmp
-	\ifcsname SYS@sign@\detokenize\expandafter{\SYS@currentvariable}@#1\endcsname
-		\expandafter\expandafter\expandafter\ifx\csname SYS@sign@\detokenize\expandafter{\SYS@currentvariable}@#1\endcsname+% signe + ?
-			\ifnum#2=\@ne% premi\`ere variable ?
-				\let\SYS@nextaction\@gobble
-			\else
-				\ifSYS@firstterm% premier terme de l'\'equation ?'
-					\let\SYS@nextaction\@gobble
+\def\SYS_buildsystem#1#2{% #1=no ligne, #2=no inconnue
+	\StrSplit\SYS_letterlist_tmp3\SYS_currentvariable\SYS_letterlist_tmp
+	\ifcsname SYS_sign_\detokenize\expandafter{\SYS_currentvariable}_#1\endcsname
+		\xs_eearg\xs_ifx{\csname SYS_sign_\detokenize\expandafter{\SYS_currentvariable}_#1\endcsname+}% signe + ?
+			{\xs_ifnum{#2=1 }% première variable ?
+				{\xs_gobarg
+				}
+				{\ifSYS_firstterm% premier terme de l'équation ?'
+					\expandafter\xs_gobarg
 				\else
-					\let\SYS@nextaction\@firstofone
+					\expandafter\SYS_execarg
 				\fi
-			\fi
-		\else
-			\ifnum#2=\@ne
-				\expandafter\def\csname SYS@term@\detokenize\expandafter{\SYS@currentvariable}@#1\expandafter\expandafter\expandafter\endcsname
+				}%
+			}
+			{\xs_ifnum{#2=1 }
+				{\expandafter\def\csname SYS_term_\detokenize\expandafter{\SYS_currentvariable}_#1\expandafter\expandafter\expandafter\endcsname
 					\expandafter\expandafter\expandafter{%
-					\csname SYS@sign@\detokenize\expandafter{\SYS@currentvariable}@#1\expandafter\expandafter\expandafter\endcsname
-					\csname SYS@term@\detokenize\expandafter{\SYS@currentvariable}@#1\endcsname}%
-				\let\SYS@nextaction\@gobble
-			\else
-				\let\SYS@nextaction\@firstofone
-			\fi
-		\fi
-		\SYS@nextaction{%
-			\SYS@addtocode{{}}%
-			\expandafter\SYS@expaddtocode\expandafter{\csname SYS@sign@\detokenize\expandafter{\SYS@currentvariable}@#1\endcsname{}}%
+					\csname SYS_sign_\detokenize\expandafter{\SYS_currentvariable}_#1\expandafter\expandafter\expandafter\endcsname
+					\csname SYS_term_\detokenize\expandafter{\SYS_currentvariable}_#1\endcsname}%
+				\xs_gobarg
+				}
+				{\SYS_execarg
+				}%
+			}%
+			{%
+			\SYS_addtotab{{}}%
+			\xs_eearg\SYS_addtotab{\csname SYS_sign_\detokenize\expandafter{\SYS_currentvariable}_#1\endcsname{}}%
 			}%
-		\SYS@firsttermfalse
+		\SYS_firsttermfalse
 	\fi
-	\unless\ifSYS@star
-		\unless\ifnum#2=\@ne\SYS@addtocode&\fi
+	\unless\ifSYS_star
+		\xs_ifnum{#2=1 }
+			{}
+			{\SYS_addtotab&}%
 	\fi
-	\ifcsname SYS@term@\detokenize\expandafter{\SYS@currentvariable}@#1\endcsname
-		\expandafter\SYS@expaddtocode\expandafter{\csname SYS@term@\detokenize\expandafter{\SYS@currentvariable}@#1\endcsname}%
+	\ifcsname SYS_term_\detokenize\expandafter{\SYS_currentvariable}_#1\endcsname
+		\xs_eearg\SYS_addtotab{\csname SYS_term_\detokenize\expandafter{\SYS_currentvariable}_#1\endcsname}%
 	\fi
-	\unless\ifSYS@star\SYS@addtocode&\fi
-	\ifnum#2<\SYS@numberofvariable
-		\edef\SYS@nextaction{\noexpand\SYS@buildsystem{#1}{\number\numexpr#2+1}}%
-		\expandafter\SYS@nextaction
-	\else
-		\ifSYS@constterm
-			\SYS@addtocode{{}}%
-			\ifSYS@firstterm\else\expandafter\SYS@expaddtocode\expandafter{\csname SYS@sign@const@#1\endcsname}\fi
-			\SYS@addtocode{{}&}%
-			\expandafter\SYS@expaddtocode\expandafter{\csname SYS@term@const@#1\endcsname&}%
+	\unless\ifSYS_star
+		\SYS_addtotab&%
+	\fi
+	\xs_ifnum{#2<\SYS_numberofvariable\relax}
+		{\xs_exparg{\SYS_buildsystem{#1}}{\number\numexpr#2+1}%
+		}
+		{\ifSYS_constterm
+			\ifcsname SYS_sign_const_#1\endcsname% si le terme constant existe dans cette ligne
+				\SYS_addtotab{{}}%
+				\ifSYS_firstterm\else
+					\xs_eearg\SYS_addtotab{\csname SYS_sign_const_#1\endcsname}%
+				\fi
+				\SYS_addtotab{{}}%
+				\unless\ifSYS_star
+					\SYS_addtotab&% Bug 0.31 -> corrigé 0.32
+				\fi
+				\xs_eearg\SYS_addtotab{\csname SYS_term_const_#1\endcsname}%
+			\else
+				\unless\ifSYS_star
+					\SYS_addtotab&% Bug 0.31 -> corrigé 0.32
+				\fi
+			\fi
+			\SYS_addtotab&%
 		\fi
-		\ifcsname SYS@eqsign@#1\endcsname
-			\SYS@addtocode{{}}%
-			\expandafter\SYS@expaddtocode\expandafter{\csname SYS@eqsign@#1\endcsname{}&}%
-			\expandafter\SYS@expaddtocode\expandafter{\csname SYS@right@#1\endcsname}%
+		\ifcsname SYS_eqsign_#1\endcsname
+			\SYS_addtotab{{}}%
+			\xs_eearg\SYS_addtotab{\csname SYS_eqsign_#1\endcsname{}&}%
+			\xs_eearg\SYS_addtotab{\csname SYS_right_#1\endcsname}%
 		\else
-			\SYS@addtocode&%
+			\SYS_addtotab&%
 		\fi
 		\saveexploremode\exploregroups
-		\ifcsname SYS@extracol@#1\endcsname
-			\SYS@addtocode&%
-			\expandafter\IfSubStr\csname SYS@extracol@#1\endcsname{**}% le contenu de l'extra col contient-il "**" ?
-				{\expandafter\let\expandafter\SYS@autonumarg\csname SYS@extracol@#1\endcsname
-				\StrSubstitute\SYS@autonumarg{**}{\number\numexpr\SYSeqnum+#1-\SYS@eqnumber}[\SYS@currentautonum]%
-				\SYS@cslet{SYS@extracol@#1}\SYS@currentautonum
-				\SYS@autonumtrue
+		\ifcsname SYS_extracol_#1\endcsname
+			\SYS_addtotab&%
+			\expandafter\IfSubStr\csname SYS_extracol_#1\endcsname{**}% le contenu de l'extra col contient-il "**" ?
+				{\SYS_letcs\SYS_autonumarg{SYS_extracol_#1}%
+				\StrSubstitute\SYS_autonumarg{**}{\number\numexpr\SYSeqnum+#1-\SYS_eqnumber}[\SYS_currentautonum]%
+				\SYS_cslet{SYS_extracol_#1}\SYS_currentautonum
+				\SYS_autonumtrue
 				}%
-				{\expandafter\IfSubStr\csname SYS@extracol@#1\endcsname*% le contenu de l'extra col contient-il "*" ?
-					{\expandafter\let\expandafter\SYS@autonumarg\csname SYS@extracol@#1\endcsname
-					\StrSubstitute\SYS@autonumarg*{\noexpand#1}[\SYS@currentautonum]%
-					\SYS@cslet{SYS@extracol@#1}\SYS@currentautonum
-					\SYS@autonumtrue
+				{\expandafter\IfSubStr\csname SYS_extracol_#1\endcsname*% le contenu de l'extra col contient-il "*" ?
+					{\SYS_letcs\SYS_autonumarg{SYS_extracol_#1}%
+					\StrSubstitute\SYS_autonumarg*{\noexpand#1}[\SYS_currentautonum]%
+					\SYS_cslet{SYS_extracol_#1}\SYS_currentautonum
+					\SYS_autonumtrue
 					}%
-					{\ifSYS@autonum
-						\IfSubStr\SYS@autonumarg{**}%
-							{\StrSubstitute\SYS@autonumarg{**}{\number\numexpr\SYSeqnum+#1-\SYS@eqnumber}[\SYS@currentautonum]}%
-							{\StrSubstitute\SYS@autonumarg*{\noexpand#1}[\SYS@currentautonum]}%
-						\SYS@expaddtocode\SYS@currentautonum
+					{\ifSYS_autonum
+						\IfSubStr\SYS_autonumarg{**}%
+							{\StrSubstitute\SYS_autonumarg{**}{\number\numexpr\SYSeqnum+#1-\SYS_eqnumber}[\SYS_currentautonum]}%
+							{\StrSubstitute\SYS_autonumarg*{\noexpand#1}[\SYS_currentautonum]}%
+						\xs_exparg\SYS_addtotab\SYS_currentautonum
 					\fi
 					}%
 				}%
-			\expandafter\SYS@expaddtocode\expandafter{\csname SYS@extracol@#1\endcsname}%
+			\xs_eearg\SYS_addtotab{\csname SYS_extracol_#1\endcsname}%
 		\else% pas d'extra colonne pour cette ligne ?
-			\ifSYS@autonum% mais si il y un autonum
-				\SYS@addtocode&%
-				\IfSubStr\SYS@autonumarg{**}%
-					{\StrSubstitute\SYS@autonumarg{**}{\number\numexpr\SYSeqnum+#1-\SYS@eqnumber}[\SYS@currentautonum]}%
-					{\StrSubstitute\SYS@autonumarg*{\noexpand#1}[\SYS@currentautonum]}%
-				\SYS@expaddtocode\SYS@currentautonum
+			\ifSYS_autonum% mais si il y un autonum
+				\SYS_addtotab&%
+				\IfSubStr\SYS_autonumarg{**}%
+					{\StrSubstitute\SYS_autonumarg{**}{\number\numexpr\SYSeqnum+#1-\SYS_eqnumber}[\SYS_currentautonum]}%
+					{\StrSubstitute\SYS_autonumarg*{\noexpand#1}[\SYS_currentautonum]}%
+				\xs_exparg\SYS_addtotab\SYS_currentautonum
 			\fi
 		\fi
 		\restoreexploremode
-		\ifnum#1<\SYS@eqnumber
-			\SYS@addtocode\cr
-			\SYS@firsttermtrue
-			\let\SYS@letterlist@tmp\SYS@letterlist
-			\edef\SYS@nextaction{\noexpand\SYS@buildsystem{\number\numexpr#1+1}{1}}%
-			\expandafter\expandafter\expandafter\SYS@nextaction
-		\else% fin de l'alignement
-			\SYS@addtocode{\SYS@strutdown\cr}%
-		\fi
-	\fi
+		\xs_ifnum{#1<\SYS_eqnumber\relax}
+			{\SYS_addtotab\cr
+			\SYS_firsttermtrue
+			\let\SYS_letterlist_tmp\SYS_letterlist
+			\xs_exparg\SYS_buildsystem{\number\numexpr#1+1}{1}%
+			}% fin de l'alignement
+			{\SYS_addtotab{\SYS_strutdown\cr}%
+			}%
+		}%
 }
 
-% ajoute "_\m@ne" \`a tous les tokens de #1 qui n'ont pas un indice
-\SYS@newmacro\SYS@scanletterlist#1{%
-	\let\SYS@letterlist\@empty
-	\def\SYS@lettersremaining{#1}%
-	\SYS@scanletterlist@i
+% ajoute "_{-1}" à tous les tokens de #1 qui n'ont pas un indice
+\def\SYS_scanletterlist#1{%
+	\let\SYS_letterlist\empty
+	\def\SYS_lettersremaining{#1}%
+	\SYS_scanletterlist_i
 }
 
-\SYS@newmacro\SYS@scanletterlist@i{%
-	\StrSplit\SYS@lettersremaining\@ne\SYS@currentchar\SYS@lettersremaining
-	\SYS@expaddtocs\SYS@letterlist\SYS@currentchar
-	\IfBeginWith\SYS@lettersremaining_%
-		{\StrChar\SYS@lettersremaining\tw@[\SYS@currentchar]%
-		\StrRemoveBraces\SYS@currentchar[\SYS@currentchar]%
-		\SYS@expaddtocs\SYS@letterlist{\expandafter_\expandafter{\SYS@currentchar}}%
-		\StrGobbleLeft\SYS@lettersremaining\tw@[\SYS@lettersremaining]%
+\def\SYS_scanletterlist_i{%
+	\StrSplit\SYS_lettersremaining1\SYS_currentchar\SYS_lettersremaining
+	\xs_eaddtomacro\SYS_letterlist\SYS_currentchar
+	\IfBeginWith\SYS_lettersremaining\SYSunder
+		{\StrChar\SYS_lettersremaining2[\SYS_currentchar]%
+		\StrRemoveBraces\SYS_currentchar[\SYS_currentchar]%
+		\xs_eeaddtomacro\SYS_letterlist{\expandafter\SYSunder\expandafter{\SYS_currentchar}}%
+		\StrGobbleLeft\SYS_lettersremaining2[\SYS_lettersremaining]%
 		}%
-		{\SYS@addtocs\SYS@letterlist{_{-1}}}%
-	\unless\ifx\SYS@lettersremaining\empty\expandafter\SYS@scanletterlist@i\fi
+		{\xs_eaddtomacro\SYS_letterlist{\SYSunder{-1}}%
+		}%
+	\xs_ifx{\SYS_lettersremaining\empty}
+		{}
+		{\SYS_scanletterlist_i}%
 }
 
-\SYS@newmacro\sysdelim#1#2{\def\SYS@delim@left{\left#1}\def\SYS@delim@right{\right#2}}
+\def\sysdelim#1#2{\def\SYS_delim_left{\left#1}\def\SYS_delim_right{\right#2}}
 \sysdelim\{.
 
-\SYS@newmacro\systeme{\@ifstar{\SYS@startrue\SYS@systeme@i}{\SYS@starfalse\SYS@systeme@i}}
+\def\systeme{\xs_ifstar{\SYS_startrue\SYS_systeme_i}{\SYS_starfalse\SYS_systeme_i}}
 
-\SYS@newmacro\SYS@systeme@i{%
+\def\SYS_systeme_i{%
 	\relax\iffalse{\fi\ifnum0=`}\fi
 	\begingroup
 		\mathcode`\,="013B
-		\catcode`\^7 \catcode`\_8
+		\catcode`\^7
+		\catcode`\_8
 		\expandarg\noexploregroups
-		\setbox\z@\hbox{$($}%
-		\edef\SYS@strutup{\vrule depth\z@ width\z@ height\dimexpr\ht\z@+\SYS@extrastrutdim\relax}%
-		\edef\SYS@strutdown{\vrule height\z@ width\z@ depth\dimexpr\dp\z@+\SYS@extrastrutdim\relax}%
-		\SYS@cslet++\SYS@cslet--%
-		\@testopt\SYS@systeme@ii{}%
+		\setbox0 \hbox{$($}%
+		\edef\SYS_strutup  {\vrule depth0pt width0pt height\dimexpr\ht0 +\SYS_extrastrutdim\relax}%
+		\edef\SYS_strutdown{\vrule height0pt width0pt depth\dimexpr\dp0 +\SYS_extrastrutdim\relax}%
+		\SYS_cslet++\SYS_cslet--%
+		\xs_testopt\SYS_systeme_ii{}%
 }
 
-\SYS@newmacro\SYS@systeme@ii[#1]{%
-		\ifx\@empty#1\@empty
-			\let\SYS@letterlist\@empty
-			\SYS@sortvariabletrue
-		\else
-			\SYS@scanletterlist{#1}% ajoute des _{-1} si besoin
-			\SYS@sortvariablefalse
-		\fi
-		\SYS@consttermfalse
-		\expandafter\@testopt\expandafter\SYS@systeme@iii\expandafter{\SYS@defaulteqsep}%
+\def\SYS_systeme_ii[#1]{%
+		\xs_ifempty{#1}
+			{\let\SYS_letterlist\empty
+			\SYS_sortvariabletrue
+			}
+			{\SYS_scanletterlist{#1}% ajoute des _{-1} si besoin
+			\SYS_sortvariablefalse
+			}%
+		\SYS_consttermfalse
+		\xs_exparg{\xs_testopt\SYS_systeme_iii}{\SYS_defaulteqsep}%
 }
 
-\SYS@newmacro\SYS@systeme@iii[#1]#2{%
-		\SYS@newmacro\SYS@systeme@iv##1#1##2\@nil{%
-			\ifx\@empty##1\@empty
-				\SYS@addtocode\cr% une ligne vide
-			\else
-				\SYS@spliteqinterms{##1}% analyser l'eq courante
-			\fi
-			\ifx\@empty##2\@empty% tant qu'il reste des \'equations
-			\else
-				\edef\SYS@eqnumber{\number\numexpr\SYS@eqnumber+\@ne}% augmenter de 1 leur nombre
-				\global\advance\SYSeqnum\@ne
-				\def\SYS@nextaction{\SYS@systeme@iv##2\@nil}% recommencer avec ce qu'il reste
-				\expandafter\SYS@nextaction
-			\fi
+\def\SYS_systeme_iii[#1]#2{%
+		\def\SYS_systeme_iv##1#1##2\_nil{%
+			\xs_ifempty{##1}
+				{\SYS_addtotab\cr}% on a une ligne vide
+				{\SYS_spliteqinterms{##1}}% analyser l'éq courante
+			\xs_ifempty{##2}% tant qu'il reste des équations
+				{}
+				{\edef\SYS_eqnumber{\number\numexpr\SYS_eqnumber+1}% augmenter de 1 leur nombre
+				\global\advance\SYSeqnum1
+				\SYS_systeme_iv##2\_nil% recommencer avec ce qu'il reste
+				}%
 		}%
-		\global\advance\SYSeqnum\@ne
-		\def\SYS@eqnumber{1}%
-		\ifdefined\SYS@autonumarg
-			\ifx\SYS@autonumarg\@empty% on initialise que si \SYS@autonumarg est vide
-				\SYS@extracolfalse
-				\SYS@autonumfalse
-			\fi
+		\global\advance\SYSeqnum1
+		\def\SYS_eqnumber{1}%
+		\ifdefined\SYS_autonumarg
+			\xs_ifx{\SYS_autonumarg\empty}% on initialise que si \SYS_autonumarg est vide
+				{\SYS_extracolfalse
+				\SYS_autonumfalse
+				}
+				{}%
 		\else
-			\SYS@extracolfalse
-			\SYS@autonumfalse
+			\SYS_extracolfalse
+			\SYS_autonumfalse
 		\fi
-		\SYS@systeme@iv#2#1\@nil% analyser toutes les \'equations et en faire des termes et des signes
-		\StrCount\SYS@letterlist_[\SYS@numberofvariable]%
-		\SYS@systemecode{}\SYS@systempreamble{}%
-		\ifSYS@star
-			\SYS@makesyspreamble\@ne
-		\else
-			\SYS@makesyspreamble\SYS@numberofvariable% fabriquer le pr\'eambule du \halign
-		\fi
-		\SYS@firsttermtrue
-		\let\SYS@letterlist@tmp\SYS@letterlist
-		\SYS@buildsystem11% construire le syst\`eme...
-		\ifdefined\SYS@substlist
-			\unless\ifx\SYS@substlist\@empty
-				\edef\SYS@systemcs{\the\SYS@systemecode}%
-				\SYS@substlist
-				\SYS@systemecode\expandafter{\SYS@systemcs}%
-			\fi
-		\fi
-		\ifmmode
-			\expandafter\@firstofone
-		\else
-			\expandafter\SYS@entermath
+		\SYS_systeme_iv#2#1\_nil% analyser toutes les équations et en faire des termes et des signes
+		\StrCount\SYS_letterlist\SYSunder[\SYS_numberofvariable]%
+		\SYS_systemecode{}\SYS_systempreamble{}%
+		\xs_exparg\SYS_makesyspreamble{\number\ifSYS_star1\else\SYS_numberofvariable\fi\space}% fabriquer le préambule du \halign
+		\SYS_firsttermtrue
+		\let\SYS_letterlist_tmp\SYS_letterlist
+		\SYS_buildsystem11% construire le système...
+		\ifdefined\SYS_substlist
+			\xs_ifx{\SYS_substlist\empty}
+				{}
+				{\edef\SYS_systemcs{\the\SYS_systemecode}%
+				\SYS_substlist
+				\SYS_systemecode\expandafter{\SYS_systemcs}%
+				}%
 		\fi
-			{\SYS@delim@left
+		\csname SYS_\ifmmode execarg\else entermath\fi\endcsname
+			{\SYS_delim_left
 			\vcenter{%
-				\lineskiplimit\z@\lineskip\z@
-				\baselineskip\SYS@lineskipcoeff\normalbaselineskip
-				\halign\expandafter\expandafter\expandafter{\expandafter\the\expandafter\SYS@systempreamble\the\SYS@systemecode}%
+				\lineskiplimit=0pt
+				\lineskip=0pt
+				\baselineskip\SYS_lineskipcoeff\normalbaselineskip
+				\halign\expandafter\expandafter\expandafter{\expandafter\the\expandafter\SYS_systempreamble\the\SYS_systemecode}%
 				}%
-			\SYS@delim@right
+			\SYS_delim_right
 			}% ...l'afficher en mode math
 	\endgroup
 	\ifnum0=`{\fi\iffalse}\fi
-	\unless\ifSYS@followautonum
-		\ifdefined\SYS@autonumarg
-			\let\SYS@autonumarg\@empty% annule la num\'erotation auto
+	\unless\ifSYS_followautonum
+		\ifdefined\SYS_autonumarg
+			\let\SYS_autonumarg\empty% annule la numérotation auto
 		\fi
 	\fi
 }
 
-% Construire le pr\'eambule du \halign
-\SYS@newmacro\SYS@makesyspreamble#1{%
-	\def\SYS@preamblenum{#1}%
-	\SYS@makesyspreamble@i\@ne
+% Construire le préambule du \halign
+\def\SYS_makesyspreamble#1{%
+	\def\SYS_preamblenum{#1}%
+	\SYS_makesyspreamble_i1%
 }
 
-\SYS@newmacro\SYS@makesyspreamble@i#1{%
-	\ifnum#1<\SYS@preamblenum% tant qu'il reste des variables
-		\SYS@addtotok\SYS@systempreamble{\hfil$##$&\hfil$##$&}% une colonne pour le terme et une pour le signe
-		\expandafter\SYS@makesyspreamble@i\expandafter{\number\numexpr#1+\@ne\expandafter}%
-	\else
-		\ifSYS@constterm
-			\SYS@addtotok\SYS@systempreamble{\hfil$##$&\hfil$##$&}% une colonne pour le terme constant et son signe
+\def\SYS_makesyspreamble_i#1{%
+	\xs_ifnum{#1<\SYS_preamblenum\relax}% tant qu'il reste des variables
+		{\SYS_addtotok\SYS_systempreamble{\hfil$##$&\hfil$##$&}% une colonne pour le terme et une pour le signe
+		\xs_exparg\SYS_makesyspreamble_i{\number\numexpr#1+1}%
+		}
+		{\ifSYS_constterm
+			\SYS_addtotok\SYS_systempreamble{\hfil$##$&\hfil$##$&}% une colonne pour le terme constant et son signe
 		\fi
-		\SYS@addtotok\SYS@systempreamble{\hfil$##$&$##$&$##$\hfil\null}% ajouter 1 colonne pour le signe = et une pour le terme de droite
-		\ifSYS@extracol
-			\SYS@addtotok\SYS@systempreamble{&\SYS@extracolstart##\SYS@extracolend\hfil\null}% la colonne suppl\'ementaire (pas de mode math)
+		\SYS_addtotok\SYS_systempreamble{\hfil$##$&$##$&$##$\hfil\null}% ajouter 1 colonne pour le signe = et une pour le terme de droite
+		\ifSYS_extracol
+			\SYS_addtotok\SYS_systempreamble{&\SYS_extracolstart##\SYS_extracolend\hfil\null}% la colonne supplémentaire (pas de mode math)
 		\fi
-		\SYS@addtotok\SYS@systempreamble{\cr\SYS@strutup}% ajouter la fin du pr\'eambule et le strut de premi\`ere ligne
-	\fi
+		\SYS_addtotok\SYS_systempreamble{\cr\SYS_strutup}% ajouter la fin du préambule et le strut de première ligne
+		}%
 }
 
-\SYS@newmacro\SYS@entermath#1{$\relax#1$}
+\def\SYS_entermath#1{$\relax#1$}
 
-% d\'efinit les substitutions \`a faire dans le tableau avant l'affichage
-\SYS@newmacro\syssubstitute{%
-	\unless\ifdefined\SYS@substlist\let\SYS@substlist\@empty\fi
-	\SYS@substitute@i
+% définit les substitutions à faire dans le tableau avant l'affichage
+\def\syssubstitute{%
+	\unless\ifdefined\SYS_substlist\let\SYS_substlist\empty\fi
+	\SYS_substitute_i
 }
 
-\SYS@newmacro\SYS@substitute@i#1{%
-	\ifx\@empty#1\@empty
-	\else
-		\SYS@addtocs\SYS@substlist{\StrSubstitute\SYS@systemcs}%
-		\StrChar{\noexpand#1}\@ne[\SYS@currentchar]\StrRemoveBraces\SYS@currentchar[\SYS@currentchar]%
-		\SYS@expaddtocs\SYS@substlist{\expandafter{\expandafter\noexpand\SYS@currentchar}}%
-		\StrChar{\noexpand#1}\tw@[\SYS@currentchar]\StrRemoveBraces\SYS@currentchar[\SYS@currentchar]%
-		\SYS@expaddtocs\SYS@substlist{\expandafter{\expandafter\noexpand\SYS@currentchar}[\SYS@systemcs]}%
-		\def\SYS@nextaction{\expandafter\SYS@substitute@i\expandafter{\@gobbletwo#1}}%
-		\expandafter\SYS@nextaction
-	\fi
+\def\SYS_substitute_i#1{%
+	\xs_ifempty{#1}
+		{}
+		{\xs_addtomacro\SYS_substlist{\StrSubstitute\SYS_systemcs}%
+		\StrChar{\noexpand#1}1[\SYS_currentchar]\StrRemoveBraces\SYS_currentchar[\SYS_currentchar]%
+		\xs_eaddtomacro\SYS_substlist{\expandafter{\expandafter\noexpand\SYS_currentchar}}%
+		\StrChar{\noexpand#1}2[\SYS_currentchar]\StrRemoveBraces\SYS_currentchar[\SYS_currentchar]%
+		\xs_eaddtomacro\SYS_substlist{\expandafter{\expandafter\noexpand\SYS_currentchar}[\SYS_systemcs]}%
+		\xs_exparg\SYS_substitute_i{\SYS_gobtwoargs#1}%
+		}%
 }
 
 % annule les substitutions
-\SYS@newmacro\sysnosubstitute{\let\SYS@substlist\@empty}
+\def\sysnosubstitute{\let\SYS_substlist\empty}
 
-\catcode`\@\SYS@savedatcatcode\relax
+\SYS_restorecatcode
 
 \endinput
 
@@ -660,29 +654,36 @@
 ######################################################################
 
 v0.1        27/02/2011
-	- Premi\`ere version publique sur le CTAN
+	- Première version publique sur le CTAN.
 ----------------------------------------------------------------------
 v0.2        08/03/2011
     - Le premier argument optionnel met en place de nouvelles
-      fonctionnalit\'es
-    - Possibilit\'e d'avoir des inconnues indic\'ees
-    - Mise en place d'une colonne suppl\'ementaire et d'une
-      num\'erotation automatique
-    - La commande \'etoil\'ee \systeme* d\'egrade l'alignement pour ne
-      plus prendre en compte que les signes d'\'egalit\'e
+      fonctionnalités.
+    - Possibilité d'avoir des inconnues indicées.
+    - Mise en place d'une colonne supplémentaire et d'une
+      numérotation automatique.
+    - La commande étoilée \systeme* dégrade l'alignement pour ne
+      plus prendre en compte que les signes d'égalité.
     - Une substitution est possible en fin de traitement, juste
-      avant d'afficher le syst\`eme.
+      avant d'afficher le système.
 ----------------------------------------------------------------------
 v0.2a       15/05/2011
-    - Bug corrig\'e lorsque les termes comportent des accolades
+    - Bug corrigé lorsque les termes comportent des accolades.
 ----------------------------------------------------------------------
-v0.2b       2011/06/23
-    - La commande \setdelim permet de modifier les d\'elimiteurs
-      extensibles plac\'es de part et d'autre du syst\`eme.
+v0.2b       23/06/2011
+    - La commande \setdelim permet de modifier les délimiteurs
+      extensibles placés de part et d'autre du système.
 ----------------------------------------------------------------------
 v0.3        21/12/2013
-    - Un terme constant est permis dans le membre de gauche
-    ----------------------------------------------------------------------
+    - Un terme constant est permis dans le membre de gauche.
+----------------------------------------------------------------------
 v0.31       01/01/2018
-    - Il manquait un "&" apr\`es le terme constant, merci \`a Thomas Soll
-      de l'avoir signal\'e
\ No newline at end of file
+    - Il manquait un "&" après le terme constant, merci à Thomas Soll
+      de l'avoir signalé.
+----------------------------------------------------------------------
+v0.32       13/01/2019
+    - Correction d'un bug : les espaces étaient pris en compte dans
+      les noms des termes.
+    - Correction d'un bug : si version étoilée et terme constant dans
+      membre de gauche, défaut d'alignement.
+    - Nettoyage du code.
\ No newline at end of file
-- 
cgit v1.2.3

