summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/systeme
diff options
context:
space:
mode:
authorManuel Pégourié-Gonnard <mpg@elzevir.fr>2011-03-03 12:47:48 +0000
committerManuel Pégourié-Gonnard <mpg@elzevir.fr>2011-03-03 12:47:48 +0000
commitb33538bbd7066d3a363ce7899e9f5311420e0cec (patch)
tree52a618a8afaae83d7516bf0f365e5fd40254807e /Master/texmf-dist/tex/generic/systeme
parentfd398aa11fc84dd2a33da4e4f4dc5d5ee9d7fa2a (diff)
systeme.tex is a runtime file, author says
git-svn-id: svn://tug.org/texlive/trunk@21596 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/systeme')
-rw-r--r--Master/texmf-dist/tex/generic/systeme/systeme.tex393
1 files changed, 393 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/systeme/systeme.tex b/Master/texmf-dist/tex/generic/systeme/systeme.tex
new file mode 100644
index 00000000000..e44ddeeba44
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/systeme/systeme.tex
@@ -0,0 +1,393 @@
+% __________________________________________________________________
+% | |
+% | |
+% | systeme v0.1 |
+% | |
+% | 27 f\'evrier 2011 |
+% | |
+% |__________________________________________________________________|
+%
+% Ce fichier est systeme.tex, le code TeX de l'extention "systeme".
+%
+% Maintainer: Christian Tellechea
+% E-mail : unbonpetit@gmail.com
+% Commentaires, remont\'ees de bugs, et suggestions
+% sont les bienvenus.
+% Licence : Released under the LaTeX Project Public License v1.3c or
+% later, see http://www.latex-project.org/lppl.txt
+% Copyright : Christian Tellechea 2011
+%
+% Le package "systeme" est constitu\'e de ces 5 fichiers :
+% systeme.tex (ce fichier)
+% systeme.sty (le fichier pour LaTeX)
+% README
+% systeme_doc_fr.tex, systeme_doc_fr.pdf (manuel en francais)
+%
+% --------------------------------------------------------------------
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+%
+% % http://www.latex-project.org/lppl.txt
+%
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+% --------------------------------------------------------------------
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Christian Tellechea
+% --------------------------------------------------------------------
+
+\expandafter\edef\csname SYS@savedatcatcode\endcsname{\number\catcode`\@}
+
+\catcode`\@11
+
+\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\SYS@ver {0.1}
+\SYS@newmacro\SYS@date {2011/02/27}
+\SYS@newmacro\SYS@longdate {27 F\'evrier 2011}
+\SYS@newmacro\SYS@packagename{systeme}
+
+\newtoks\SYS@systemecode
+\newif\ifSYS@firstterm
+\newif\ifSYS@sortvariable
+
+\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}%
+ \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\@empty{}
+ \def\space{ }
+\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}
+
+% 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}
+
+\SYS@newmacro\sysaddeqsign#1{%
+ \saveexpandmode\expandarg
+ \IfSubStr{\expandafter,\SYS@equalsignlist,}{,#1,}
+ \relax
+ {\expandafter\def\expandafter\SYS@equalsignlist\expandafter{\SYS@equalsignlist,#1}}%
+ \restoreexpandmode
+}
+
+% enl\`eve l'item #2 de la sc #1 qui contient une liste
+\SYS@newmacro\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]%
+ }%
+ \relax
+ \restoreexpandmode
+}
+
+\SYS@newmacro\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}%
+}
+
+\SYS@newmacro\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 la liste des signes d'\'egalit\'e
+\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
+ {\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
+ }%
+ {\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
+}
+
+% 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
+ \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
+ \expandafter\let\csname SYS@right@\SYS@eqnumber\endcsname\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
+}
+
+\SYS@newmacro\SYS@assignterm{%
+ \expandafter\SYS@findletter\expandafter{\SYS@currentterm}% trouver le nom de la variable
+ \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 !}%
+ \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
+}
+
+% cherche la premi\`ere lettre minuscule dans #1
+\SYS@newmacro\SYS@findletter#1{%
+ \def\SYS@currentterm{#1}%
+ \saveexploremode\exploregroups
+ \StrLen\SYS@currentterm[\SYS@currentlength]%
+ \let\SYS@letterfound\@empty
+ \SYS@findletter@i\@ne
+ \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
+ \else
+ \ifnum\expandafter`\SYS@currentchar>`z
+ \let\SYS@nextaction\@secondoftwo
+ \else
+ \let\SYS@nextaction\@firstoftwo
+ \fi
+ \fi
+ \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}%
+}
+
+% 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@insertletter@i#1#2#3{%
+ \StrChar#2{#1}[\SYS@currentchar]%
+ \ifx\SYS@currentchar\@empty
+ \def\SYS@nextaction{\expandafter\def\expandafter#2\expandafter{#2#3}}%
+ \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
+ \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
+ \fi
+ \fi
+ \SYS@nextaction
+}
+
+\SYS@newmacro\SYS@addtotok#1{\SYS@systemecode\expandafter{\the\SYS@systemecode#1}}
+
+\SYS@newmacro\SYS@expaddtotok#1{\expandafter\SYS@addtotok\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 + ?
+ \ifnum#2=\@ne% premi\`ere variable ?
+ \let\SYS@nextaction\@gobble
+ \else
+ \ifSYS@firstterm% premier terme de l'\'equation ?'
+ \let\SYS@nextaction\@gobble
+ \else
+ \let\SYS@nextaction\@firstofone
+ \fi
+ \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}%
+ \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@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$}%
+ \fi
+ \SYS@addtotok&%
+ \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$}%
+ \fi
+ \ifnum#1<\SYS@eqnumber
+ \SYS@addtotok\cr
+ \SYS@firsttermtrue
+ \edef\SYS@nextaction{\noexpand\SYS@buildsystem{\number\numexpr#1+1}{1}}%
+ \expandafter\expandafter\expandafter\SYS@nextaction
+ \fi
+ \fi
+}
+
+\SYS@newmacro\systeme{%
+ \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{}%
+}
+
+\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]#2{%
+ \SYS@newmacro\SYS@systeme@iii##1#1##2\@nil{%
+ \ifx\@empty##1\@empty
+ \SYS@addtotok\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
+ \expandafter\SYS@nextaction
+ \fi
+ }%
+ \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
+ \SYS@firsttermtrue
+ \StrChar\SYS@letterlist\@ne[\SYS@firstvariable]% premi\`ere inconnue
+ \SYS@buildsystem11% construire le syst\`eme...
+ \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
+ \endgroup
+}
+
+% 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}%
+ \else
+ \SYS@addtotok{\hfil##&##&##\hfil\null\cr\SYS@strutup}% ajouter 1 colonne pour le signe et une pour le terme de droite
+ \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 le coefficient pour l'espacement interligne
+\SYS@newmacro\syslineskipcoeff#1{\def\SYS@lineskipcoeff{#1}}
+\syslineskipcoeff1%
+
+\catcode`\@\SYS@savedatcatcode\relax
+
+\endinput
+
+######################################################################
+# Historique #
+######################################################################
+
+v0.1 2011/02/27
+ - Premi\`ere version publique sur le CTAN
+---------------------------------------------------------------------- \ No newline at end of file