diff options
author | Karl Berry <karl@freefriends.org> | 2011-03-09 00:51:34 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2011-03-09 00:51:34 +0000 |
commit | 566fb51f9006785d226e698f5c75cf05f1d75608 (patch) | |
tree | 26176e2a31595377747435d53cdeffe625916d63 /Master/texmf-dist/tex/generic/systeme | |
parent | e5abb7960d35683e02c220371b77d39148079a77 (diff) |
systeme (8mar11)
git-svn-id: svn://tug.org/texlive/trunk@21651 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/systeme')
-rw-r--r-- | Master/texmf-dist/tex/generic/systeme/systeme.tex | 448 |
1 files changed, 360 insertions, 88 deletions
diff --git a/Master/texmf-dist/tex/generic/systeme/systeme.tex b/Master/texmf-dist/tex/generic/systeme/systeme.tex index e44ddeeba44..6085124ade0 100644 --- a/Master/texmf-dist/tex/generic/systeme/systeme.tex +++ b/Master/texmf-dist/tex/generic/systeme/systeme.tex @@ -1,9 +1,9 @@ % __________________________________________________________________ % | | % | | -% | systeme v0.1 | +% | systeme v0.2 | % | | -% | 27 f\'evrier 2011 | +% | 8 mars 2011 | % | | % |__________________________________________________________________| % @@ -50,18 +50,27 @@ \def#1% } -\SYS@newmacro\SYS@ver {0.1} -\SYS@newmacro\SYS@date {2011/02/27} -\SYS@newmacro\SYS@longdate {27 F\'evrier 2011} +\SYS@newmacro\SYS@ver {0.2} +\SYS@newmacro\SYS@date {2011/03/08} +\SYS@newmacro\SYS@longdate {8 mars 2011} \SYS@newmacro\SYS@packagename{systeme} \newtoks\SYS@systemecode +\newtoks\SYS@systempreamble + \newif\ifSYS@firstterm \newif\ifSYS@sortvariable +\newif\ifSYS@star +\newif\ifSYS@extracol +\newif\ifSYS@autonum +\newif\ifSYS@followautonum + +\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: \SYS@packagename\space\SYS@date\space\space v\SYS@ver\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} @@ -85,10 +94,45 @@ \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{ } \fi +% d\'efinit ce qu'est le s\'eparateur des \'equations par d\'efaut +\SYS@newmacro\syseqsep{\def\SYS@defaulteqsep} +\syseqsep{,} + +% d\'efinit le coefficient pour l'espacement interligne +\SYS@newmacro\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\'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}} +\syscodeextracol{\kern1.5em$}{$} + +\SYS@newmacro\sysreseteqnum{\global\SYSeqnum\z@} + +\SYS@newmacro\SYS@cslet#1{\expandafter\let\csname#1\endcsname} + +% d\'efinit l'autonum\'erotation +\SYS@newmacro\sysautonum{\@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 +} + % 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} @@ -150,7 +194,7 @@ \SYS@newmacro\SYS@splitinmembers@i#1{% \ifx\@empty#1\@empty \else - \expandafter\expandafter\expandafter\SYS@ifcontains\expandafter\expandafter\expandafter{\expandafter\SYS@leftmember\expandafter}\expandafter{\SYS@firstiteminlist#1\@nil}% si l'\'equation contient un des signes + \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 @@ -168,8 +212,17 @@ % analyse une \'equation et la d\'ecoupe en termes et signes \SYS@newmacro\SYS@spliteqinterms#1{% - \SYS@splitinmembers{#1}% d'abord trouver les membres de gauche et droite et le signe qui les s\'epare - \unless\ifx\SYS@currenteqsign\@empty\expandafter\let\csname SYS@eqsign@\SYS@eqnumber\endcsname\SYS@currenteqsign\fi% stocker ce signe s'il existe + \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 + }% + {\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}% @@ -177,7 +230,7 @@ {\StrSplit\SYS@leftmember\@ne\SYS@currentsign\SYS@leftmember}% {\def\SYS@currentsign{+}}}% ce signe est "+" \SYS@spliteqinterms@i\@ne - \expandafter\let\csname SYS@right@\SYS@eqnumber\endcsname\SYS@rightmember + \SYS@cslet{SYS@right@\SYS@eqnumber}\SYS@rightmember } \SYS@newmacro\SYS@spliteqinterms@i#1{% @@ -201,75 +254,151 @@ \ifx\SYS@letterfound\@empty \errmessage{Package systeme Error: aucune inconnue trouvee dans ce terme : "\detokenize\expandafter{\SYS@currentterm}" !}% \else - \ifcsname SYS@term@\SYS@letterfound @\SYS@eqnumber\endcsname - \errmessage{Package systeme Error: l'inconnue "\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'equation !}% + \fi + \ifSYS@sortvariable + \SYS@insletter\SYS@letterfound% l'ins\'erer si besoin dans la liste ordonn\'ee des variables \fi - \ifSYS@sortvariable\expandafter\SYS@insertletter\expandafter\SYS@letterlist\SYS@letterfound\fi% l'ins\'erer si besoin dans la liste ordonn\'ee des variables \fi - \expandafter\let\csname SYS@sign@\SYS@letterfound @\SYS@eqnumber\endcsname\SYS@currentsign% proc\'eder aux assignations - \expandafter\let\csname SYS@term@\SYS@letterfound @\SYS@eqnumber\endcsname\SYS@currentterm + \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 } % cherche la premi\`ere lettre minuscule dans #1 \SYS@newmacro\SYS@findletter#1{% - \def\SYS@currentterm{#1}% + \def\SYS@currentfindletter{#1}% \saveexploremode\exploregroups - \StrLen\SYS@currentterm[\SYS@currentlength]% \let\SYS@letterfound\@empty - \SYS@findletter@i\@ne + \SYS@findletter@i \restoreexploremode } -\SYS@newmacro\SYS@findletter@i#1{% - \StrChar\SYS@currentterm{#1}[\SYS@currentchar]% - \ifcat\relax\expandafter\noexpand\SYS@currentchar - \let\SYS@nextaction\@secondoftwo% faux si c'est une sc - \else - \ifnum\expandafter`\SYS@currentchar<`a - \let\SYS@nextaction\@secondoftwo +\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 \else - \ifnum\expandafter`\SYS@currentchar>`z - \let\SYS@nextaction\@secondoftwo + \ifnum\expandafter`\SYS@currentchar<`a + \let\SYS@nextaction\@secondoftwo% pas une lettre minuscule \else - \let\SYS@nextaction\@firstoftwo + \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 \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 + }% + {\let\SYS@nextaction\@secondoftwo}% + \exploregroups \fi \SYS@nextaction - {\let\SYS@letterfound\SYS@currentchar}% renvoyer la premi\`ere lettre trouv\'ee dans \SYS@letterfound - {\unless\ifnum#1>\SYS@currentlength\expandafter\SYS@findletter@i\expandafter{\number\numexpr#1+1\expandafter}\fi}% + {\let\SYS@letterfound\SYS@currentchar + \IfSubStr\SYS@letterfound_\relax{\SYS@addtocs\SYS@letterfound{_{-1}}}% + }% + {\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{% + \noexploregroups + \IfBeginWith\SYS@currentfindletter_% + {\StrChar\SYS@currentfindletter\tw@[\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 + \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\`ere dans la sc #1 qui contient des lettres ordonn\'ees, la lettre #2 -\SYS@newmacro\SYS@insertletter#1#2{% - \IfSubStr#1{\noexpand#2}\relax{\SYS@insertletter@i1#1{#2}}% +\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 } -\SYS@newmacro\SYS@insertletter@i#1#2#3{% - \StrChar#2{#1}[\SYS@currentchar]% - \ifx\SYS@currentchar\@empty - \def\SYS@nextaction{\expandafter\def\expandafter#2\expandafter{#2#3}}% +\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 - \ifnum\expandafter`\SYS@currentchar<`#3 % tant que la place n'est pas trouv\'ee - \def\SYS@nextaction{\expandafter\SYS@insertletter@i\expandafter{\number\numexpr#1+1}#2{#3}}% aller au rang suivant + \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 - \StrSplit#2{\number\numexpr#1-1}#2\SYS@afterpos% la position est atteinte -> couper #2 ici - \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter#2\expandafter\expandafter\expandafter{\expandafter#2\expandafter#3\SYS@afterpos}% puis coller les morceaux en ins\'erant la lettre #3 - \let\SYS@nextaction\relax + \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 - \SYS@nextaction } -\SYS@newmacro\SYS@addtotok#1{\SYS@systemecode\expandafter{\the\SYS@systemecode#1}} +\SYS@newmacro\SYS@addtotok#1#2{#1\expandafter{\the#1#2}} -\SYS@newmacro\SYS@expaddtotok#1{\expandafter\SYS@addtotok\expandafter{#1}} +\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{% - \StrChar\SYS@letterlist{#2}[\SYS@currentvariable]% - \ifcsname SYS@sign@\SYS@currentvariable @#1\endcsname - \expandafter\expandafter\expandafter\ifx\csname SYS@sign@\SYS@currentvariable @#1\endcsname+% signe + ? +\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 @@ -281,104 +410,237 @@ \fi \else \ifnum#2=\@ne - \expandafter\def\csname SYS@term@\SYS@currentvariable @#1\expandafter\expandafter\expandafter\endcsname\expandafter\expandafter\expandafter{\csname SYS@sign@\SYS@currentvariable @#1\expandafter\expandafter\expandafter\endcsname\csname SYS@term@\SYS@currentvariable @#1\endcsname}% + \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{\expandafter\SYS@expaddtotok\expandafter{\expandafter\expandafter\expandafter\SYS@displaymathop\csname SYS@sign@\SYS@currentvariable @#1\endcsname}}% + \SYS@nextaction{% + \SYS@addtocode{{}}% + \expandafter\SYS@expaddtocode\expandafter{\csname SYS@sign@\detokenize\expandafter{\SYS@currentvariable}@#1\endcsname{}}% + }% \SYS@firsttermfalse \fi - \unless\ifnum#2=\@ne\SYS@addtotok&\fi - \ifcsname SYS@term@\SYS@currentvariable @#1\endcsname - \expandafter\SYS@expaddtotok\expandafter{\expandafter\expandafter\expandafter$\csname SYS@term@\SYS@currentvariable @#1\endcsname$}% + \unless\ifSYS@star + \unless\ifnum#2=\@ne\SYS@addtocode&\fi \fi - \SYS@addtotok&% + \ifcsname SYS@term@\detokenize\expandafter{\SYS@currentvariable}@#1\endcsname + \expandafter\SYS@expaddtocode\expandafter{\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 \ifcsname SYS@eqsign@#1\endcsname - \expandafter\expandafter\expandafter\SYS@expaddtotok\expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter\SYS@displaymathop\csname SYS@eqsign@#1\endcsname&}% - \expandafter\SYS@expaddtotok\expandafter{\expandafter\expandafter\expandafter$\csname SYS@right@#1\endcsname$}% + \SYS@addtocode{{}}% + \expandafter\SYS@expaddtocode\expandafter{\csname SYS@eqsign@#1\endcsname{}&}% + \expandafter\SYS@expaddtocode\expandafter{\csname SYS@right@#1\endcsname}% + \else + \SYS@addtocode&% \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 + }% + {\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 + }% + {\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 + \fi + }% + }% + \expandafter\SYS@expaddtocode\expandafter{\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 + \fi + \fi + \restoreexploremode \ifnum#1<\SYS@eqnumber - \SYS@addtotok\cr + \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 } -\SYS@newmacro\systeme{% +% 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 +} + +\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]% + }% + {\SYS@addtocs\SYS@letterlist{_{-1}}}% + \unless\ifx\SYS@lettersremaining\empty\expandafter\SYS@scanletterlist@i\fi +} + +\SYS@newmacro\systeme{\@ifstar{\SYS@startrue\SYS@systeme@i}{\SYS@starfalse\SYS@systeme@i}} + +\SYS@newmacro\SYS@systeme@i{% + \relax\iffalse{\fi\ifnum0=`}\fi \begingroup \mathcode`\,="013B \expandarg\noexploregroups \setbox\z@\hbox{$($}% - \edef\SYS@strutup{\noexpand\vrule depth0pt width0pt height\dimexpr\the\ht\z@+\SYS@extrastrutdim}% - \edef\SYS@strutdown{\noexpand\vrule height0pt width0pt depth\dimexpr\the\dp\z@+\SYS@extrastrutdim}% - \lineskiplimit\z@\lineskip\z@ - \baselineskip\SYS@lineskipcoeff\baselineskip - \@testopt\SYS@systeme@i{}% + \edef\SYS@strutup{\noexpand\vrule depth\z@ width\z@ height\dimexpr\ht\z@+\SYS@extrastrutdim\relax}% + \edef\SYS@strutdown{\noexpand\vrule height\z@ width\z@ depth\dimexpr\dp\z@+\SYS@extrastrutdim\relax}% + \SYS@cslet++\SYS@cslet--% + \@testopt\SYS@systeme@ii{}% } -\SYS@newmacro\SYS@systeme@i[#1]{% - \def\SYS@letterlist{#1}% - \ifx\SYS@letterlist\@empty\SYS@sortvariabletrue\else\SYS@sortvariablefalse\fi - \@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 + \expandafter\@testopt\expandafter\SYS@systeme@iii\expandafter{\SYS@defaulteqsep}% } -\SYS@newmacro\SYS@systeme@ii[#1]#2{% - \SYS@newmacro\SYS@systeme@iii##1#1##2\@nil{% +\SYS@newmacro\SYS@systeme@iii[#1]#2{% + \SYS@newmacro\SYS@systeme@iv##1#1##2\@nil{% \ifx\@empty##1\@empty - \SYS@addtotok\cr% une ligne vide + \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+1}% augmenter de 1 leur nombre - \def\SYS@nextaction{\SYS@systeme@iii##2\@nil}% recommencer avec ce qu'il reste + \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 }% + \global\advance\SYSeqnum\@ne \def\SYS@eqnumber{1}% - \SYS@systeme@iii#2#1\@nil% analyser toutes les \'equations et en faire des termes et des signes - \StrLen\SYS@letterlist[\SYS@numberofvariable]% - \SYS@systemecode{}% - \SYS@makesyspreamble\@ne% fabriquer le pr\'eambule du \halign + \ifdefined\SYS@autonumarg + \ifx\SYS@autonumarg\@empty% on initialise que si \SYS@autonumarg est vide + \SYS@extracolfalse + \SYS@autonumfalse + \fi + \else + \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 - \StrChar\SYS@letterlist\@ne[\SYS@firstvariable]% premi\`ere inconnue + \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 \fi - {\left\{\vcenter{\expandafter\halign\expandafter{\the\SYS@systemecode\SYS@strutdown\cr}}\right.}% ...l'afficher en mode math + {\left\{% + \vcenter{% + \lineskiplimit\z@\lineskip\z@ + \baselineskip\SYS@lineskipcoeff\normalbaselineskip + \halign\expandafter\expandafter\expandafter{\expandafter\the\expandafter\SYS@systempreamble\the\SYS@systemecode}% + }% + \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 + \fi + \fi } % Construire le pr\'eambule du \halign \SYS@newmacro\SYS@makesyspreamble#1{% - \ifnum#1<\SYS@numberofvariable% tant qu'il reste des variables - \SYS@addtotok{\hfil##&\hfil##&}% une colonne pour le terme et une pour le signe - \expandafter\SYS@makesyspreamble\expandafter{\number\numexpr#1+\@ne\expandafter}% + \def\SYS@preamblenum{#1}% + \SYS@makesyspreamble@i\@ne +} + +\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 - \SYS@addtotok{\hfil##&##&##\hfil\null\cr\SYS@strutup}% ajouter 1 colonne pour le signe et une pour le terme de droite + \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) + \fi + \SYS@addtotok\SYS@systempreamble{\cr\SYS@strutup}% ajouter la fin du pr\'eambule et le strut de premi\`ere ligne \fi } \SYS@newmacro\SYS@entermath#1{$\relax#1$} -% permet d'avoir les signes "+", "-" ou "=" avec le bon espacement -\SYS@newmacro\SYS@displaymathop#1{${}#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\'efinit le coefficient pour l'espacement interligne -\SYS@newmacro\syslineskipcoeff#1{\def\SYS@lineskipcoeff{#1}} -\syslineskipcoeff1% +\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 +} + +% annule les substitutions +\SYS@newmacro\sysnosubstitute{\let\SYS@substlist\@empty} \catcode`\@\SYS@savedatcatcode\relax @@ -390,4 +652,14 @@ v0.1 2011/02/27 - Premi\`ere version publique sur le CTAN -----------------------------------------------------------------------
\ No newline at end of file +---------------------------------------------------------------------- +v0.2 2011/03/08 + - 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 + - Une substitution est possible en fin de traitement, juste + avant d'afficher le syst\`eme.
\ No newline at end of file |