summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/systeme
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2011-03-09 00:51:34 +0000
committerKarl Berry <karl@freefriends.org>2011-03-09 00:51:34 +0000
commit566fb51f9006785d226e698f5c75cf05f1d75608 (patch)
tree26176e2a31595377747435d53cdeffe625916d63 /Master/texmf-dist/tex/generic/systeme
parente5abb7960d35683e02c220371b77d39148079a77 (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.tex448
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