From 45703352bcad374f3e88099a40425df3ba5c3395 Mon Sep 17 00:00:00 2001 From: Karl Berry 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