diff options
author | Karl Berry <karl@freefriends.org> | 2019-02-27 21:55:15 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2019-02-27 21:55:15 +0000 |
commit | 4321008dfa67dc0a102192760d5f491b453c339e (patch) | |
tree | 35da40f37292b12d93d435005497bd847d04792c /Master/texmf-dist/tex/latex/spreadtab | |
parent | 76b6558e0bbc05f62b20a33abec3bfd4e0f693c9 (diff) |
spreadtab (27feb19)
git-svn-id: svn://tug.org/texlive/trunk@50147 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/spreadtab')
-rw-r--r-- | Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty | 1255 |
1 files changed, 663 insertions, 592 deletions
diff --git a/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty b/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty index 4fd9e3137de..3ae130e9fac 100644 --- a/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty +++ b/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty @@ -1,35 +1,147 @@ +% !TeX encoding = ISO-8859-1 % Ce fichier contient le code de l'extension "spreadtab" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \def\STname {spreadtab} % -\def\STver {0.4d} % +\def\STver {0.5} % % % -\def\STdate {2018/01/01} % +\def\STdate {2019/02/27} % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% -------------------------------------------------------------------- -% Author : Christian Tellechea -% Status : Maintained -% Email : unbonpetit@netc.fr -% Package URL: https://www.ctan.org/pkg/spreadtab -% Bug tracker: https://framagit.org/unbonpetit/spreadtab/issues -% Repository : https://framagit.org/unbonpetit/spreadtab/tree/master -% Copyright : Christian Tellechea 2009-2018 -% Licence : Released under the LaTeX Project Public License v1.3c -% or later, see http://www.latex-project.org/lppl.txt -% Files : 1) spreadtab.sty -% 2) spreadtab-fr.tex -% 3) spreadtab-fr.pdf -% 4) spreadtab-en.tex -% 5) spreadtab-en.pdf -% 6) README -% -------------------------------------------------------------------- +% % +% Author : Christian Tellechea % +% Status : Maintained % +% Maintainer : Christian Tellechea % +% Email : unbonpetit@netc.fr % +% Package URL: https://www.ctan.org/pkg/spreadtab % +% Bug tracker: https://framagit.org/unbonpetit/spreadtab/issues % +% Repository : https://framagit.org/unbonpetit/spreadtab/tree/master % +% Copyright : Christian Tellechea 2009-2019 % +% Licence : Released under the LaTeX Project Public License v1.3c % +% or later, see http://www.latex-project.org/lppl.txt % +% Files : 1) spreadtab.sty % +% 2) spreadtab-fr.tex % +% 3) spreadtab-fr.pdf % +% 4) spreadtab-en.tex % +% 5) spreadtab-en.pdf % +% 6) README % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \ProvidesPackage{spreadtab}[\STdate\space v\STver\space Spreadsheet features for table environments (CT)] \NeedsTeXFormat{LaTeX2e} -\RequirePackage{fp}% pour les calculs scientifiques -\RequirePackage{xstring}[2013/07/29]% version n\'ecessaire +\def\ST@cslet#1#2{\expandafter\let\expandafter#1\csname#2\endcsname} +\RequirePackage{xstring}[2013/07/29]% version nécessaire + +% liste des fonctions dont l'argument est numérique +\def\ST@functions@with@num@arg{% + id,fact,ifeq,ifgt,iflt,numtofrshortdate,numtoengshortdate,numtofrlongdate,gcd,lcm,% + numtoenglongdate,numtofrmonth,numtoengmonth,numtofrday,numtoengday} + +% liste des fonctions dont l'argument est un texte +\def\ST@functions@with@text@arg{frshortdatetonum,engshortdatetonum,englongdatetonum,frlongdatetonum,scitodec,tag,row,col,cell,value} + +% liste des fonctions dont l'argument ne doit pas être calculé +\def\ST@functions@no@calc@arg{ifeq,ifgt,iflt,gcd,lcm,value} + +% liste des fonctions dont l'argument est une variable -> il ne faut donc pas aller chercher des références dans l'argument +\def\ST@functions@with@assign@argument{tag,row,col,cell,value} + +% liste des fonctions dont le résultat est un texte +\def\ST@functions@with@textresult{% + numtofrshortdate,numtoengshortdate,numtofrlongdate,numtoenglongdate,% + numtofrmonth,numtoengmonth,numtofrday,numtoengday} + +% liste totale des fonctions +%\edef\ST@functions@list{\ST@functions@with@range@arg,\ST@functions@with@num@arg,\ST@functions@with@text@arg} + +\newif\if@fp \@fpfalse +\newif\if@xfp\@xfpfalse +\newif\if@STfpactive +\def\STusefp {\PackageError\STname{The FP package is not loaded, you cannot select it with \string\STusefp}{Please, read the manual.}} +\def\STusexfp{\PackageError\STname{The xfp package is not loaded, you cannot select it with \string\STusexfp}{Please, read the manual.}} +\DeclareOption{fp}{\@fptrue} +\DeclareOption{xfp}{\@xfptrue} +\DeclareOption*{\PackageWarning{spreadtab}{Unknown "\CurrentOption"}} + +\ProcessOptions\relax +\ifnum0\if@fp1\fi\if@xfp1\fi=0 \@fptrue\fi% charger fp si aucune option +\if@fp\expandafter\@firstofone\else\expandafter\@gobble\fi% car les \fi ne sont pas équilibrés +{ \RequirePackage{fp}% + \def\STusefp{% + \let\STeval\FPeval + \let\STround\FPround + \let\STclip\FPclip + \let\STtrunc\FPtrunc + \let\STadd\FPadd + \let\STmul\FPmul + \let\STdiv\FPdiv + \def\STseed{\FPseed\number\time\number\day\number\month}% + \let\STrandom\FPrandom + \let\STifzero\FPifzero + \let\STifgt\FPifgt + \let\STiflt\FPiflt + \let\STifeq\FPifeq + \let\STifint\FPifint + \def\STifneg##1{\STiflt{##1}{0}}% + \def\ST@functions@with@range@arg{sum,randint,rand,sumprod}% liste des fonctions dont l'argument est une plage ou est vide + \edef\ST@functions@list{\ST@functions@with@range@arg,\ST@functions@with@num@arg,\ST@functions@with@text@arg}% liste totale des fonctions + % Calcule la factorielle du nombre ##1 et met le résultat dans la sc ##2 + \def\ST@func@fact##1##2{% + \edef##2{% + \ifcase##1 1\or1\or2\or6\or24\or120\or720\or5040\or40320\or362880\or3628800\or39916800\or479001600\or + 6227020800\or87178291200\or1307674368000\or20922789888000\or355687428096000\or6402373705728000\else + -1% + \fi}% + }% + \message{\STname\space message: FP calc engine now active}% + \@STfpactivetrue + }% + \STusefp +} +\if@xfp + \RequirePackage{xfp}% + \ExplSyntaxOn + \def\STusexfp{ + \def\STeval##1##2{\edef##1{\fpeval{##2}}} + \def\STround##1##2##3{\edef##1{\fpeval{round(##2,##3)}}} + \def\STclip##1##2{}% + \def\STtrunc##1##2##3{\edef##1{\fpeval{trunc(##2,##3)}}} + \def\STadd##1##2##3{\edef##1{\fpeval{##2+##3}}} + \def\STmul##1##2##3{\edef##1{\fpeval{##2*##3}}} + \def\STdiv##1##2##3{\edef##1{\fpeval{##2/##3}}} + \let\STseed\relax + \def\STrandom##1{\edef##1{\fpeval{rand()}}} + \ST@cslet\ST@iftrue{iftrue}\ST@cslet\ST@iffalse{iffalse} + \def\STifgt##1##2{\fp_compare:nNnTF{##1}>{##2}\ST@iftrue\ST@iffalse} + \def\STiflt##1##2{\fp_compare:nNnTF{##1}<{##2}\ST@iftrue\ST@iffalse} + \def\STifeq##1##2{\fp_compare:nNnTF{##1}={##2}\ST@iftrue\ST@iffalse} + \def\STifint ##1{\fp_compare:nNnTF{##1-trunc(##1,0)}={0}\ST@iftrue\ST@iffalse} + \def\STifzero##1{\STifeq{##1}{0}} + \def\STifneg##1{\STiflt{##1}{0}} + \ifdefined\XeTeXrevision% si on compile avec XeLaTeX + \ifdefined\uniformdeviate\else% avec une version trop ancienne ( < TL13 ?) + \PackageWarning\STname{With this version of XeLaTeX, functions rand and randint are not available} + \fi + \fi + \def\ST@functions@with@range@arg{sum,sumprod} + \edef\ST@functions@list{\ST@functions@with@range@arg,\ST@functions@with@num@arg,\ST@functions@with@text@arg}% liste totale des fonctions + \def\ST@func@fact##1##2{ + \bool_if:nTF{ \fp_compare_p:nNn {##1}>{-1} && \fp_compare_p:nNn {##1-trunc(##1,0)}={0} } + {\def##2{1}\def\ST@factcntt{0} + \fp_do_while:nNnn {\ST@factcntt}<{##1} + {\edef\ST@factcntt{\number\numexpr\ST@factcntt+1} + \edef##2{##2*\ST@factcntt}% + } + \edef##2{\fpeval{##2}} + } + {\ST@fact@outofrange} + } + \message{\STname~message:~xfp~calc~engine~now~active} + \@STfpactivefalse + } + \ExplSyntaxOff + \if@fp\else\expandafter\expandafter\expandafter\STusexfp\fi +\fi \newcount\ST@count \newcount\ST@colcount @@ -43,23 +155,24 @@ \newif\ifST@colortblloaded \AtBeginDocument{\@ifpackageloaded{colortbl}\ST@colortblloadedtrue\ST@colortblloadedfalse} -% D\'efinit le marqueur qui signale le commencement du champ num\'erique +% Définit le marqueur qui signale le commencement du champ numérique \def\STnumericfieldmarker{:=} -% D\'efinit la macro qui va afficher les valeurs num\'eriques dans le tableau +% Définit la macro qui va afficher les valeurs numériques dans le tableau \def\STprintnum#1{#1} -% D\'efinit les caract\`eres entre lesquels doivent entre envelopp\'ees les r\'ef\'erences des cellules +% Définit les caractères entre lesquels doivent entre enveloppées les références des cellules % que l'on veut afficher dans les champs textuels \def\STsetdisplaymarks#1#2{\def\ST@startdisplay{#1}\def\ST@enddisplay{#2}} -\STsetdisplaymarks{<<}{>>}% d\'elimiteurs par d\'efaut +\STsetdisplaymarks{<<}{>>}% délimiteurs par défaut -% d\'efinit le marqueur qui signale une cellule de texte +% définit le marqueur qui signale une cellule de texte \edef\STtextcell{\string @} -% Commande qui permet \'a l'utilisateur de d\'efinir le caract\`ere qui conserve une r\'ef\'erence lors de la copie d'une formule +% Commande qui permet à l'utilisateur de définir le caractère qui conserve une référence lors de la copie d'une formule \AtBeginDocument{\def\STtransposecar{!}} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Messages d'erreur %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -69,99 +182,99 @@ \def\ST@emit@message#1{\ifST@message\message{#1}\fi} -\def\ST@seedoc@i{Please, read the manual.} +\def\STseedoc@i{Please, read the manual.} \def\ST@circular@reference{% \ST@coord@toref\ST@coord \let\ST@deptree\@empty \ST@show@dependance@tree \PackageError\STname{circular reference found in cell \ST@coord!^^J - Here is its dependant cells: \ST@deptree}\ST@seedoc@i + Here is its dependant cells: \ST@deptree}\STseedoc@i } \def\ST@undefined@cell{% \ST@coord@toref\ST@temp@callcell \ST@coord@toref\ST@coord \PackageError\STname{Undefined reference!^^J - Cell \ST@temp@callcell\space contains a reference to an undefined cell: \ST@coord}\ST@seedoc@i + Cell \ST@temp@callcell\space contains a reference to an undefined cell: \ST@coord}\STseedoc@i } \def\ST@zerocodecell@cell{% \ST@coord@toref\ST@temp@callcell \ST@coord@toref\ST@coord \PackageError\STname{A reference to a non-numeric or empty cell is not allowed!^^J - Cell \ST@temp@callcell\space contains a reference to an empty or text cell: \ST@coord}\ST@seedoc@i + Cell \ST@temp@callcell\space contains a reference to an empty or text cell: \ST@coord}\STseedoc@i } -\def\ST@multicol@cell{% +\def\STmulticol@cell{% \ST@coord@toref\ST@temp@callcell \ST@coord@toref\ST@coord \PackageError\STname{Cell \ST@temp@callcell\space contains a reference to a merged - \string\multicolumn\space cell: \ST@coord}\ST@seedoc@i + \string\multicolumn\space cell: \ST@coord}\STseedoc@i } \def\ST@illegal@relativeref{% \edef\ST@temp@callcell{\ST@current@colnumber,\ST@current@rownumber}% \ST@coord@toref\ST@temp@callcell - \PackageError\STname{Illegal relative reference found in cell \ST@temp@callcell!}\ST@seedoc@i + \PackageError\STname{Illegal relative reference found in cell \ST@temp@callcell!}\STseedoc@i } -\def\ST@illegal@ref{\PackageError\STname{Illegal reference in \string\STsavecell!}\ST@seedoc@i} +\def\ST@illegal@ref{\PackageError\STname{Illegal reference in \string\STsavecell!}\STseedoc@i} \def\ST@unmatch@matrixdim{% \edef\ST@temp@callcell{\ST@current@colnumber,\ST@current@rownumber}% \ST@coord@toref\ST@temp@callcell - \PackageError\STname{Somprod dimension of matrix do not match in cell \ST@temp@callcell!}\ST@seedoc@i + \PackageError\STname{Somprod dimension of matrix do not match in cell \ST@temp@callcell!}\STseedoc@i } -\def\ST@fact@outofrange{\PackageError\STname{Argument of fact is not integer or is out of range!}\ST@seedoc@i} +\def\ST@fact@outofrange{\PackageError\STname{Argument of fact is not integer or is out of range!}\STseedoc@i} \def\ST@invalid@date{% \edef\ST@temp@callcell{\ST@current@colnumber,\ST@current@rownumber}% \ST@coord@toref\ST@temp@callcell - \PackageError\STname{Invalid date in cell \ST@temp@callcell.}\ST@seedoc@i + \PackageError\STname{Invalid date in cell \ST@temp@callcell.}\STseedoc@i } \def\ST@invalid@range{% \edef\ST@temp@callcell{\ST@current@colnumber,\ST@current@rownumber}% \ST@coord@toref\ST@temp@callcell - \PackageError\STname{Invalid range in cell \ST@temp@callcell.}\ST@seedoc@i + \PackageError\STname{Invalid range in cell \ST@temp@callcell.}\STseedoc@i } \def\ST@invalidSTcopy{% \edef\ST@temp@callcell{\ST@current@colnumber,\ST@current@rownumber}% \ST@coord@toref\ST@temp@callcell - \PackageError\STname{Numeric field marker found, \string\STcopy\space forbidden in cell \ST@temp@callcell.}\ST@seedoc@i + \PackageError\STname{Numeric field marker found, \string\STcopy\space forbidden in cell \ST@temp@callcell.}\STseedoc@i } \def\ST@unknown@tag{% \edef\ST@temp@callcell{\ST@current@colnumber,\ST@current@rownumber}% \ST@coord@toref\ST@temp@callcell - \PackageError\STname{Undefined tag in cell \ST@temp@callcell.}\ST@seedoc@i + \PackageError\STname{Undefined tag in cell \ST@temp@callcell.}\STseedoc@i } -\def\ST@intarg@required{\PackageError\STname{Macro function randint require integer argument}\ST@seedoc@i} +\def\ST@intarg@required{\PackageError\STname{Macro function randint require integer argument}\STseedoc@i} -% transforme la chaine de cellules "(1,3)(4,5)(3,2)(1,3)" rencontr\'e en r\'ef\'erence circulaire en "A3-D5-C2-A3" +% transforme la chaine de cellules "(1,3)(4,5)(3,2)(1,3)" rencontré en référence circulaire en "A3-D5-C2-A3" \def\ST@show@dependance@tree{% \ST@between\ST@dependance@tree()\ST@currentref \ST@right\ST@dependance@tree)\ST@dependance@tree \ST@coord@toref\ST@currentref \ST@expadd@tomacro\ST@deptree\ST@currentref \unless\ifx\@empty\ST@dependance@tree - \ST@add@tomacro\ST@deptree-% + \STadd@tomacro\ST@deptree-% \expandafter\ST@show@dependance@tree \fi } -% transforme la s\'equence de contr\^ole #1 qui contient par exemple «4,5» en «D5» +% transforme la séquence de contrôle #1 qui contient par exemple «4,5» en «D5» \def\ST@coord@toref#1{% \ST@split#1,\ST@temp@a#1% \edef#1{\ifcase\ST@temp@a\or A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or K\or L\or M\or N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\fi#1}% } -\def\ST@illegal@copy{\PackageError\STname{Illegal reference in copied formula!}\ST@seedoc@i} +\def\ST@illegal@copy{\PackageError\STname{Illegal reference in copied formula!}\STseedoc@i} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% Macros d'affectation et d'expansion %%%%%%%%%%%%%%%%%%%%% @@ -175,16 +288,16 @@ \ST@tmp@ } -\def\ST@add@tomacro#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}} +\def\STadd@tomacro#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}} -\def\ST@expadd@tomacro#1#2{\expandafter\ST@add@tomacro\expandafter#1\expandafter{#2}} +\def\ST@expadd@tomacro#1#2{\expandafter\STadd@tomacro\expandafter#1\expandafter{#2}} \def\ST@edefadd@tomacro#1#2{\edef#1{\unexpanded\expandafter{#1}#2}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%% Macros de manipulation de chaines %%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\def\ST@gobble@remain{% mange tous jusqu'à \ST@nil. Méthode LENTE privilégiée car il peut y avoir des ) de catcode 2 isolées +\def\ST@gobble@remain{% mange tous jusqu'à \ST@nil. Méthode LENTE privilégiée car il peut y avoir des ) de catcode 2 isolées \afterassignment\ST@gobble@remain@i \let\ST@toks= } @@ -195,7 +308,7 @@ \expandafter\ST@splitatfirstcar@i#1\@nil } -% dans la sc #1, remplace le . par le s\'eparateur d\'ecimal +% dans la sc #1, remplace le . par le séparateur décimal \def\ST@substdecsep#1{% \ST@Ifinstr#1. {\expandafter\ST@substdecsep@i\expandafter#1\expandafter{\ST@decsep}} @@ -206,24 +319,24 @@ \expandafter\ST@substdecsep@ii#1\@nil } -% enl\`eve tous les espaces de la sc #1 et assigne le r\'esultat \'a #1 +% enlève tous les espaces de la sc #1 et assigne le résultat à #1 \def\ST@remove@firST@spaces#1{% \IfBeginWith#1\space {\StrGobbleLeft#11[#1]\ST@remove@firST@spaces{#1}}% {}% } -\def\ST@keep@firstcar#1{% on ne garde dans la sc #1 que le 1er caract\`ere de la sc #1 ou on enl\`eve les accolades +\def\ST@keep@firstcar#1{% on ne garde dans la sc #1 que le 1er caractère de la sc #1 ou on enlève les accolades \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter#1\expandafter\expandafter\expandafter{\expandafter\@car#1\@nil}% } -\def\ST@firstarg@after#1#2#3{% assigne \'a la sc #3 l'argument qui suit #2 dans le d\'eveloppement de la sc #1 +\def\ST@firstarg@after#1#2#3{% assigne à la sc #3 l'argument qui suit #2 dans le développement de la sc #1 \def\ST@firstarg@after@i##1#2##2##3\@nil{\def#3{##2}}% \expandafter\ST@firstarg@after@i#1\@nil } -\def\ST@thirdarg@after#1#2#3{% assigne \'a la sc #3 le 3\`e argument qui suit #2 dans le d\'eveloppement de la sc #1 +\def\ST@thirdarg@after#1#2#3{% assigne à la sc #3 le 3è argument qui suit #2 dans le développement de la sc #1 \def\ST@thirdarg@after@i##1#2##2##3##4##5\@nil{\def#3{##4}}% \expandafter\ST@thirdarg@after@i#1\@nil } @@ -235,7 +348,7 @@ \ST@Ifinstr@ii#1\@@nil#2\@nil } -% Est ce que la sc #1 commence par les caract\`eres #2 ? +% Est ce que la sc #1 commence par les caractères #2 ? \def\ST@Iffirstis#1#2{% \expandafter\ST@Ifinstr@i\expandafter{#1}{#2}% {\def\ST@Iffirstis@i##1#2##2\@nil{% @@ -246,34 +359,34 @@ \expandafter\ST@Iffirstis@i#1\@@nil#2\@nil } -% Coupe la sc #1 au caract\`ere #2 -% ce qui est avant est assign\'e \'a #3 et ce qui est apr\`es \'a #4 +% Coupe la sc #1 au caractère #2 +% ce qui est avant est assigné à #3 et ce qui est après à #4 \def\ST@split#1#2#3#4{% \def\ST@split@i##1#2##2\@nil{\def#3{##1}\def#4{##2}}% \expandafter\ST@split@i#1\@nil } -% Dans la sc #1, assigne ce qui est avant le d\'eveloppement de la sc #2 \'a la sc #3 +% Dans la sc #1, assigne ce qui est avant le développement de la sc #2 à la sc #3 \def\ST@left#1#2#3{\ST@exp@two@args\ST@left@i{#1}{#2}#3} \def\ST@left@i#1#2#3{% \def\ST@left@ii##1#2##2\@nil{\def#3{##1}}% \ST@left@ii#1\@nil } -% Dans la sc #1, assigne ce qui est apr\`es le d\'eveloppement de la sc #2 \'a la sc #3 +% Dans la sc #1, assigne ce qui est après le développement de la sc #2 à la sc #3 \def\ST@right#1#2#3{\ST@exp@two@args\ST@right@i{#1}{#2}#3} \def\ST@right@i#1#2#3{% \def\ST@right@ii##1#2##2\@nil{\def#3{##2}}% \ST@right@ii#1\@nil } -% Dans la sc #1, assigne \'a la sc #4 ce qui est entre les caract\`eres #2 et #3 +% Dans la sc #1, assigne à la sc #4 ce qui est entre les caractères #2 et #3 \def\ST@between#1#2#3#4{% \def\ST@between@i##1#2##2#3##3\@nil{\def#4{##2}}% \expandafter\ST@between@i#1\@nil } -% Dans la sc #1, substitue la premi\`ere occurrence du pattern #2 par le pattern #3 +% Dans la sc #1, substitue la première occurrence du pattern #2 par le pattern #3 \def\ST@subST@once#1#2#3{% \def\ST@subST@once@i##1#2##2\@nil{\def#1{##1#3##2}}% \ST@Ifinstr#1{\@empty#2} @@ -313,11 +426,11 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Lecture du tableau %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% lit le tableau : consid\`ere que \\ s\'epare les lignes +% lit le tableau : considère que \\ sépare les lignes \def\ST@read@tab{% \def\ST@total@colnumber{0}% \ST@rowcount\z@ - \ST@search@hline% on met de c\^ot\'e la (ou les) ligne sup\'erieure du tableau + \ST@search@hline% on met de côté la (ou les) ligne supérieure du tableau \ST@read@tab@i } @@ -326,12 +439,12 @@ \ST@Ifinstr\ST@tab{\ST@eol}% si contient \\, il reste encore des lignes {\expandafter\ST@split\expandafter\ST@tab\expandafter{\ST@eol}\ST@current@row\ST@tab \@namedef{endrow@\number\ST@rowcount\expandafter}\expandafter{\ST@eol}% est la fin de cette ligne, pour l'instant - \ST@Iffirstis\ST@tab[% on prend en compte l'\'eventuel argument optionnel de \\ + \ST@Iffirstis\ST@tab[% on prend en compte l'éventuel argument optionnel de \\ {\ST@between\ST@tab[]\ST@temp@a% prend ce qui est entre crochet - \ST@Ifinstr\ST@temp@a,% si c'est une r\'ef\'erence (on teste juste la pr\'esence de la virgule, ça devrait suffire) + \ST@Ifinstr\ST@temp@a,% si c'est une référence (on teste juste la présence de la virgule, ça devrait suffire) {}% on ne fait rien {\ST@split\ST@tab]\ST@temp@a\ST@tab% sinon, coupe au crocher fermant - \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname{\ST@temp@a]}}% ajoute l'argument optionnel \'a la fin de ligne + \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname{\ST@temp@a]}}% ajoute l'argument optionnel à la fin de ligne }% {}% \ST@search@hline% on va purger les hlines et les mettre dans la fin de ligne @@ -342,16 +455,16 @@ \let\ST@next@readrows\ST@read@tab@i \fi }% - {\let\ST@current@row\ST@tab% plus de ligne ? on prend le tout c-\'a-d la ligne incompl\`ete qui finit le tableau + {\let\ST@current@row\ST@tab% plus de ligne ? on prend le tout c-à-d la ligne incomplète qui finit le tableau \let\ST@next@readrows\relax \edef\ST@total@rownumber{\number\ST@rowcount}}% - \ST@Ifinstr\ST@current@row{\@empty\SThiderow}% il est demand\'e de masquer la colonne ? - {\edef\ST@row@skiplist{(\number\ST@rowcount)\ST@row@skiplist}% on ajoute le num\'ero de ligne \'a masquer \'a la skiplist + \ST@Ifinstr\ST@current@row{\@empty\SThiderow}% il est demandé de masquer la colonne ? + {\edef\ST@row@skiplist{(\number\ST@rowcount)\ST@row@skiplist}% on ajoute le numéro de ligne à masquer à la skiplist \StrDel\ST@current@row{\@empty\SThiderow}[\ST@current@row]% }% {}% \ST@colcount\z@ - \let\ST@multicol@number\@empty + \let\STmulticol@number\@empty \let\ST@nextcell\@empty \ST@read@cells% lit les cellules de la ligne courante \ST@current@row \ST@next@readrows @@ -368,20 +481,20 @@ \ifnum\ST@colcount>\ST@total@colnumber\edef\ST@total@colnumber{\number\ST@colcount}\fi }% \ST@Ifinstr\ST@current@cell{\@empty\SThidecol}% on doit masquer cette colonnes ? - {\ST@Ifinstr\ST@col@skiplist{\expandafter(\number\ST@colcount)}% ça a d\'ej\'a \'et\'e demand\'e ? + {\ST@Ifinstr\ST@col@skiplist{\expandafter(\number\ST@colcount)}% ça a déjà été demandé ? {}% on fait rien - {\edef\ST@col@skiplist{(\number\ST@colcount)\ST@col@skiplist}% sinon -> ajout \'a la skiplist + {\edef\ST@col@skiplist{(\number\ST@colcount)\ST@col@skiplist}% sinon -> ajout à la skiplist \ifnum\ST@colcount>\ST@laST@skipcol\edef\ST@laST@skipcol{\number\ST@colcount}\fi }% \StrDel\ST@current@cell{\@empty\SThidecol}[\ST@current@cell]% }% {}% \exploregroups - \ST@Ifinstr\ST@current@cell{\@empty\multicolumn}% tester la pr\'esence d'un \multicol - {\ST@firstarg@after\ST@current@cell\multicolumn\ST@multicol@number}% - {\let\ST@multicol@number\@empty}% - \IfSubStr\ST@current@cell\STnumericfieldmarker% il y a un marqueur de champ num\'erique ? - {\IfSubStr\ST@current@cell{\@empty\STcopy}\ST@invalidSTcopy{}% s'il y a un \STcopy, erreur (pas de champ num\'erique et de \STcopy dans une m\^eme cellule) + \ST@Ifinstr\ST@current@cell{\@empty\multicolumn}% tester la présence d'un \multicol + {\ST@firstarg@after\ST@current@cell\multicolumn\STmulticol@number}% + {\let\STmulticol@number\@empty}% + \IfSubStr\ST@current@cell\STnumericfieldmarker% il y a un marqueur de champ numérique ? + {\IfSubStr\ST@current@cell{\@empty\STcopy}\ST@invalidSTcopy{}% s'il y a un \STcopy, erreur (pas de champ numérique et de \STcopy dans une même cellule) \StrBehind\ST@current@cell\STnumericfieldmarker[\ST@current@formula]% \noexploregroups \StrChar\ST@current@formula1[\ST@temp@a]% \ST@temp@a contient {<formule} @@ -390,58 +503,58 @@ \ST@expadd@tomacro\ST@temp@b\ST@temp@a \StrSubstitute[1]\ST@current@cell\ST@temp@b\STnumericfieldmarker[\ST@current@cell]% on remplace :={<formule>} par ":=" \noexploregroups - \ST@keep@firstcar\ST@temp@a% dans la formule, on enl\`eve les accolades + \ST@keep@firstcar\ST@temp@a% dans la formule, on enlève les accolades \ST@removespaces\ST@temp@a% et tous les espaces \ifx\ST@temp@a\@empty% \ST@temp@a contient la formule : si la formule est vide \ifx\ST@copylist\@empty% pas de copylist ? - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% met le code \'a 0 + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% met le code à 0 \else% si la copylist existe \ST@lookincopylist{\number\ST@colcount}{\number\ST@rowcount}\ST@celltocopy% on cherche si la cellule en cours est dans une plage de copie \ifx\ST@celltocopy\@empty - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% si c'est non, met le code \'a 0 + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% si c'est non, met le code à 0 \StrDel[1]\ST@current@cell\STnumericfieldmarker[\ST@current@cell]% on supprime aussi ":=" \else - \ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@celltocopy% il y a une cellule \'a copier : on l'assigne au champ num\'erique - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{1}% et on met le code \'a 1 + \ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@celltocopy% il y a une cellule à copier : on l'assigne au champ numérique + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{1}% et on met le code à 1 \fi \fi \else% la formule n'est pas vide - \ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@temp@a% et on assigne \'a la formule - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{1}% code 1 \'a priori + \ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@temp@a% et on assigne à la formule + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{1}% code 1 à priori \fi - }% ci dessous, il n'y a pas de marqueur de champ num\'erique + }% ci dessous, il n'y a pas de marqueur de champ numérique {\IfSubStr\ST@current@cell\STtextcell% si c'est une cellule de texte {\StrDel\ST@current@cell\STtextcell[\ST@current@cell]% on le(s) supprime les flags - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% met le code \'a 0 - }% ci dessous, ce n'est pas une cellule texte, c'est donc une cellule purement champ num\'erique sans marqueur + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% met le code à 0 + }% ci dessous, ce n'est pas une cellule texte, c'est donc une cellule purement champ numérique sans marqueur {\StrDel\ST@current@cell\space[\ST@temp@a]% \ifx\@empty\ST@temp@a% il n'y a que des espaces, c'est donc une cellule vide \ifx\ST@copylist\@empty% pas de copylist ? - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% met le code \'a 0 + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% met le code à 0 \else% si la copylist existe \ST@lookincopylist{\number\ST@colcount}{\number\ST@rowcount}\ST@celltocopy% on cherche si la cellule en cours est dans un oplage de copie \ifx\ST@celltocopy\@empty - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% si c'est non, met le code \'a 0 + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% si c'est non, met le code à 0 \else - \let\ST@current@cell\STnumericfieldmarker% il y a une cellule \'a copier ici - \ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@celltocopy% on l'assigne au champ num\'erique - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{1}% et on met le code \'a 1 + \let\ST@current@cell\STnumericfieldmarker% il y a une cellule à copier ici + \ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@celltocopy% on l'assigne au champ numérique + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{1}% et on met le code à 1 \fi \fi - \else% ici, la cellule est compos\'ee d'une champ num\'erique sans marqueur - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{1}% toute la cellule est consid\'er\'ee comme champ num\'erique + \else% ici, la cellule est composée d'une champ numérique sans marqueur + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{1}% toute la cellule est considérée comme champ numérique \ST@remove@firST@spaces\ST@current@cell \ST@Ifinstr\ST@current@cell{\@empty\STcopy}% {\ST@findcopyargs\ST@current@cell\ST@copyrange\ST@copyformula% on chope les arguments de \STcopy - \ST@seekcopyoffset\ST@copyrange% cherche les d\'ecalages - \edef\ST@copyrange{\ST@hoffest,\ST@voffest}% et affecte sous forme a,b o\`u a et b sont des nombres ou sont vides - \expandafter\def\expandafter\ST@newtocopylist\expandafter{\expandafter|\ST@copyformula|}% \ST@newtocopylist est le nouvel \'el\'ement \'a ajouter \'a la copylist + \ST@seekcopyoffset\ST@copyrange% cherche les décalages + \edef\ST@copyrange{\ST@hoffest,\ST@voffest}% et affecte sous forme a,b où a et b sont des nombres ou sont vides + \expandafter\def\expandafter\ST@newtocopylist\expandafter{\expandafter|\ST@copyformula|}% \ST@newtocopylist est le nouvel élément à ajouter à la copylist \ST@edefadd@tomacro\ST@newtocopylist{[\number\ST@colcount,\number\ST@rowcount]}% \ST@expadd@tomacro\ST@newtocopylist{\expandafter(\ST@copyrange)}% - \ST@expadd@tomacro\ST@newtocopylist\ST@copylist% ajoute la copylist \'a la fin - \let\ST@copylist\ST@newtocopylist% et l'assigne \'a copylist - \ST@transposeformula00\ST@copyformula\ST@copyformula% on transpose \'eventuellement pour g\'erer les "!" - \ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@copyformula% affecte la formule inchang\'ee au champ num\'erique courant + \ST@expadd@tomacro\ST@newtocopylist\ST@copylist% ajoute la copylist à la fin + \let\ST@copylist\ST@newtocopylist% et l'assigne à copylist + \ST@transposeformula00\ST@copyformula\ST@copyformula% on transpose éventuellement pour gérer les "!" + \ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@copyformula% affecte la formule inchangée au champ numérique courant }% {\ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@current@cell% et on assigne toute la cellule \let\ST@current@cell\STnumericfieldmarker% et on met le flag pour la formule @@ -454,10 +567,10 @@ \ST@try@calc@cell(\number\ST@colcount,\number\ST@rowcount)% on essaie de calculer la cellule \fi \ST@letname{text@\number\ST@colcount @\number\ST@rowcount}\ST@current@cell - \unless\ifx\@empty\ST@multicol@number% si c'est une cellule qui contient \multicolumn - \loop% on met tous les codes des cellules fusion\'ees qui suivent la cellule en cours \'a -1 - \ifnum\ST@multicol@number>\@ne - \edef\ST@multicol@number{\number\numexpr\ST@multicol@number-1}% + \unless\ifx\@empty\STmulticol@number% si c'est une cellule qui contient \multicolumn + \loop% on met tous les codes des cellules fusionées qui suivent la cellule en cours à -1 + \ifnum\STmulticol@number>\@ne + \edef\STmulticol@number{\number\numexpr\STmulticol@number-1}% \advance\ST@colcount\@ne \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{-1}% -1 = cellule multicol \repeat @@ -466,7 +579,7 @@ } % On va essayer de purger dans #1 toutes les \hline, \clines, \hhline etc, et ajouter tout ce beau monde -% et leur ev\'entuels arguments dans des sc sp\'eciales (par ex \endrow@3 pour la fin de la 3e ligne.) +% et leur evéntuels arguments dans des sc spéciales (par ex \endrow@3 pour la fin de la 3e ligne.) \def\ST@search@hline{% \ST@ifvalid@csname{endrow@\number\ST@rowcount}% {} @@ -475,53 +588,53 @@ } \def\ST@search@hline@i{% - \ST@remove@firST@spaces\ST@tab% on enl\`eve les espaces au d\'ebut + \ST@remove@firST@spaces\ST@tab% on enlève les espaces au début \StrChar\ST@tab1[\ST@temp@a]% \ST@temp@a est le 1er car \let\ST@next\ST@search@hline@i - \IfStrEqCase\ST@temp@a{% on envisage tous les cas de trac\'e de ligne horizontale - {\@empty\hline}{\StrGobbleLeft\ST@tab1[\ST@tab]\expandafter\ST@add@tomacro\csname endrow@\number\ST@rowcount\endcsname\hline}% + \IfStrEqCase\ST@temp@a{% on envisage tous les cas de tracé de ligne horizontale + {\@empty\hline}{\StrGobbleLeft\ST@tab1[\ST@tab]\expandafter\STadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\hline}% {\@empty\cline}{\StrSplit\ST@tab2\ST@temp@a\ST@tab\expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a}% {\@empty\hhline}{\StrSplit\ST@tab2\ST@temp@a\ST@tab\expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a}% {\@empty\noalign}{\StrSplit\ST@tab2\ST@temp@a\ST@tab\expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a}% {\@empty\toprule}{% les commandes de booktabs - \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lex\`eme : la commande \toprule + \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lexème : la commande \toprule \IfBeginWith\ST@tab[{\StrBefore\ST@tab][\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b]}\StrBehind\ST@tab][\ST@tab]}{}% \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a }% {\@empty\midrule}{% - \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lex\`eme : la commande \midrule + \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lexème : la commande \midrule \IfBeginWith\ST@tab[{\StrBefore\ST@tab][\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b]}\StrBehind\ST@tab][\ST@tab]}{}% \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a }% {\@empty\bottomrule}{% - \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lex\`eme : la commande \bottomrule + \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lexème : la commande \bottomrule \IfBeginWith\ST@tab[{\StrBefore\ST@tab][\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b]}\StrBehind\ST@tab][\ST@tab]}{}% \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a }% {\@empty\cmidrule}{% - \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lex\`eme : la commande \cmidrule + \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lexème : la commande \cmidrule \IfBeginWith\ST@tab[{\StrBefore\ST@tab][\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b]}\StrBehind\ST@tab][\ST@tab]}{}% \IfBeginWith\ST@tab({\StrBefore\ST@tab)[\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b)}\StrBehind\ST@tab)[\ST@tab]}{}% \StrSplit\ST@tab1\ST@temp@b\ST@tab% chope l'argument obligatoire : {a-b} - \ST@expadd@tomacro\ST@temp@a\ST@temp@b% l'ajoute \'a \ST@temp@b - \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a% et on ajoute le tout \'a endrow + \ST@expadd@tomacro\ST@temp@a\ST@temp@b% l'ajoute à \ST@temp@b + \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a% et on ajoute le tout à endrow }% {\@empty\addlinespace}{% - \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lex\`eme : la commande \addlinespace + \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lexème : la commande \addlinespace \IfBeginWith\ST@tab[{\StrBefore\ST@tab][\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b]}\StrBehind\ST@tab][\ST@tab]}{}% \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a }% - {\@empty\morecmidrules}{\StrGobbleLeft\ST@tab1[\ST@tab]\expandafter\ST@add@tomacro\csname endrow@\number\ST@rowcount\endcsname\morecmidrules}% + {\@empty\morecmidrules}{\StrGobbleLeft\ST@tab1[\ST@tab]\expandafter\STadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\morecmidrules}% {\@empty\specialrule}{\StrSplit\ST@tab4\ST@temp@a\ST@tab\expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a}% }[\let\ST@next\relax]% \ST@next } -% Cette macro transpose toutes les r\'ef\'erences (absolues et relatives) de la sc #3. -% Le d\'ecalage est de #1 (nombre sign\'e) pour les colonnes et de #2 (nombre sign\'e) pour les lignes. -% La sc #4 recoit la formule transpos\'ee. +% Cette macro transpose toutes les références (absolues et relatives) de la sc #3. +% Le décalage est de #1 (nombre signé) pour les colonnes et de #2 (nombre signé) pour les lignes. +% La sc #4 recoit la formule transposée. \def\ST@transposeformula#1#2#3#4{% - \def\ST@addcol{#1}\def\ST@addrow{#2}\let\ST@temp@formula#3% + \def\STaddcol{#1}\def\STaddrow{#2}\let\ST@temp@formula#3% \let\ST@transposed@formula\@empty \ST@transposeformula@i \let#4\ST@transposed@formula @@ -530,30 +643,30 @@ \def\ST@transposeformula@i{% \unless\ifx\@empty\ST@temp@formula% tant que l'on n'a pas parcouru \ST@temp@formula \ST@splitatfirstcar\ST@temp@formula\ST@firstcar\ST@temp@formula% prend le 1er car de \ST@temp@formula - \if\expandafter\noexpand\STtransposecar\expandafter\noexpand\ST@firstcar% si ce caract\`ere est un ! - \let\ST@addcol@\z@% pas de tranposition sur la colonne - \ST@splitatfirstcar\ST@temp@formula\ST@firstcar\ST@temp@formula% on prend le premier caract\`ere qui suit le ! + \if\expandafter\noexpand\STtransposecar\expandafter\noexpand\ST@firstcar% si ce caractère est un ! + \let\STaddcol@\z@% pas de tranposition sur la colonne + \ST@splitatfirstcar\ST@temp@formula\ST@firstcar\ST@temp@formula% on prend le premier caractère qui suit le ! \else - \let\ST@addcol@\ST@addcol% sinon, on copie le vecteur + \let\STaddcol@\STaddcol% sinon, on copie le vecteur \fi \expandafter\ST@ifcar@isletter\expandafter{\ST@firstcar}% est-ce que le 1er car est une lettre ? - {\if\expandafter\noexpand\STtransposecar\expandafter\expandafter\expandafter\noexpand\expandafter\@car\ST@temp@formula\@nil% le caract\`ere suivant est un "!" ? - \let\ST@addrow@\z@% pas de tranposition sur la ligne - \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST@temp@formula\expandafter\expandafter\expandafter{\expandafter\@cdr\ST@temp@formula\@nil}% on prend ce qui est apr\`es le ! + {\if\expandafter\noexpand\STtransposecar\expandafter\expandafter\expandafter\noexpand\expandafter\@car\ST@temp@formula\@nil% le caractère suivant est un "!" ? + \let\STaddrow@\z@% pas de tranposition sur la ligne + \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST@temp@formula\expandafter\expandafter\expandafter{\expandafter\@cdr\ST@temp@formula\@nil}% on prend ce qui est après le ! \else - \let\ST@addrow@\ST@addrow% sinon, on copie le vecteur + \let\STaddrow@\STaddrow% sinon, on copie le vecteur \fi \IfInteger\ST@temp@formula{}{}% on prend le nombre qui suit - \ifnum\integerpart>\z@% si ce nombre est plus grand que 0 -> r\'ef\'erence valide - \let\ST@temp@formula\@xs@afterinteger% on prend ce qui est apr\`es le nombre + \ifnum\integerpart>\z@% si ce nombre est plus grand que 0 -> référence valide + \let\ST@temp@formula\@xs@afterinteger% on prend ce qui est après le nombre \expandafter\lowercase\expandafter{\expandafter\def\expandafter\ST@firstcar\expandafter{\ST@firstcar}}% met en minuscules - \edef\ST@firstcar{\number\numexpr\expandafter`\ST@firstcar-`a+1+\ST@addcol@}% est le num\'ero de la colonne + \edef\ST@firstcar{\number\numexpr\expandafter`\ST@firstcar-`a+1+\STaddcol@}% est le numéro de la colonne \ifnum\ST@firstcar<\@ne\ST@illegal@copy\fi% erreur de copie ? \ST@edefadd@tomacro\ST@transposed@formula{% \ifcase\ST@firstcar \or a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m\or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\fi - \number\numexpr\integerpart+\ST@addrow@}% - \ifnum\numexpr\integerpart+\ST@addrow@<\@ne\ST@illegal@copy\fi% erreur de copie ? + \number\numexpr\integerpart+\STaddrow@}% + \ifnum\numexpr\integerpart+\STaddrow@<\@ne\ST@illegal@copy\fi% erreur de copie ? \else \let\ST@temp@formula\@xs@afterinteger \ST@expadd@tomacro\ST@transposed@formula\ST@firstcar @@ -561,25 +674,25 @@ }% {\if[\expandafter\noexpand\ST@firstcar% si le 1er car est [ \ST@left\ST@temp@formula]\ST@temp@ref% on prend ce qui est entre crochet - \ST@right\ST@temp@formula]\ST@temp@formula% pour la suite, on prend ce qui apr\`es le crochet + \ST@right\ST@temp@formula]\ST@temp@formula% pour la suite, on prend ce qui après le crochet \ST@left\ST@temp@ref,\ST@rel@num% ce qui est avant la virgule \if\expandafter\noexpand\STtransposecar\expandafter\expandafter\expandafter\noexpand\expandafter\@car\ST@rel@num\@nil% commence par un "!" ? - \let\ST@addcol@\ST@addcol% compensation pour conserver la cellule initiale - \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST@rel@num\expandafter\expandafter\expandafter{\expandafter\@cdr\ST@rel@num\@nil}% on prend ce qui est apr\`es le ! + \let\STaddcol@\STaddcol% compensation pour conserver la cellule initiale + \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST@rel@num\expandafter\expandafter\expandafter{\expandafter\@cdr\ST@rel@num\@nil}% on prend ce qui est après le ! \else - \let\ST@addcol@\z@% sinon, on n'ajoute rien + \let\STaddcol@\z@% sinon, on n'ajoute rien \fi \IfInteger\ST@rel@num - {\edef\ST@addcol@{\number\numexpr\ST@rel@num-\ST@addcol@}% - \ST@right\ST@temp@ref,\ST@rel@num% ce qui est apr\`es la virgule + {\edef\STaddcol@{\number\numexpr\ST@rel@num-\STaddcol@}% + \ST@right\ST@temp@ref,\ST@rel@num% ce qui est après la virgule \if\expandafter\noexpand\STtransposecar\expandafter\expandafter\expandafter\noexpand\expandafter\@car\ST@rel@num\@nil% commence par un "!"? - \let\ST@addrow@\ST@addrow% on compense pour conserver la cellule initiale - \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST@rel@num\expandafter\expandafter\expandafter{\expandafter\@cdr\ST@rel@num\@nil}% on prend ce qui est apr\`es le ! + \let\STaddrow@\STaddrow% on compense pour conserver la cellule initiale + \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST@rel@num\expandafter\expandafter\expandafter{\expandafter\@cdr\ST@rel@num\@nil}% on prend ce qui est après le ! \else - \let\ST@addrow@\z@% sinon, on n'ajoute rien + \let\STaddrow@\z@% sinon, on n'ajoute rien \fi \IfInteger\ST@rel@num - {\ST@edefadd@tomacro\ST@transposed@formula{[\ST@addcol@,\number\numexpr\ST@rel@num-\ST@addrow@]}% + {\ST@edefadd@tomacro\ST@transposed@formula{[\STaddcol@,\number\numexpr\ST@rel@num-\STaddrow@]}% }% \ST@illegal@relativeref }% @@ -592,8 +705,8 @@ \fi } -% Cherche dans la sc #1 les 3 arguments qui se trouvent apr\`es \STcopy -% Affecte le 1er \'a #2, le 2\`e \'a #3 et le 3\`e \'a #4 +% Cherche dans la sc #1 les 3 arguments qui se trouvent après \STcopy +% Affecte le 1er à #2, le 2è à #3 et le 3è à #4 \def\ST@findcopyargs#1#2#3{% \def\ST@argaftercopy##1\STcopy##2##3##4\@nil{% \def#1{##1}\ST@expadd@tomacro#1{\STnumericfieldmarker##4}% dans #1,supprime \STcopy{<arg1>}{<arg2>} et le remplace par := @@ -642,9 +755,9 @@ \ST@next } -% Regarde dans la liste de copie si la cellule de coodonn\'ees #1 #2 est dans une plage de copie -% si oui, affecte \'a #3 la formule transpos\'ee -% La liste de copy est parcourue de gauche \'a droite avec sortie d\`es qu'une plage qui convient est rencontr\'ee +% Regarde dans la liste de copie si la cellule de coodonnées #1 #2 est dans une plage de copie +% si oui, affecte à #3 la formule transposée +% La liste de copy est parcourue de gauche à droite avec sortie dès qu'une plage qui convient est rencontrée \def\ST@lookincopylist#1#2#3{% \let\ST@alias@copylist\ST@copylist \let\ST@returnedformula\@empty @@ -667,26 +780,26 @@ \ST@next } -% Teste si un \'el\'ement de la copylist contient une plage qui inclus la cellule en cours. +% Teste si un élément de la copylist contient une plage qui inclus la cellule en cours. \def\ST@testfirstincopylist|#1|[#2,#3](#4,#5)#6\@nil{% - \def\ST@alias@copylist{#6}% on enl\`eve le premier \'el\'ement de la copylist - \ST@Ifin\ST@copycol\ST@copyrow[#2,#3](#4,#5)% si ça correspond + \def\ST@alias@copylist{#6}% on enlève le premier élément de la copylist + \ST@Ifin\ST@copycol\ST@copyrow[#2,#3](#4,#5)% si ça correspond {\def\ST@returnedformula{#1}% \ST@transposeformula{\numexpr\ST@copycol-#2}{\numexpr\ST@copyrow-#3}\ST@returnedformula\ST@returnedformula }% {\ifx\@empty#5\@empty\else \ifnum\ST@copyrow>\numexpr#3+#5\relax - \ST@subst\ST@copylist{|#1|[#2,#3](#4,#5)}{}% si on a d\'epass\'e la ligne, on retire ce premier \'el\'ement de la copylist + \ST@subst\ST@copylist{|#1|[#2,#3](#4,#5)}{}% si on a dépassé la ligne, on retire ce premier élément de la copylist \fi \fi }% } -% Cherche dans la sc#1 du type ">4,v9" les d\'ecalages horizontaux et verticaux -% sp\'ecifi\'es avec > et v -% S'il trouve > ou v sans nombre derri\`ere, le d\'ecalage correspondant est vide -% S'il ne trouve pas > ou v, le d\'ecalage correspond est \'egal \'a 0 -% Assigne les d\'ecalages trouv\'es dans \ST@hoffest et \ST@voffest +% Cherche dans la sc#1 du type ">4,v9" les décalages horizontaux et verticaux +% spécifiés avec > et v +% S'il trouve > ou v sans nombre derrière, le décalage correspondant est vide +% S'il ne trouve pas > ou v, le décalage correspond est égal à 0 +% Assigne les décalages trouvés dans \ST@hoffest et \ST@voffest \def\ST@seekcopyoffset#1{% \ST@Ifinstr#1>% {\ST@findcopyoffest#1>\ST@hoffest}% @@ -703,7 +816,7 @@ } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%% Recherche d'une r\'ef\'erence %%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%% Recherche d'une référence %%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % teste si le token #1 est une lettre (majuscule ou minuscule) \def\ST@ifcar@isletter#1{% @@ -715,8 +828,8 @@ \ifnum\numexpr(`#1-`a)*(`#1-`z)\relax>\z@\expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi } -% cherche une r\'ef\'erence du type lettre+nombre dans la sc #1 -% si on trouve, renvoie les coordonn\'ees dans #2 sous la forme x@y +% cherche une référence du type lettre+nombre dans la sc #1 +% si on trouve, renvoie les coordonnées dans #2 sous la forme x@y % si on ne trouve pas, #2 est vide. \def\ST@findref@informula#1#2{% \let\ST@temp@formula#1% @@ -737,13 +850,13 @@ \StrSplit\ST@temp@formula1\ST@firstcar\ST@temp@formula% prend le 1er car de ce qui reste \expandafter\ST@ifcar@isletter\expandafter{\ST@firstcar}% est-ce que le 1er car est une lettre ? {\IfInteger\ST@temp@formula{}{}% on prend le nombre qui suit - \ifnum\integerpart>\z@% si ce nombre est plus grand que 0 -> r\'ef\'erence valide + \ifnum\integerpart>\z@% si ce nombre est plus grand que 0 -> référence valide \let\ST@after@ref@found\@xs@afterinteger - \edef\ST@ref@found{\ST@firstcar\number\integerpart}% est la r\'ef\'erence trouv\'ee - \edef\ST@distant@rownumber{\number\integerpart}% on chope ce nombre pour le num\'ero de colonne + \edef\ST@ref@found{\ST@firstcar\number\integerpart}% est la référence trouvée + \edef\ST@distant@rownumber{\number\integerpart}% on chope ce nombre pour le numéro de colonne \edef\ST@distant@colnumber{\number\numexpr\expandafter`\ST@firstcar-`a+1}% traduction lettre->chiffre \ifnum\ST@distant@colnumber<\z@\edef\ST@distant@colnumber{\number\numexpr\ST@distant@colnumber+32}\fi% met les majuscules en minuscules - \edef\ST@temp@formula{\ST@distant@colnumber @\ST@distant@rownumber}% les coordonn\'ees de la r\'ef\'erence + \edef\ST@temp@formula{\ST@distant@colnumber @\ST@distant@rownumber}% les coordonnées de la référence \let\ST@next@search\relax \fi }% @@ -757,7 +870,7 @@ \ST@right\ST@temp@formula,\ST@rel@num \IfInteger\ST@rel@num {\edef\ST@distant@rownumber{\number\numexpr\ST@current@rownumber+\ST@rel@num}% - \edef\ST@temp@formula{\ST@distant@colnumber @\ST@distant@rownumber}% les coordonn\'ees de la r\'ef\'erence + \edef\ST@temp@formula{\ST@distant@colnumber @\ST@distant@rownumber}% les coordonnées de la référence \let\ST@next@search\relax }% \ST@illegal@relativeref @@ -769,7 +882,7 @@ \ST@next@search } -% cette commande teste si la sc #1 est syntaxiquement une r\'ef\'erence +% cette commande teste si la sc #1 est syntaxiquement une référence \def\ST@ifref#1{% \let\ST@temp@formula#1% \let\ST@ref@found\@empty @@ -787,19 +900,19 @@ } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%% Le noyau : \'evaluation de toutes les cellules %%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%% Le noyau : évaluation de toutes les cellules %%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Essaie de calculer la cellule (#1,#2) \def\ST@try@calc@cell(#1,#2){% - \ST@ifvalid@csname{formula@#1@#2}% on v\'erifie que la formule existe + \ST@ifvalid@csname{formula@#1@#2}% on vérifie que la formule existe {\expandafter\ifx\csname formula@#1@#2\endcsname\@empty - \@namedef{code@#1@#2}{0}% si vide, code \'a 0 + \@namedef{code@#1@#2}{0}% si vide, code à 0 \else% et qu'elle est non vide \def\ST@current@colnumber{#1}\def\ST@current@rownumber{#2}% \expandafter\ST@find@firST@func\csname formula@#1@#2\endcsname% cherche une fonction dans la formule \ifx\@empty\ST@function@namefound% s'il n'y a pas de fonction \expandafter\ST@findref@informula\csname formula@#1@#2\endcsname\ST@coord - \ifx\@empty\ST@coord% ni de r\'ef\'erence + \ifx\@empty\ST@coord% ni de référence \ST@calc@cell(#1,#2)% on va la calculer la cellule \fi \fi @@ -808,39 +921,39 @@ {}% } -\def\ST@calc@cell(#1,#2){% calcule la formule num\'erique de la cellule (#1,#2) +\def\ST@calc@cell(#1,#2){% calcule la formule numérique de la cellule (#1,#2) \unless\ifnum\csname code@#1@#2\endcsname<\@ne% si le code est >= 1 - \expandafter\let\expandafter\ST@temp@a\csname formula@#1@#2\endcsname% \ST@temp@a est le contenu de la formule + \ST@cslet\ST@temp@a{formula@#1@#2}% \ST@temp@a est le contenu de la formule \ST@Iffirstis\ST@temp@a-{\expandafter\def\expandafter\ST@temp@a\expandafter{\expandafter0\ST@temp@a}}{}% - \FPeval\ST@temp@a\ST@temp@a% on calcule cette formule - \unless\ifx\ST@rounddigit\@empty\FPround\ST@temp@a\ST@temp@a\ST@rounddigit\fi% on arrondi s'il faut + \STeval\ST@temp@a\ST@temp@a% on calcule cette formule + \unless\ifx\STrounddigit\@empty\STround\ST@temp@a\ST@temp@a\STrounddigit\fi% on arrondi s'il faut \ifST@clipround% on arrondit en enlevant les 0 inutiles ? - \FPclip\ST@temp@a\ST@temp@a + \STclip\ST@temp@a\ST@temp@a \else% si on laisse certains 0 inutiles - \unless\ifx\ST@rounddigit\@empty% on ne tronque que si le nombre n'est pas vide - \FPtrunc\ST@temp@a\ST@temp@a\ST@rounddigit + \unless\ifx\STrounddigit\@empty% on ne tronque que si le nombre n'est pas vide + \STtrunc\ST@temp@a\ST@temp@a\STrounddigit \fi \fi - \ST@letname{formula@#1@#2}\ST@temp@a% assigne le r\'esultat \'a la formule - \@namedef{code@#1@#2}{2}% et met le code \'a 2 (cellule calcul\'ee) + \ST@letname{formula@#1@#2}\ST@temp@a% assigne le résultat à la formule + \@namedef{code@#1@#2}{2}% et met le code à 2 (cellule calculée) \fi } % Calcule toutes les formules du tableau -\def\ST@eval@tab{% +\def\STeval@tab{% \ST@rowcount\@ne\ST@colcount\@ne - \ST@eval@tab@i + \STeval@tab@i } -\def\ST@eval@tab@i{% +\def\STeval@tab@i{% \ifnum\ST@rowcount>\ST@total@rownumber \let\ST@nextcell\relax \else \ST@ifvalid@csname{formula@\number\ST@colcount @\number\ST@rowcount}% si la formule existe - {\ST@eval@cell(\number\ST@colcount,\number\ST@rowcount)}% on la calcule + {\STeval@cell(\number\ST@colcount,\number\ST@rowcount)}% on la calcule {}% \advance\ST@colcount\@ne - \let\ST@nextcell\ST@eval@tab@i + \let\ST@nextcell\STeval@tab@i \ifnum\ST@colcount>\ST@total@colnumber \ST@colcount\@ne \advance\ST@rowcount\@ne @@ -850,7 +963,7 @@ } % la sc #1 est le nom d'une fonction. -% La macro renvoie dans la sc #2 : 1, 2 ou 2 selon que #1 est le nom d'une macro \'a argument num\'erique, \'a argument plage ou \'a argument texte. +% La macro renvoie dans la sc #2 : 1, 2 ou 2 selon que #1 est le nom d'une macro à argument numérique, à argument plage ou à argument texte. % #2 est vaut 0 si #1 n'est pas le nom d'une fonction \def\ST@determine@function@code#1#2{% \ST@Ifinstr{\ST@functions@with@num@arg,}{#1,}% @@ -864,12 +977,12 @@ }% } -% \'Evalue la cellule (#1#2) par ses coordonn\'ees num\'eriques (col,row) -\def\ST@eval@cell(#1,#2){% +% évalue la cellule (#1#2) par ses coordonnées numériques (col,row) +\def\STeval@cell(#1,#2){% \edef\ST@dependance@tree{(#1,#2)}% FIXME : mettre \edef \let\ST@stackcall\@empty \let\ST@function@namesaved\@empty - \ST@eval@cell@i(#1,#2)% on appelle la macro r\'ecursive + \STeval@cell@i(#1,#2)% on appelle la macro récursive \ifST@message \let\ST@deptree\@empty \ST@show@dependance@tree @@ -878,88 +991,88 @@ \fi } -% Ceci est la macro principale : elle \'evalue la cellule (#1,#2) -\def\ST@eval@cell@i(#1,#2){% #1 = no colonne #2 = no ligne - \ifnum\csname code@#1@#2\endcsname=\@ne% on ne fait quelque chose que si le code est 1 : cellule non calcul\'ee +% Ceci est la macro principale : elle évalue la cellule (#1,#2) +\def\STeval@cell@i(#1,#2){% #1 = no colonne #2 = no ligne + \ifnum\csname code@#1@#2\endcsname=\@ne% on ne fait quelque chose que si le code est 1 : cellule non calculée \def\ST@current@colnumber{#1}\def\ST@current@rownumber{#2}% \expandafter\ST@find@firST@func\csname formula@#1@#2\endcsname% cherche une fonction dans la formule \ifx\@empty\ST@function@namefound% il n'y a pas de fonction \IfSubStr[2]\ST@dependance@tree{(#1,#2)}% - {\edef\ST@coord{#1,#2}\ST@circular@reference}% message et on s'arr\^ete si r\'ef\'erence circulaire + {\edef\ST@coord{#1,#2}\ST@circular@reference}% message et on s'arrête si référence circulaire {}% - \expandafter\ST@findref@informula\csname formula@#1@#2\endcsname\ST@coord% y a t-il une r\'ef\'erence dans l'argument ? - \ifx\ST@coord\@empty% pas de r\'ef\'erence dans l'argument - \ifx\ST@function@namesaved\@empty% si aucune fonction n'a \'et\'e d\'ecel\'ee + \expandafter\ST@findref@informula\csname formula@#1@#2\endcsname\ST@coord% y a t-il une référence dans l'argument ? + \ifx\ST@coord\@empty% pas de référence dans l'argument + \ifx\ST@function@namesaved\@empty% si aucune fonction n'a été décelée \ST@calc@cell(#1,#2)% on calcule la cellule en cours \else - \ST@Ifinstr{\ST@functions@with@textresult,}{\ST@function@namesaved,}% si la derni\`ere fonction rend du texte + \ST@Ifinstr{\ST@functions@with@textresult,}{\ST@function@namesaved,}% si la dernière fonction rend du texte {\ifx\ST@stackcall\@empty% et si on est dans la cellule source - \@namedef{code@#1@#2}{0}% on met le code \'a 0, la cellule devient textuelle + \@namedef{code@#1@#2}{0}% on met le code à 0, la cellule devient textuelle \exploregroups \expandafter\StrSubstitute\expandafter[\expandafter\@ne\expandafter]\csname text@#1@#2\expandafter\endcsname\expandafter\STnumericfieldmarker\csname formula@#1@#2\expandafter\endcsname\expandafter[\csname text@#1@#2\endcsname]% copie de la formule vers la zone texte \noexploregroups \ST@letname{formula@#1@#2}\@empty% et plus rien dans la formule \else - \ST@calc@cell(#1,#2)% sinon, on se trouve dans une cellule appel\'ee par une macrofonction et donc, on la calcule + \ST@calc@cell(#1,#2)% sinon, on se trouve dans une cellule appelée par une macrofonction et donc, on la calcule \fi }% - {\ST@calc@cell(#1,#2)}% c'est une fonction qui donne un arg num\'erique : on calcule la cellule en cours + {\ST@calc@cell(#1,#2)}% c'est une fonction qui donne un arg numérique : on calcule la cellule en cours \fi \else \ST@ifvalid@csname{code@\ST@coord}% le code distant exite ? {\ifcase\csname code@\ST@coord\endcsname% code distant = 0 ==> cellule vide ou textuelle, pas bon du tout ! - \edef\ST@temp@callcell{#1,#2}% coordonn\'ees de la cellule appelante - \edef\ST@coord{\ST@distant@colnumber,\ST@distant@rownumber}% coordonn\'ees appel\'ees - \ST@zerocodecell@cell% erreur : r\'ef\'erence \'a une cellule de code 0 + \edef\ST@temp@callcell{#1,#2}% coordonnées de la cellule appelante + \edef\ST@coord{\ST@distant@colnumber,\ST@distant@rownumber}% coordonnées appelées + \ST@zerocodecell@cell% erreur : référence à une cellule de code 0 \or% code distant = 1 - \edef\ST@dependance@tree{\ST@dependance@tree(\ST@distant@colnumber,\ST@distant@rownumber)}% on l'ajoute \'a l'arbre des d\'ependances - % on doit \'evaluer cette formule distante et ensuite, on doit encore recommence avec la formule en cours : on les ajoute sur la pile lifo + \edef\ST@dependance@tree{\ST@dependance@tree(\ST@distant@colnumber,\ST@distant@rownumber)}% on l'ajoute à l'arbre des dépendances + % on doit évaluer cette formule distante et ensuite, on doit encore recommence avec la formule en cours : on les ajoute sur la pile lifo \edef\ST@stackcall{(\ST@distant@colnumber,\ST@distant@rownumber)(#1,#2)\ST@stackcall}% - \or% code distant = 2, la cellule distante est calcul\'ee, on cr\'e\'e un alias pour le contenu de la formule distante - \expandafter\let\expandafter\ST@distant@formula\csname formula@\ST@coord\endcsname - % si la valeur distante est <0, on la met entre parenth\`eses + \or% code distant = 2, la cellule distante est calculée, on créé un alias pour le contenu de la formule distante + \ST@cslet\ST@distant@formula{formula@\ST@coord}% + % si la valeur distante est <0, on la met entre parenthèses \ST@Iffirstis\ST@distant@formula-% {\expandafter\def\expandafter\ST@distant@formula\expandafter{\expandafter(\ST@distant@formula)}}% {}% - % on remplace toutes les r\'ef\'erences par la valeur distante + % on remplace toutes les références par la valeur distante \expandafter\ST@expsubst\csname formula@#1@#2\endcsname{\ST@ref@found|}\ST@distant@formula - \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on \'evalue \'a nouveau cette cellule + \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule \else% code distant n'est pas {0,1,2} donc est -1, pas bon du tout ! - \edef\ST@temp@callcell{#1,#2}% coordonn\'ees de la cellule appelante - \ST@subst\ST@coord @,% coordonn\'ees appel\'ees - \ST@multicol@cell + \edef\ST@temp@callcell{#1,#2}% coordonnées de la cellule appelante + \ST@subst\ST@coord @,% coordonnées appelées + \STmulticol@cell \fi}% - {\edef\ST@temp@callcell{#1,#2}% coordonn\'ees de la cellule appelante - \ST@subst\ST@coord @,% coordonn\'ees appel\'ees + {\edef\ST@temp@callcell{#1,#2}% coordonnées de la cellule appelante + \ST@subst\ST@coord @,% coordonnées appelées \ST@undefined@cell% code distant inexistant -> cellule hors limite du tableau }% \fi \else% il y a une fonction dans la formule \let\ST@function@namesaved\ST@function@namefound - \ST@determine@function@code\ST@function@namefound\ST@codefunc% d\'etermine le code de la fonction + \ST@determine@function@code\ST@function@namefound\ST@codefunc% détermine le code de la fonction \ifcase\ST@codefunc\relax \PackageError\STname{This error should not occur! Please email the author. Thanks.}{}% - \or% le code vaut 1, c'est une fonction \'a argument num\'erique - \ST@findref@informula\ST@function@argfound\ST@temp@formula% y a t-il une r\'ef\'erence dans l'argument de la formule ? - \ifx\ST@temp@formula\@empty% pas de r\'ef\'erence dans l'argument de la fonction - \expandafter\let\expandafter\ST@current@formula\csname formula@#1@#2\endcsname% alias pour la formule + \or% le code vaut 1, c'est une fonction à argument numérique + \ST@findref@informula\ST@function@argfound\ST@temp@formula% y a t-il une référence dans l'argument de la formule ? + \ifx\ST@temp@formula\@empty% pas de référence dans l'argument de la fonction + \ST@cslet\ST@current@formula{formula@#1@#2}% alias pour la formule \let\ST@tobereplaced\ST@function@namefound - \ST@expadd@tomacro\ST@tobereplaced{\expandafter(\ST@function@argfound)}% ce qui va \^etre replac\'e : fonction(argument) + \ST@expadd@tomacro\ST@tobereplaced{\expandafter(\ST@function@argfound)}% ce qui va être replacé : fonction(argument) \ST@Ifinstr{\ST@functions@no@calc@arg,}{\ST@function@namefound,}% doit-on calculer l'argument de cette fonction ? {}% - {\FPeval\ST@function@argfound\ST@function@argfound\FPclip\ST@function@argfound\ST@function@argfound}% - \csname ST@func@\ST@function@namefound\endcsname\ST@function@argfound\ST@result@func% puis on \'evalue la fonctionfound + {\STeval\ST@function@argfound\ST@function@argfound\STclip\ST@function@argfound\ST@function@argfound}% + \csname ST@func@\ST@function@namefound\endcsname\ST@function@argfound\ST@result@func% puis on évalue la fonctionfound \ST@Iffirstis\ST@result@func-{\expandafter\def\expandafter\ST@result@func\expandafter{\expandafter(\ST@result@func)}}{}% \ST@expsubst\ST@current@formula\ST@tobereplaced\ST@result@func% on replace dans l'alias \ST@letname{formula@#1@#2}\ST@current@formula% on l'assigne dans la formule - \ifx\@empty\ST@current@formula% pour cause de macro fonction "tag" qui est seule et qui a disparue apr\`es substitution + \ifx\@empty\ST@current@formula% pour cause de macro fonction "tag" qui est seule et qui a disparue après substitution \@namedef{code@#1@#2}{0}% \else - \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on \'evalue \'a nouveau cette cellule + \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule \fi \else - \ifnum\csname code@\ST@temp@formula\endcsname=\tw@% si la r\'ef\'erence est calcul\'ee, on la replace par sa valeur - \expandafter\let\expandafter\ST@current@formula\csname formula@\ST@temp@formula\endcsname% alias pour la formule distante + \ifnum\csname code@\ST@temp@formula\endcsname=\tw@% si la référence est calculée, on la replace par sa valeur + \ST@cslet\ST@current@formula{formula@\ST@temp@formula}% alias pour la formule distante \ST@Iffirstis\ST@current@formula-% {\expandafter\def\expandafter\ST@current@formula\expandafter{\expandafter(\ST@current@formula)}}% {}% @@ -970,47 +1083,47 @@ \ST@subst\ST@tobereplaced|{}% \expandafter\ST@expsubst\csname formula@#1@#2\endcsname\ST@tobereplaced\ST@replaced \edef\ST@stackcall{(#1,#2)\ST@stackcall}% - \else% la r\'ef\'erence n'est pas calcul\'ee, donc d'abord il faut - \edef\ST@stackcall{(\ST@distant@colnumber,\ST@distant@rownumber)(#1,#2)\ST@stackcall}% l'\'evaluer, et ensuite r\'e-evaluer la cellule courante - \edef\ST@dependance@tree{\ST@dependance@tree(\ST@distant@colnumber,\ST@distant@rownumber)}% mise \'a jour de l'arbre des d\'ependances + \else% la référence n'est pas calculée, donc d'abord il faut + \edef\ST@stackcall{(\ST@distant@colnumber,\ST@distant@rownumber)(#1,#2)\ST@stackcall}% l'évaluer, et ensuite ré-evaluer la cellule courante + \edef\ST@dependance@tree{\ST@dependance@tree(\ST@distant@colnumber,\ST@distant@rownumber)}% mise à jour de l'arbre des dépendances \fi \fi - \or% le code vaut 2, c'est une fonction \'a argument «plage de cellules» + \or% le code vaut 2, c'est une fonction à argument «plage de cellules» \let\ST@tobereplaced\ST@function@namefound\ST@expadd@tomacro\ST@tobereplaced{\expandafter(\ST@function@argfound)}% - \csname ST@func@\ST@function@namefound\endcsname\ST@function@argfound\ST@result@func% puis on essaie d'\'evaluer la fonction + \csname ST@func@\ST@function@namefound\endcsname\ST@function@argfound\ST@result@func% puis on essaie d'évaluer la fonction \unless\ifx\ST@result@func\@empty% si le calcul a abouti \ST@Iffirstis\ST@result@func-{\expandafter\def\expandafter\ST@result@func\expandafter{\expandafter(\ST@result@func)}}{}% \expandafter\ST@expsubst\csname formula@#1@#2\endcsname\ST@tobereplaced\ST@result@func% on replace dans la formule - \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on \'evalue \'a nouveau cette cellule + \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule \fi \or% le code vaut 3, c'est un fonction dont l'argument est textuel \let\ST@function@argfound@edefed\ST@function@argfound \ST@Ifinstr{\ST@functions@with@assign@argument,}{\ST@function@namefound,}% {\let\ST@temp@formula\@empty}% - {\ST@findref@informula\ST@function@argfound\ST@temp@formula}% y a t-il une r\'ef\'erence dans l'argument de la fonction ? - \ifx\ST@temp@formula\@empty% pas de r\'ef\'erence dans l'argument de la fonction - \expandafter\let\expandafter\ST@current@formula\csname formula@#1@#2\endcsname% alias pour la formule + {\ST@findref@informula\ST@function@argfound\ST@temp@formula}% y a t-il une référence dans l'argument de la fonction ? + \ifx\ST@temp@formula\@empty% pas de référence dans l'argument de la fonction + \ST@cslet\ST@current@formula{formula@#1@#2}% alias pour la formule \let\ST@tobereplaced\ST@function@namefound - \ST@expadd@tomacro\ST@tobereplaced{\expandafter(\ST@function@argfound)}% ce qui va \^etre remplac\'e : fonction(argument) - \csname ST@func@\ST@function@namefound\endcsname\ST@function@argfound@edefed\ST@result@func% puis on \'evalue la fonction + \ST@expadd@tomacro\ST@tobereplaced{\expandafter(\ST@function@argfound)}% ce qui va être remplacé : fonction(argument) + \csname ST@func@\ST@function@namefound\endcsname\ST@function@argfound@edefed\ST@result@func% puis on évalue la fonction \ST@expsubst\ST@current@formula\ST@tobereplaced\ST@result@func% on replace dans l'alias \ST@letname{formula@#1@#2}\ST@current@formula% on l'assigne dans la formule - \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on \'evalue \'a nouveau cette cellule - \else% il y a une r\'ef\'erence dans l'argument de la fontion - \ifnum\csname code@\ST@temp@formula\endcsname=\z@% si la r\'ef\'erence est une cellule texte - \expandafter\let\expandafter\ST@current@formula\csname text@\ST@temp@formula\endcsname% alias pour la zone texte distante - \StrDel[1]\ST@current@formula\STnumericfieldmarker[\ST@current@formula]% on enl\`eve le := si besoin + \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule + \else% il y a une référence dans l'argument de la fontion + \ifnum\csname code@\ST@temp@formula\endcsname=\z@% si la référence est une cellule texte + \ST@cslet\ST@current@formula{text@\ST@temp@formula}% alias pour la zone texte distante + \StrDel[1]\ST@current@formula\STnumericfieldmarker[\ST@current@formula]% on enlève le := si besoin \ST@Ifinstr\ST@current@formula{\@empty\multicolumn}% on ne prend que le texte s'il y a un \multicolumn qui traine {\ST@thirdarg@after\ST@current@formula\multicolumn\ST@current@formula} {}% \let\ST@tobereplaced\ST@function@namefound \ST@expadd@tomacro\ST@tobereplaced{\expandafter(\ST@function@argfound)}% \ST@subst\ST@tobereplaced|{}% - \csname ST@func@\ST@function@namefound\endcsname\ST@current@formula\ST@result@func% puis on \'evalue la fonction + \csname ST@func@\ST@function@namefound\endcsname\ST@current@formula\ST@result@func% puis on évalue la fonction \expandafter\ST@expsubst\csname formula@#1@#2\endcsname\ST@tobereplaced\ST@result@func - \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on \'evalue \'a nouveau cette cellule + \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule \else - \PackageError\STname{Macro function \ST@function@namefound\space requires a reference to a text cell!}\ST@seedoc@i + \PackageError\STname{Macro function \ST@function@namefound\space requires a reference to a text cell!}\STseedoc@i \fi \fi \fi @@ -1020,18 +1133,18 @@ } % On regarde s'il y a des appels de calcul de cellules en attente -% Si oui, on enl\`eve le 1er appel de la pile lifo et on l'ex\'ecute +% Si oui, on enlève le 1er appel de la pile lifo et on l'exécute \def\ST@next@onstack{% \unless\ifx\ST@stackcall\@empty \ST@split\ST@stackcall)\ST@temp@a\ST@stackcall - \ST@add@tomacro\ST@temp@a)% + \STadd@tomacro\ST@temp@a)% \ST@sanitize@stack - \expandafter\def\expandafter\ST@temp@a\expandafter{\expandafter\ST@eval@cell@i\ST@temp@a}% + \expandafter\def\expandafter\ST@temp@a\expandafter{\expandafter\STeval@cell@i\ST@temp@a}% \expandafter\ST@temp@a \fi } -\def\ST@sanitize@stack{% enl\`eve de \ST@stackcall toutes les occurrences de \ST@temp@a +\def\ST@sanitize@stack{% enlève de \ST@stackcall toutes les occurrences de \ST@temp@a \ST@Ifinstr\ST@stackcall\ST@temp@a {\expandafter\ST@subst\expandafter\ST@stackcall\expandafter{\ST@temp@a}{}% \ST@sanitize@stack @@ -1043,39 +1156,14 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Macro-fonctions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% liste des fonctions dont l'argument est num\'erique -\def\ST@functions@with@num@arg{% - id,fact,ifeq,ifgt,iflt,numtofrshortdate,numtoengshortdate,numtofrlongdate,gcd,lcm,% - numtoenglongdate,numtofrmonth,numtoengmonth,numtofrday,numtoengday} - -% liste des fonctions dont l'argument est une plage ou est vide -\def\ST@functions@with@range@arg{sum,rand,randint,sumprod} - -% liste des fonctions dont l'argument est un texte -\def\ST@functions@with@text@arg{frshortdatetonum,engshortdatetonum,englongdatetonum,frlongdatetonum,scitodec,tag,row,col,cell,value} - -% liste des fonctions dont l'argument ne doit pas \^etre calcul\'e -\def\ST@functions@no@calc@arg{ifeq,ifgt,iflt,gcd,lcm,value} - -% liste des fonctions dont l'argument est une variable -> il ne faut donc pas aller chercher des r\'ef\'erences dans l'argument -\def\ST@functions@with@assign@argument{tag,row,col,cell,value} - -% liste des fonctions dont le r\'esultat est un texte -\def\ST@functions@with@textresult{% - numtofrshortdate,numtoengshortdate,numtofrlongdate,numtoenglongdate,% - numtofrmonth,numtoengmonth,numtofrday,numtoengday} - -% liste totale des fonctions -\edef\ST@functions@list{\ST@functions@with@range@arg,\ST@functions@with@num@arg,\ST@functions@with@text@arg} - -\def\ST@for#1#2{% \ST@for{#1}{code} -> ex\'ecute le code pour toutes les cellules des plages pass\'ees en argument #1 +\def\ST@for#1#2{% \ST@for{#1}{code} -> exécute le code pour toutes les cellules des plages passées en argument #1 \def\ST@forcode{#2}% \expandafter\def\expandafter\ST@for@rangelist\expandafter{#1;}% \ST@for@i } -\def\ST@for@loopcode{% #2 est le code \'a ex\'ecuter dans la boucle for - \ST@forcode% on ex\'ecute le code +\def\ST@for@loopcode{% #2 est le code à exécuter dans la boucle for + \ST@forcode% on exécute le code \let\ST@nextfor\ST@for@loopcode \advance\ST@colcount@i\@ne \ifnum\ST@colcount@i>\ST@for@col@end @@ -1117,9 +1205,9 @@ \ST@nextfor } -% Cette macro cherche dans la sc #1 la premi\`ere fonction qu'elle trouve ne contenant pas d'autre fonction dans son argument -% En sortie, \ST@function@namefound contient le nom de la fonction trouv\'ee et \ST@function@argfound son argument. -% Si aucune fonction mot-cl\'e n'est trouv\'e, ces 2 derni\`eres s\'equences de contr\^oles sont vides. +% Cette macro cherche dans la sc #1 la première fonction qu'elle trouve ne contenant pas d'autre fonction dans son argument +% En sortie, \ST@function@namefound contient le nom de la fonction trouvée et \ST@function@argfound son argument. +% Si aucune fonction mot-clé n'est trouvé, ces 2 dernières séquences de contrôles sont vides. \def\ST@find@firST@func#1{% \let\ST@function@namefound\@empty\let\ST@function@argfound\@empty \let\ST@function@namefound@\@empty\let\ST@function@argfound@\@empty @@ -1128,17 +1216,17 @@ } \def\ST@find@firST@func@i{% - \edef\ST@tempfunctions@list{\ST@functions@list,}% r\'einitialise la liste - \let\ST@tempfunc@\ST@tempfunc% sauveagrde pour restauration ult\'erieure - \let\ST@function@namefound\@empty% initialise avant appel \'a la macro - \ST@Ifinstr\ST@tempfunc(% s'il y a une parenth\`ese + \edef\ST@tempfunctions@list{\ST@functions@list,}% réinitialise la liste + \let\ST@tempfunc@\ST@tempfunc% sauveagrde pour restauration ultérieure + \let\ST@function@namefound\@empty% initialise avant appel à la macro + \ST@Ifinstr\ST@tempfunc(% s'il y a une parenthèse {\ST@find@firST@func@ii% cherche la 1ere fonction dans l'argument \ifx\ST@function@namefound\@empty% elle n'existe pas ? - \let\ST@function@namefound\ST@function@namefound@\let\ST@function@argfound\ST@function@argfound@% on restaure les valeurs pr\'ec\'edentes + \let\ST@function@namefound\ST@function@namefound@\let\ST@function@argfound\ST@function@argfound@% on restaure les valeurs précédentes \else% si il y a une fonction dans l'argument - \ST@right\ST@tempfunc@\ST@function@namefound\ST@tempfunc% prend ce qui est apr\`es le nom de la fonction - \ST@seekfunc@arg\ST@tempfunc\ST@function@argfound% isole l'argument entre parenth\`eses - \let\ST@function@namefound@\ST@function@namefound\let\ST@function@argfound@\ST@function@argfound% met \'a jour les valeurs pr\'ec\'edentes + \ST@right\ST@tempfunc@\ST@function@namefound\ST@tempfunc% prend ce qui est après le nom de la fonction + \ST@seekfunc@arg\ST@tempfunc\ST@function@argfound% isole l'argument entre parenthèses + \let\ST@function@namefound@\ST@function@namefound\let\ST@function@argfound@\ST@function@argfound% met à jour les valeurs précédentes \let\ST@tempfunc\ST@function@argfound% recommence avec l'argument \expandafter\ST@find@firST@func@i \fi}% @@ -1147,11 +1235,11 @@ \def\ST@find@firST@func@ii{% \unless\ifx\ST@tempfunc\@empty% tant que le contenu n'est pas vide - \unless\ifx\ST@tempfunctions@list\@empty% et tant que tous les noms de fonctions n'ont pas \'et\'e explor\'es + \unless\ifx\ST@tempfunctions@list\@empty% et tant que tous les noms de fonctions n'ont pas été explorés \ST@split\ST@tempfunctions@list,\ST@current@funcname\ST@tempfunctions@list \ST@Ifinstr\ST@tempfunc{\ST@current@funcname(}% si l'argument contient le nom de fonction courant {\let\ST@function@namefound\ST@current@funcname - \ST@left\ST@tempfunc{\ST@current@funcname(}\ST@tempfunc% on r\'eduit l'argument \'a ce qui est avant ce nom + \ST@left\ST@tempfunc{\ST@current@funcname(}\ST@tempfunc% on réduit l'argument à ce qui est avant ce nom }% {}% \expandafter\expandafter\expandafter\ST@find@firST@func@ii @@ -1159,25 +1247,25 @@ \fi } -% la sc #1 commence normalement (sinon, ça va gueuler) par une parenth\`ese -% La macro trouve l'argument se trouvant entre les parenth\`eses les plus ext\'erieures -% et l'assigne \'a la sc #2 +% la sc #1 commence normalement (sinon, ça va gueuler) par une parenthèse +% La macro trouve l'argument se trouvant entre les parenthèses les plus extérieures +% et l'assigne à la sc #2 \def\ST@seekfunc@arg#1#2{% \begingroup - \everyeof{\ST@nil}% met un \@nil \`a la fin du fichier virtuel + \everyeof{\ST@nil}% met un \@nil à la fin du fichier virtuel \endlinechar\m@ne \catcode\z@12 \catcode`(=1 \catcode`)=2 \afterassignment\ST@gobble@remain - \expandafter\def\expandafter\ST@temp@a\scantokens\expandafter{#1}% Attentionn !!! Il peut rester des ) non équilibrées + \expandafter\def\expandafter\ST@temp@a\scantokens\expandafter{#1}% Attentionn !!! Il peut rester des ) non équilibrées \catcode`(=12 \catcode`)=12 \def\ST@assign@result##1\ST@nil{\endgroup\def#2{##1}}% \expandafter\ST@assign@result\scantokens\expandafter{\ST@temp@a}% on fait l'assignation } -\def\ST@func@sum#1#2{% #1 est la sc contenant la plage de valeurs, #2 est la sc recevant le r\'esultat - \def#2{0}% r\'esultat nul pour l'instant - \let\ST@temp@stack\@empty% pile d'appel temporaire vide aussi au d\'ebut +\def\ST@func@sum#1#2{% #1 est la sc contenant la plage de valeurs, #2 est la sc recevant le résultat + \def#2{0}% résultat nul pour l'instant + \let\ST@temp@stack\@empty% pile d'appel temporaire vide aussi au début \ST@for{#1}% on parcourt la <plage de cellules> {\ifnum\numexpr10000*(\ST@colcount@i-\ST@current@colnumber)+\ST@rowcount@i-\ST@current@rownumber=\z@ \ST@invalid@range% si la cellule courante est dans la plage, erreur @@ -1186,21 +1274,21 @@ \or% code=1 \edef\ST@temp@stack{\ST@temp@stack(\number\ST@colcount@i,\number\ST@rowcount@i)}% \or% code=2 - \ifx\ST@temp@stack\@empty% on ne prend la peine d'additionner que si toutes les cellules sont calcul\'ees - \expandafter\FPadd\expandafter#2\expandafter#2\csname formula@\number\ST@colcount@i @\number\ST@rowcount@i\endcsname - \edef\ST@dependance@tree{\ST@dependance@tree(\number\ST@colcount@i,\number\ST@rowcount@i)}% mise \'a jour de l'arbre des d\'ependances + \ifx\ST@temp@stack\@empty% on ne prend la peine d'additionner que si toutes les cellules sont calculées + \expandafter\STadd\expandafter#2\expandafter#2\csname formula@\number\ST@colcount@i @\number\ST@rowcount@i\endcsname + \edef\ST@dependance@tree{\ST@dependance@tree(\number\ST@colcount@i,\number\ST@rowcount@i)}% mise à jour de l'arbre des dépendances \fi \fi }% - \ifx\ST@temp@stack\@empty% toutes les cellules dans la plage \'etaient calcul\'ees ? - \FPclip#2#2% on \^ote les 0 inutiles si le calcul a \'et\'e men\'e au bout + \ifx\ST@temp@stack\@empty% toutes les cellules dans la plage étaient calculées ? + \STclip#2#2% on ôte les 0 inutiles si le calcul a été mené au bout \else \let#2\@empty - \edef\ST@stackcall{\ST@temp@stack(\ST@current@colnumber,\ST@current@rownumber)\ST@stackcall}% on met \'a jour la pile d'appel + \edef\ST@stackcall{\ST@temp@stack(\ST@current@colnumber,\ST@current@rownumber)\ST@stackcall}% on met à jour la pile d'appel \fi } -\def\ST@func@sumprod#1#2{% #1 est la sc contenant la plage de valeurs, #2 est la sc recevant le r\'esultat +\def\ST@func@sumprod#1#2{% #1 est la sc contenant la plage de valeurs, #2 est la sc recevant le résultat \ST@left{#1;};\ST@firstmat \ST@right#1;\ST@othermat \ST@left\ST@firstmat{\@empty:}\ST@temp@a @@ -1212,7 +1300,7 @@ \edef\ST@matcol{\number\numexpr\ST@distant@colnumber-\ST@mat@firstcol}% \edef\ST@matrow{\number\numexpr\ST@distant@rownumber-\ST@mat@firstrow}% \ST@count\@ne - \loop% regarde si toutes les matrices ont la m\^eme dimension que la 1ere et pour chacune, calcule les vecteurs de d\'ecalage par rapport \'a la premi\`ere + \loop% regarde si toutes les matrices ont la même dimension que la 1ere et pour chacune, calcule les vecteurs de décalage par rapport à la première \unless\ifx\ST@othermat\@empty \ST@left{\ST@othermat;};\ST@currentmat \ST@right{\ST@othermat;};\ST@othermat @@ -1230,137 +1318,114 @@ \unless\ifnum\ST@matrow=\ST@currentmatrow\ST@unmatch@matrixdim\fi% la dimension verticale ne correspond pas \advance\ST@count\@ne \repeat - \let\ST@temp@stack\@empty% pile d'appel temporaire vide au d\'ebut - \edef\ST@numbermat{\number\ST@count}% c'est le nombre de matrices \'a multiplier - \def#2{0}% r\'esultat nul pour l'instant + \let\ST@temp@stack\@empty% pile d'appel temporaire vide au début + \edef\ST@numbermat{\number\ST@count}% c'est le nombre de matrices à multiplier + \def#2{0}% résultat nul pour l'instant \ST@for{\ST@firstmat}% pour chaque cellule de la 1ere matrice - {\def\ST@inter@result{0}% r\'esultat partiel nul pour l'instant + {\def\ST@inter@result{0}% résultat partiel nul pour l'instant \ifcase\csname code@\number\ST@colcount@i @\number\ST@rowcount@i\endcsname \or% code =1 \edef\ST@temp@stack{\ST@temp@stack(\number\ST@colcount@i,\number\ST@rowcount@i)}% - \edef\ST@dependance@tree{\ST@dependance@tree(\number\ST@colcount@i,\number\ST@rowcount@i)}% mise \'a jour de l'arbre des d\'ependances + \edef\ST@dependance@tree{\ST@dependance@tree(\number\ST@colcount@i,\number\ST@rowcount@i)}% mise à jour de l'arbre des dépendances \or% code=2 - \expandafter\let\expandafter\ST@inter@result\csname formula@\number\ST@colcount@i @\number\ST@rowcount@i\endcsname + \ST@cslet\ST@inter@result{formula@\number\ST@colcount@i @\number\ST@rowcount@i}% \fi \ST@count\@ne \loop% on multiplie tous les nombres qui se correspondent dans les matrices \edef\ST@tempcoord{\number\numexpr\ST@colcount@i+\csname ST@vectorcol@\romannumeral\ST@count\endcsname @\number\numexpr\ST@rowcount@i+\csname ST@vectorrow@\romannumeral\ST@count\endcsname}% \ifcase\csname code@\ST@tempcoord\endcsname - \def\ST@inter@result{0}% code =0 -> on met le r\'esultat partiel \'a 0 + \def\ST@inter@result{0}% code =0 -> on met le résultat partiel à 0 \or% code =1 \ST@subst\ST@tempcoord @,% \edef\ST@temp@stack{\ST@temp@stack(\ST@tempcoord)}% - \edef\ST@dependance@tree{\ST@dependance@tree(\ST@tempcoord)}% mise \'a jour de l'arbre des d\'ependances + \edef\ST@dependance@tree{\ST@dependance@tree(\ST@tempcoord)}% mise à jour de l'arbre des dépendances \or% code=2 - \expandafter\FPmul\expandafter\ST@inter@result\expandafter\ST@inter@result\csname formula@\ST@tempcoord\endcsname + \expandafter\STmul\expandafter\ST@inter@result\expandafter\ST@inter@result\csname formula@\ST@tempcoord\endcsname \else - \def\ST@inter@result{0}% code = autre -> on met le r\'esultat partiel \'a 0 + \def\ST@inter@result{0}% code = autre -> on met le résultat partiel à 0 \fi \advance\ST@count\@ne \ifnum\ST@count<\ST@numbermat \repeat - \FPadd#2#2\ST@inter@result + \STadd#2#2\ST@inter@result }% - \ifx\ST@temp@stack\@empty% toutes les cellules dans la plage \'etaient calcul\'ees ? - \FPclip#2#2% on \^ote les 0 inutiles si le calcul a \'et\'e men\'e au bout + \ifx\ST@temp@stack\@empty% toutes les cellules dans la plage étaient calculées ? + \STclip#2#2% on ôte les 0 inutiles si le calcul a été mené au bout \else \let#2\@empty - \edef\ST@stackcall{\ST@temp@stack(\ST@current@colnumber,\ST@current@rownumber)\ST@stackcall}% on met \'a jour la pile d'appel + \edef\ST@stackcall{\ST@temp@stack(\ST@current@colnumber,\ST@current@rownumber)\ST@stackcall}% on met à jour la pile d'appel \fi } \def\ST@func@id#1#2{\expandafter\def\expandafter#2\expandafter{#1}} -% Calcule la factorielle du nombre #1 et met le r\'esultat dans la sc #2 -\def\ST@func@fact#1#2{% - \FPifint{#1}% - \FPifgt{#1}{18}% - \ST@fact@outofrange - \else - \FPifpos{#1}% - \edef#2{% - \ifcase#1 1\or1\or2\or6\or24\or120\or720\or5040\or40320\or362880\or3628800\or39916800\or479001600\or - 6227020800\or87178291200\or1307674368000\or20922789888000\or355687428096000\or6402373705728000\fi}% - \else - \ST@fact@outofrange - \fi - \fi - \else - \ST@fact@outofrange - \fi -} - \newif\ifST@gcd -\def\ST@arithmetic#1#2{% #1 est une liste de nombres s\'epar\'es par des virgules, #2 la sc qui reçoit leur pgcd ou ppcm selon \ifST@gcd +\def\ST@arithmetic#1#2{% #1 est une liste de nombres séparés par des virgules, #2 la sc qui reçoit leur pgcd ou ppcm selon \ifST@gcd \ST@split{#1},#2\ST@argB \ST@Ifinstr\ST@argB,{\ST@split\ST@argB,\ST@argB\ST@remain\let\ST@next\ST@arithmetic}{\let\ST@remain\@empty\let\ST@next\@gobbletwo}% \let\ST@argA#2% - \FPeval\ST@argA\ST@argA\FPeval\ST@argB\ST@argB% \'evalue les 2 nombres au cas o\`u il y ait des op\'erations - \FPeval#2{trunc(abs(max(\ST@argB,\ST@argA)),0)}% - \FPeval\ST@argB{trunc(abs(min(\ST@argB,\ST@argA)),0)}% - \FPifzero\ST@argB\else% si 0, on ignore puisque tous les nombres divisent 0 ou en sont leur multiple - \ifST@gcd\else\FPmul\ST@argC#2\ST@argB\fi + \STeval\ST@argA\ST@argA\STeval\ST@argB\ST@argB% évalue les 2 nombres au cas où il y ait des opérations + \STeval#2{trunc(abs(max(\ST@argB,\ST@argA)),0)}% + \STeval\ST@argB{trunc(abs(min(\ST@argB,\ST@argA)),0)}% + \STifzero\ST@argB\else% si 0, on ignore puisque tous les nombres divisent 0 ou en sont leur multiple + \ifST@gcd\else\STmul\ST@argC#2\ST@argB\fi \loop \let\ST@argA\ST@argB - \FPeval\ST@argB{trunc(#2-trunc(#2/\ST@argB,0)*\ST@argB,0)}% reste de la division #2/\ST@argB + \STeval\ST@argB{trunc(#2-trunc(#2/\ST@argB,0)*\ST@argB,0)}% reste de la division #2/\ST@argB \let#2\ST@argA - \FPifzero\ST@argB\else + \STifzero\ST@argB\else \repeat - \ifST@gcd\else\FPeval#2{trunc(\ST@argC/#2,0)}\fi + \ifST@gcd\else\STeval#2{trunc(\ST@argC/#2,0)}\fi \fi - \csname @\ifST@gcd firstofone\else gobble\fi\endcsname{\FPifeq#21\let\ST@next\@gobbletwo\fi}% pour le pgcd, inutile de continuer si le pgcd est 1 + \csname @\ifST@gcd firstofone\else gobble\fi\endcsname{\STifeq#21\let\ST@next\@gobbletwo\fi}% pour le pgcd, inutile de continuer si le pgcd est 1 \expandafter\expandafter\expandafter\ST@next\expandafter\expandafter\expandafter{\expandafter#2\expandafter,\ST@remain}#2% } -\def\ST@func@gcd#1#2{% #1 est une liste de nombres s\'epar\'es par des virgules, #2 la sc qui reçoit leur pgcd +\def\ST@func@gcd#1#2{% #1 est une liste de nombres séparés par des virgules, #2 la sc qui reçoit leur pgcd \ST@gcdtrue\ST@arithmetic{#1}#2% } -\def\ST@func@lcm#1#2{% #1 est une liste de nombres s\'epar\'es par des virgules, #2 la sc qui reçoit leur ppcm +\def\ST@func@lcm#1#2{% #1 est une liste de nombres séparés par des virgules, #2 la sc qui reçoit leur ppcm \ST@gcdfalse\ST@arithmetic{#1}#2% } -% d\'etermine la graine pour fp en fonction de la date et de l'heure -\def\ST@seed{\FPseed\number\time\number\day\number\month} - % la fonction randint -\def\ST@func@randint#1#2{% #1=sc contenant l'argument #2: sc recevant le r\'esultat +\def\ST@func@randint#1#2{% #1=sc contenant l'argument #2: sc recevant le résultat \ST@Ifinstr#1,% s'il y a 2 nombres -> intervalle [nb1;nb2] {\ST@split#1,\ST@limita\ST@limitb - \FPifeq\ST@limita\ST@limitb\PackageError\STname{Macro function randint require two different numbers}\ST@seedoc@i\fi - \FPifgt\ST@limita\ST@limitb + \STifeq\ST@limita\ST@limitb\PackageError\STname{Macro function randint require two different numbers}\STseedoc@i\fi + \STifgt\ST@limita\ST@limitb \let\ST@temp@a\ST@limitb\let\ST@limitb\ST@limita\let\ST@limita\ST@temp@a \fi - \FPifint\ST@limita\else\ST@intarg@required\fi - \FPifint\ST@limitb\else\ST@intarg@required\fi - \FPrandom#2% - \FPeval#2{trunc(trunc(#2*(\ST@limitb-\ST@limita+1),0)+\ST@limita,0)}% + \STifint\ST@limita\else\ST@intarg@required\fi + \STifint\ST@limitb\else\ST@intarg@required\fi + \STrandom#2% + \STeval#2{trunc(trunc(#2*(\ST@limitb-\ST@limita+1),0)+\ST@limita,0)}% }% - {\FPifint#1\else\ST@intarg@required\fi - \FPrandom#2% s'il n'y a qu'un nombre -> intervalle [0;nb2] - \FPeval#2{trunc(#2*(#1+1),0)}% + {\STifint#1\else\ST@intarg@required\fi + \STrandom#2% s'il n'y a qu'un nombre -> intervalle [0;nb2] + \STeval#2{trunc(#2*(#1+1),0)}% }% } -\def\ST@func@rand#1#2{\FPrandom#2}% #1=sc contenant l'argument (ignor\'e) #2: sc recevant le r\'esultat +\def\ST@func@rand#1#2{\STrandom#2}% #1=sc contenant l'argument (ignoré) #2: sc recevant le résultat \def\ST@genzeros#1{\if#1m0\expandafter\ST@genzeros\fi} -\def\ST@powerten#1#2{% g\'en\`ere 10^abs(#1) dans la sc #2 +\def\ST@powerten#1#2{% génère 10^abs(#1) dans la sc #2 \edef#2{1\expandafter\ST@genzeros\romannumeral\number\ifnum#1<\z@-\fi#1000\relax}% } -\def\ST@func@scitodec#1#2{% #1=sc contenant l'argument #2: sc recevant le r\'esultat +\def\ST@func@scitodec#1#2{% #1=sc contenant l'argument #2: sc recevant le résultat \expandafter\lowercase\expandafter{\expandafter\def\expandafter#1\expandafter{#1}}% \ST@Ifinstr#1{ee}% on regarde s'il y a "ee" {\ST@split#1{ee}\ST@mantissa\ST@exposant \ST@powerten\ST@exposant\ST@tenpow - \csname FP\ifnum\ST@exposant<\z@ div\else mul\fi\endcsname#2\ST@mantissa\ST@tenpow}% + \csname ST\ifnum\ST@exposant<\z@ div\else mul\fi\endcsname#2\ST@mantissa\ST@tenpow}% {\IfDecimal#1% {\let#2#1}% - {\PackageError\STname{Illegal number in scitodec argument}\ST@seedoc@i}}% + {\PackageError\STname{Illegal number in scitodec argument}\STseedoc@i}}% } - % les fonctions de test \def\ST@liST@offour#1,#2,#3,#4\@nil{% \def\ST@argA{#1}\def\ST@argB{#2}\def\ST@argC{#3}\def\ST@argD{#4}% @@ -1368,11 +1433,11 @@ \def\ST@def@funcif#1#2#3{% \expandafter\ST@liST@offour#1\@nil - \FPeval\ST@argA\ST@argA\FPeval\ST@argB\ST@argB - \csname FPif#3\endcsname\ST@argA\ST@argB - \FPset#2\ST@argC + \STeval\ST@argA\ST@argA\STeval\ST@argB\ST@argB + \csname STif#3\endcsname\ST@argA\ST@argB + \let#2\ST@argC \else - \FPset#2\ST@argD + \let#2\ST@argD \fi } @@ -1381,96 +1446,96 @@ \def\ST@func@iflt#1#2{\ST@def@funcif#1#2{lt}} % Transforme une date en nombre -\def\STdatetonum#1#2#3#4{% #1=sc recevant le r\'esultat #2=jj #3=mm #4=aa - \FPeval#1{#3+9-12*trunc((#3+9)/12,0)}% - \FPeval\ST@@@year{#4-trunc(#1/10,0)}% - \FPeval#1{365*\ST@@@year+trunc(\ST@@@year/4,0)-trunc(\ST@@@year/100,0)+trunc(\ST@@@year/400,0)+trunc((#1*306+5)/10,0)+#2-1}% - \FPclip#1#1% +\def\STdatetonum#1#2#3#4{% #1=sc recevant le résultat #2=jj #3=mm #4=aa + \STeval#1{#3+9-12*trunc((#3+9)/12,0)}% + \STeval\ST@@@year{#4-trunc(#1/10,0)}% + \STeval#1{365*\ST@@@year+trunc(\ST@@@year/4,0)-trunc(\ST@@@year/100,0)+trunc(\ST@@@year/400,0)+trunc((#1*306+5)/10,0)+#2-1}% + \STclip#1#1% } % Transforme un nombre en une date -\def\ST@numtodate#1#2#3#4{% #1=nombre repr\'esentant la date #2=jour #3=mois #4=ann\'ee - \FPeval#4{trunc((10000*#1+14780)/3652425,0)}% - \FPeval#2{#1-(365*#4+trunc(#4/4,0)-trunc(#4/100,0)+trunc(#4/400,0))}% - \FPifneg#2% - \FPadd#4#4{-1}% - \FPeval#2{#1-(365*#4+trunc(#4/4,0)-trunc(#4/100,0)+trunc(#4/400,0))}% +\def\ST@numtodate#1#2#3#4{% #1=nombre représentant la date #2=jour #3=mois #4=année + \STeval#4{trunc((10000*#1+14780)/3652425,0)}% + \STeval#2{#1-(365*#4+trunc(#4/4,0)-trunc(#4/100,0)+trunc(#4/400,0))}% + \STiflt{#2}0% + \STadd#4#4{-1}% + \STeval#2{#1-(365*#4+trunc(#4/4,0)-trunc(#4/100,0)+trunc(#4/400,0))}% \fi - \FPeval#3{trunc((100*#2+52)/3060,0)}% - \FPeval#4{#4+trunc((#3+2)/12,0)}\FPclip#4#4% - \FPeval#2{#2-trunc((#3*306+5)/10,0)+1}\FPclip#2#2% - \FPeval#3{#3+2-12*trunc((#3+2)/12,0)+1}\FPclip#3#3% + \STeval#3{trunc((100*#2+52)/3060,0)}% + \STeval#4{#4+trunc((#3+2)/12,0)}\STclip#4#4% + \STeval#2{#2-trunc((#3*306+5)/10,0)+1}\STclip#2#2% + \STeval#3{#3+2-12*trunc((#3+2)/12,0)+1}\STclip#3#3% } \def\ST@parse@datefr#1/#2/#3\@nil{\def\ST@@@day{#1}\def\ST@@@month{#2}\def\ST@@@year{#3}} \def\ST@parse@dateeng#1/#2/#3\@nil{\def\ST@@@day{#3}\def\ST@@@month{#2}\def\ST@@@year{#1}} -% transforme une date française courte du type jj/mm/aaaa en nombre -\def\ST@func@frshortdatetonum#1#2{% #1=sc \'etant l'argument jj/mm/aaaa #2=sc recevant le r\'esultat +% transforme une date française courte du type jj/mm/aaaa en nombre +\def\ST@func@frshortdatetonum#1#2{% #1=sc étant l'argument jj/mm/aaaa #2=sc recevant le résultat \expandafter\ST@parse@datefr#1\@nil \STdatetonum#2\ST@@@day\ST@@@month\ST@@@year } -% Transforme un nombre en une date française de type jj/mm/aaaa -\def\ST@func@numtofrshortdate#1#2{% % #1=nombre repr\'esentant la date #2=sc recevant le r\'esultat +% Transforme un nombre en une date française de type jj/mm/aaaa +\def\ST@func@numtofrshortdate#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat \ST@numtodate#1\ST@@@day\ST@@@month\ST@@@year \edef#2{\ST@@@day/\ST@@@month/\ST@@@year}% } -% Transforme un nombre en une date longue française du type «14 juillet 1789» -\def\ST@func@numtofrlongdate#1#2{% % #1=nombre repr\'esentant la date #2=sc recevant le r\'esultat +% Transforme un nombre en une date longue française du type «14 juillet 1789» +\def\ST@func@numtofrlongdate#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat \ST@numtodate#1\ST@@@day\ST@@@month\ST@@@year \edef#2{\ST@@@day\space\ifcase\ST@@@month\or janvier\or f\'evrier\or mars\or avril\or mai\or juin\or juillet\or ao\^ut\or septembre\or octobre \or novembre\or d\'ecembre\fi\space\ST@@@year}% } -% Extrait d'un nombre repr\'esentant une date le mois en toutes lettres en français -\def\ST@func@numtofrmonth#1#2{% % #1=nombre repr\'esentant la date #2=sc recevant le r\'esultat +% Extrait d'un nombre représentant une date le mois en toutes lettres en français +\def\ST@func@numtofrmonth#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat \ST@numtodate#1\ST@@@day\ST@@@month\ST@@@year \edef#2{\ifcase\ST@@@month\or janvier\or f\'evrier\or mars\or avril\or mai\or juin\or juillet\or ao\^ut\or septembre\or octobre \or novembre\or d\'ecembre\fi}% } -% Extrait d'un nombre rep\'esentant une date le nom du jour en français -\def\ST@func@numtofrday#1#2{% % #1=nombre repr\'esentant la date #2=sc recevant le r\'esultat - \FPeval\ST@@@day{#1-7*trunc(#1/7,0)}\FPclip\ST@@@day\ST@@@day +% Extrait d'un nombre repésentant une date le nom du jour en français +\def\ST@func@numtofrday#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat + \STeval\ST@@@day{#1-7*trunc(#1/7,0)}\STclip\ST@@@day\ST@@@day \edef#2{\ifcase\ST@@@day mercredi\or jeudi\or vendredi\or samedi\or dimanche\or lundi\or mardi\fi} } % transforme une date anglaise courte du type aaaa/mm/jj en nombre -\def\ST@func@engshortdatetonum#1#2{% #1=sc \'etant l'argument aaaa/mm/jj #2=sc recevant le r\'esultat +\def\ST@func@engshortdatetonum#1#2{% #1=sc étant l'argument aaaa/mm/jj #2=sc recevant le résultat \expandafter\ST@parse@dateeng#1\@nil \STdatetonum#2\ST@@@day\ST@@@month\ST@@@year } % Transforme un nombre en une date anglaise de type aaaa/mm/jj -\def\ST@func@numtoengshortdate#1#2{% % #1=nombre repr\'esentant la date #2=sc recevant le r\'esultat +\def\ST@func@numtoengshortdate#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat \ST@numtodate#1\ST@@@day\ST@@@month\ST@@@year \edef#2{\ST@@@year/\ST@@@month/\ST@@@day} } -% Transforme un nombre en une date longue anglaise du type «July 14, 1789» -\def\ST@func@numtoenglongdate#1#2{% % #1=nombre repr\'esentant la date #2=sc recevant le r\'esultat +% Transforme un nombre en une date longue anglaise du type «July 14, 1789» +\def\ST@func@numtoenglongdate#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat \ST@numtodate#1\ST@@@day\ST@@@month\ST@@@year \edef#2{\ifcase\ST@@@month\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi\space\ST@@@day,\space\ST@@@year}% } -% Extrait d'un nombre repr\'esentant une date le mois en toutes lettres en anglais -\def\ST@func@numtoengmonth#1#2{% % #1=nombre repr\'esentant la date #2=sc recevant le r\'esultat +% Extrait d'un nombre représentant une date le mois en toutes lettres en anglais +\def\ST@func@numtoengmonth#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat \ST@numtodate#1\ST@@@day\ST@@@month\ST@@@year \edef#2{\ifcase\ST@@@month\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi}% } -% Extrait d'un nombre rep\'esentant une date le nom du jour en anglais -\def\ST@func@numtoengday#1#2{% % #1=nombre repr\'esentant la date #2=sc recevant le r\'esultat - \FPeval\ST@@@day{#1-7*trunc(#1/7,0)}\FPclip\ST@@@day\ST@@@day +% Extrait d'un nombre repésentant une date le nom du jour en anglais +\def\ST@func@numtoengday#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat + \STeval\ST@@@day{#1-7*trunc(#1/7,0)}\STclip\ST@@@day\ST@@@day \edef#2{\ifcase\ST@@@day wednesday\or thursday\or friday\or saturday\or sunday\or monday\or tuesday\fi} } -% Teste si la date contenue dans les 3 sc #1 (jour) #2(mois) #3(ann\'ee) est valide. Sinon, envoie un message d'erreur +% Teste si la date contenue dans les 3 sc #1 (jour) #2(mois) #3(année) est valide. Sinon, envoie un message d'erreur \def\ST@teST@date@validity#1#2#3{% \IfInteger#1{}\ST@invalid@date \IfInteger#2{}\ST@invalid@date @@ -1479,16 +1544,16 @@ \ifnum#2>12 \ST@invalid@date\fi \ifnum#1<\@ne\ST@invalid@date\fi \ifnum#1>\ifcase#2\or31\or29\or31\or30\or31\or30\or31\or31\or30\or31\or30\or31\fi\ST@invalid@date\fi - \ifnum#3<\@ne\ST@invalid@date\fi% on va s'arr\^eter \'a JC quand m\^eme :-) + \ifnum#3<\@ne\ST@invalid@date\fi% on va s'arrêter à JC quand même :-) } -% Transforme une date anglaise longue du type «July 14, 1789» en un nombre -\def\ST@func@englongdatetonum#1#2{% #1=sc contenant la date longue #2=sc recevant le r\'esultat +% Transforme une date anglaise longue du type «July 14, 1789» en un nombre +\def\ST@func@englongdatetonum#1#2{% #1=sc contenant la date longue #2=sc recevant le résultat \ST@analyse@text@engdate#1\ST@@@day\ST@@@month\ST@@@year \STdatetonum#2\ST@@@day\ST@@@month\ST@@@year } -\def\ST@analyse@text@engdate#1#2#3#4{% #1=texte repr\'esentant la date #2=jour #3=n° mois #4=ann\'ee +\def\ST@analyse@text@engdate#1#2#3#4{% #1=texte représentant la date #2=jour #3=n° mois #4=année \ST@remove@firST@spaces#1% \def\ST@today{\today}% \ifx#1\ST@today @@ -1519,15 +1584,15 @@ \fi } -% Transforme une date anglaise longue du type «14 juillet 1789» en un nombre -\def\ST@func@frlongdatetonum#1#2{% #1=sc contenant la date longue #2=sc recevant le r\'esultat +% Transforme une date anglaise longue du type «14 juillet 1789» en un nombre +\def\ST@func@frlongdatetonum#1#2{% #1=sc contenant la date longue #2=sc recevant le résultat \ST@analyse@text@frdate#1\ST@@@day\ST@@@month\ST@@@year \STdatetonum#2\ST@@@day\ST@@@month\ST@@@year } \def\ST@utfencoding{utf8} -\def\ST@analyse@text@frdate#1#2#3#4{% #1=texte repr\'esentant la date #2=jour #3=n° mois #4=ann\'ee +\def\ST@analyse@text@frdate#1#2#3#4{% #1=texte représentant la date #2=jour #3=n° mois #4=année \ST@remove@firST@spaces#1% \def\ST@today{\today}% \ifx#1\ST@today @@ -1537,9 +1602,9 @@ \IfInteger#2{}{\edef#2{\number\integerpart}}% \ST@split#3{ }#3#4% \ST@removespaces#3% - \def\ST@e{^^e9}\def\ST@u{^^fb}% \'e et û en latin1 + \def\ST@e{^^e9}\def\ST@u{^^fb}% é et û en latin1 \ifdefined\inputencodingname\ifx\ST@utfencoding\inputencodingname - \def\ST@e{^^c3^^a9}\def\ST@u{^^c3^^bb}% \'e et û en utf8 + \def\ST@e{^^c3^^a9}\def\ST@u{^^c3^^bb}% é et û en utf8 \fi\fi \expandafter\ST@subst\expandafter#3\expandafter{\ST@e}e\ST@subst#3\'{}% \expandafter\ST@subst\expandafter#3\expandafter{\ST@u}u\ST@subst#3\^{}% @@ -1586,7 +1651,7 @@ \def\ST@func@value#1#2{% \ifcsname ST@celltag@\detokenize\expandafter{#1}\endcsname - \expandafter\let\expandafter#2\csname ST@celltag@\detokenize\expandafter{#1}\endcsname + \ST@cslet#2{ST@celltag@\detokenize\expandafter{#1}}% \else \PackageWarning\ST@package@name{The tag "\detokenize\expandafter{#1}" does not exists, have you defined it?}% \def#2{0}% use 0 if tag undefined @@ -1600,14 +1665,14 @@ % \ST@left\ST@nb@min:\ST@nb@min % }% % {\def\ST@nb@sec{0}}% -% \FPeval#2{\ST@nb@sec+60*\ST@nb@min+3600*\ST@nb@hours}% -% \FPclip#2#2% +% \STeval#2{\ST@nb@sec+60*\ST@nb@min+3600*\ST@nb@hours}% +% \STclip#2#2% % } % % \def\ST@func@sectotime#1#2{% -% \FPeval\ST@nb@hours{trunc(#1/3600,0)}\FPclip\ST@nb@hours\ST@nb@hours -% \FPeval\ST@nb@min{trunc((#1-\ST@nb@hours*3600)/60,0)}\FPclip\ST@nb@min\ST@nb@min -% \FPeval\ST@nb@sec{#1-3600*\ST@nb@hours-60*\ST@nb@min}\FPclip\ST@nb@sec\ST@nb@sec +% \STeval\ST@nb@hours{trunc(#1/3600,0)}\STclip\ST@nb@hours\ST@nb@hours +% \STeval\ST@nb@min{trunc((#1-\ST@nb@hours*3600)/60,0)}\STclip\ST@nb@min\ST@nb@min +% \STeval\ST@nb@sec{#1-3600*\ST@nb@hours-60*\ST@nb@min}\STclip\ST@nb@sec\ST@nb@sec % \edef#2{% % \ST@nb@hours % :\ifnum\ST@nb@min<10 0\fi\ST@nb@min @@ -1615,9 +1680,9 @@ % } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%% Construction du tableau \'a afficher %%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%% Construction du tableau à afficher %%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\def\ST@search@lastshowcol{% cherche le num\'ero de la derni\`ere colonne non masqu\'ee +\def\ST@search@lastshowcol{% cherche le numéro de la dernière colonne non masquée \ST@colcount\ST@total@colnumber% on commence par la fin \ST@search@lastshowcol@i } @@ -1628,20 +1693,20 @@ {\edef\ST@lastshowcol{\number\ST@colcount}}% } -% cherche "<<ref>>" dans la sc #1 et remplace toutes ces occurences par le champ num\'erique de "ref" +% cherche "<<ref>>" dans la sc #1 et remplace toutes ces occurences par le champ numérique de "ref" \def\ST@displaynumfields#1{% \StrBehind#1\ST@startdisplay[\ST@dipslaycell]% \StrBefore\ST@dipslaycell\ST@enddisplay[\ST@dipslaycell]% - \let\ST@next\@gobble% \'a priori, on ne reboucle pas + \let\ST@next\@gobble% à priori, on ne reboucle pas \unless\ifx\@empty\ST@dipslaycell% si ce qui a entre les marqueurs n'est pas vide \edef\ST@current@colnumber{\number\ST@colcount}\edef\ST@current@rownumber{\number\ST@rowcount}% - \ST@ifref\ST@dipslaycell% et si c'est une r\'ef\'erence valide + \ST@ifref\ST@dipslaycell% et si c'est une référence valide {\let\ST@next\ST@startdisplay \ST@expadd@tomacro\ST@next\ST@dipslaycell \ST@expadd@tomacro\ST@next\ST@enddisplay - \expandafter\let\expandafter\ST@dipslaycell\csname formula@\ST@temp@formula\endcsname% alias pour la formule distante - \unless\ifx\ST@decsep\ST@decsepfp\ST@substdecsep\ST@dipslaycell\fi% subsitution du s\'eparateur d\'ecimal s'il y a lieu - \StrSubstitute#1\ST@next\ST@dipslaycell[#1]% on substitue <<ref>> par le champ num\'erique de la formule distante + \ST@cslet\ST@dipslaycell{formula@\ST@temp@formula}% alias pour la formule distante + \unless\ifx\ST@decsep\ST@decsepfp\ST@substdecsep\ST@dipslaycell\fi% subsitution du séparateur décimal s'il y a lieu + \StrSubstitute#1\ST@next\ST@dipslaycell[#1]% on substitue <<ref>> par le champ numérique de la formule distante \let\ST@next\ST@displaynumfields } {}% @@ -1651,75 +1716,75 @@ \def\ST@build@tab{% \ST@rowcount\@ne\ST@colcount\@ne - \expandafter\ST@expadd@tomacro\expandafter\ST@tab\csname endrow@0\endcsname% la (ou les) \'eventuelle ligne sup\'erieure du tableau + \expandafter\ST@expadd@tomacro\expandafter\ST@tab\csname endrow@0\endcsname% la (ou les) éventuelle ligne supérieure du tableau \ST@build@tab@i } -\def\ST@build@tab@i{% reconstitue le tableau \'a partir des valeurs calcul\'ees et des cellules +\def\ST@build@tab@i{% reconstitue le tableau à partir des valeurs calculées et des cellules \ifnum\ST@rowcount>\ST@total@rownumber \let\ST@nextcell\relax \else \let\ST@nextcell\ST@build@tab@i \ST@Ifinstr\ST@row@skiplist{\expandafter(\number\ST@rowcount)}% la ligne fait partie de la skiplist ? - {\advance\ST@rowcount\@ne}% on passe \'a la ligne suivante + {\advance\ST@rowcount\@ne}% on passe à la ligne suivante {% \ST@Ifinstr\ST@col@skiplist{\expandafter(\number\ST@colcount)}% la colonne fait partie de la skiplist ? \ST@hiddencoltrue {% \ST@hiddencolfalse \ST@ifvalid@csname{text@\number\ST@colcount @\number\ST@rowcount}% si la cellule existe - {\expandafter\let\expandafter\ST@temp@b\csname text@\number\ST@colcount @\number\ST@rowcount\endcsname% on cr\'e\'e un alias pour le texte + {\ST@cslet\ST@temp@b{text@\number\ST@colcount @\number\ST@rowcount}% on créé un alias pour le texte \exploregroups - \ifnum\csname code@\number\ST@colcount @\number\ST@rowcount\endcsname=\tw@% si la cellule contient un champ num\'erique - \expandafter\let\expandafter\ST@temp@a\csname formula@\number\ST@colcount @\number\ST@rowcount\endcsname% alias pour la valeur - \unless\ifx\ST@decsep\ST@decsepfp\ST@substdecsep\ST@temp@a\fi% et si le "." doit \^etre remplac\'e par "," on substitue - \StrSubstitute[1]\ST@temp@b\STnumericfieldmarker{\expandafter\STprintnum\expandafter{\ST@temp@a}}[\ST@temp@a]% on remplace le flag de formule par la valeur calcul\'ee - \else% si la cellule ne contient pas de champ num\'erique - \StrDel[1]\ST@temp@b\STnumericfieldmarker[\ST@temp@a]% on enl\`eve l'\'eventuel marqueur + \ifnum\csname code@\number\ST@colcount @\number\ST@rowcount\endcsname=\tw@% si la cellule contient un champ numérique + \ST@cslet\ST@temp@a{formula@\number\ST@colcount @\number\ST@rowcount}% alias pour la valeur + \unless\ifx\ST@decsep\ST@decsepfp\ST@substdecsep\ST@temp@a\fi% et si le "." doit être remplacé par "," on substitue + \StrSubstitute[1]\ST@temp@b\STnumericfieldmarker{\expandafter\STprintnum\expandafter{\ST@temp@a}}[\ST@temp@a]% on remplace le flag de formule par la valeur calculée + \else% si la cellule ne contient pas de champ numérique + \StrDel[1]\ST@temp@b\STnumericfieldmarker[\ST@temp@a]% on enlève l'éventuel marqueur \fi - \ST@displaynumfields\ST@temp@a% affiche les champs num\'eriques des cellules entre << et >> + \ST@displaynumfields\ST@temp@a% affiche les champs numériques des cellules entre << et >> \noexploregroups \ST@expadd@tomacro\ST@tab\ST@temp@a% on ajoute la cellule au tableau } {}% }% - \advance\ST@colcount\@ne% on passe \'a la colonne suivante ! - \ST@ifvalid@csname{code@\number\ST@colcount @\number\ST@rowcount}% y a t-il encore un code d\'efini ensuite ? + \advance\ST@colcount\@ne% on passe à la colonne suivante ! + \ST@ifvalid@csname{code@\number\ST@colcount @\number\ST@rowcount}% y a t-il encore un code défini ensuite ? {\ifnum\csname code@\number\ST@colcount @\number\ST@rowcount\endcsname<\z@% on est dans une cellule contenant \multicol ? - \expandafter\ST@firstarg@after\csname text@\number\numexpr\ST@colcount-1@\number\ST@rowcount\endcsname\multicolumn\ST@multicol@number% combien de cellules ? - \advance\ST@colcount\ST@multicol@number% on va voir apr\`es le multicol en sautant toutes les valeurs des colonnes interm\'ediaires + \expandafter\ST@firstarg@after\csname text@\number\numexpr\ST@colcount-1@\number\ST@rowcount\endcsname\multicolumn\STmulticol@number% combien de cellules ? + \advance\ST@colcount\STmulticol@number% on va voir après le multicol en sautant toutes les valeurs des colonnes intermédiaires \advance\ST@colcount\m@ne - \ST@ifvalid@csname{code@\number\ST@colcount @\number\ST@rowcount}% y a t-il un code d\'efini apr\`es le multicol ? - {\ST@add@tomacro\ST@tab&}% on ajoute la tabulation + \ST@ifvalid@csname{code@\number\ST@colcount @\number\ST@rowcount}% y a t-il un code défini après le multicol ? + {\STadd@tomacro\ST@tab&}% on ajoute la tabulation {}% \else% pas de \multicolumn - \unless\ifST@hiddencol% si la cellule n'est pas masqu\'ee - \unless\ifnum\ST@colcount>\ST@lastshowcol% si ce n'est pas la derni\`ere cellule affich\'ee - \ST@add@tomacro\ST@tab&%on ajoute la tabulation + \unless\ifST@hiddencol% si la cellule n'est pas masquée + \unless\ifnum\ST@colcount>\ST@lastshowcol% si ce n'est pas la dernière cellule affichée + \STadd@tomacro\ST@tab&%on ajoute la tabulation \fi \fi \fi}% {\ST@ifvalid@csname{endrow@\number\ST@rowcount}% {\expandafter\ST@expadd@tomacro\expandafter\ST@tab\csname endrow@\number\ST@rowcount\endcsname}% ajoute la fin de la ligne {}% - \ST@colcount\@ne% on remet la colonne \'a 1 - \advance\ST@rowcount\@ne% on passe \'a la ligne suivante + \ST@colcount\@ne% on remet la colonne à 1 + \advance\ST@rowcount\@ne% on passe à la ligne suivante }% }% \fi \ST@nextcell } -% format des lettres et nombres repr\'esentant les coordonn\'ees (helvetica gras tr\`es petit) +% format des lettres et nombres représentant les coordonnées (helvetica gras très petit) \def\ST@debugformat@headers{\usefont{T1}{phv}{b}{n}} -% format utilis\'e pour les cellules +% format utilisé pour les cellules \def\ST@debug@format@cells{\usefont{T1}{lmtt}{m}{n}} \def\ST@colorcell{\ifST@colortblloaded\noexpand\cellcolor[gray]{.6}\fi} \def\STdebug#1{% - \ST@debugmodetrue% on se met en mode d\'ebogage + \ST@debugmodetrue% on se met en mode débogage \begingroup \def\ST@debuginfo{#1}% \ifmmode\scriptscriptstyle\else\scriptsize\fi @@ -1740,11 +1805,11 @@ \ST@edefadd@tomacro\ST@debugtab{\noexpand\multicolumn1c{\ST@colorcell\noexpand\ST@debugformat@headers\@Alph\ST@colcount}}% \ifnum\ST@colcount<\ST@lastshowcol \advance\ST@colcount\@ne - \ST@add@tomacro\ST@debugtab&% + \STadd@tomacro\ST@debugtab&% \repeat \ST@colcount\@ne \ST@edefadd@tomacro\ST@debugtab{% - &% passe \'a la derni\`ere colonne de la premi\`ere ligne + &% passe à la dernière colonne de la première ligne \noexpand\multicolumn1l{% \ifx\ST@temp@a\ST@debuginfo \ST@ifvalid@csname{endrow@\number\ST@rowcount}% @@ -1756,25 +1821,25 @@ \ST@debug@tab@i } -\def\ST@debug@tab@i{% affiche le tableau de d\'ebobage +\def\ST@debug@tab@i{% affiche le tableau de débobage \ifnum\ST@rowcount>\ST@total@rownumber \ST@edefadd@tomacro\ST@debugtab{\noexpand\cline{2-\number\numexpr\ST@lastshowcol+1}\noexpand\end{tabular}}% - \ST@debugtab% affichage du tableau de d\'ebogage - \ifmmode\\[0.5ex]\else\par\smallskip\fi% retour \'a la ligne + \ST@debugtab% affichage du tableau de débogage + \ifmmode\\[0.5ex]\else\par\smallskip\fi% retour à la ligne \expandafter\endgroup \else \ifnum\ST@colcount=\@ne \ST@edefadd@tomacro\ST@debugtab{% \noexpand\multicolumn1{c|}{\ST@colorcell\noexpand\ST@debugformat@headers\number\ST@rowcount}&}% \fi - \ifcsname\ST@debuginfo @\number\ST@colcount @\number\ST@rowcount\endcsname% si l'info existe pour la cellule concern\'ee + \ifcsname\ST@debuginfo @\number\ST@colcount @\number\ST@rowcount\endcsname% si l'info existe pour la cellule concernée \ifx\ST@temp@a\ST@debuginfo \expandafter\ST@subst\csname\ST@debuginfo @\number\ST@colcount @\number\ST@rowcount\endcsname|{}% \fi - \ST@edefadd@tomacro\ST@debugtab{\detokenize\expandafter\expandafter\expandafter{\csname\ST@debuginfo @\number\ST@colcount @\number\ST@rowcount\endcsname}}% on ajoute la cellule au tableau que l'on a detokenis\'ee au pr\'ealable + \ST@edefadd@tomacro\ST@debugtab{\detokenize\expandafter\expandafter\expandafter{\csname\ST@debuginfo @\number\ST@colcount @\number\ST@rowcount\endcsname}}% on ajoute la cellule au tableau que l'on a detokenisée au préalable \fi - \advance\ST@colcount\@ne% on passe \'a la colonne suivante ! - \ifnum\ST@colcount>\ST@lastshowcol% si c'est la derni\`ere cellule affich\'ee + \advance\ST@colcount\@ne% on passe à la colonne suivante ! + \ifnum\ST@colcount>\ST@lastshowcol% si c'est la dernière cellule affichée \ST@edefadd@tomacro\ST@debugtab{% &\noexpand\multicolumn1l{% \ifx\ST@temp@a\ST@debuginfo @@ -1783,10 +1848,10 @@ {}% \fi}% \noexpand\\\noexpand\cline{2-\number\numexpr\ST@lastshowcol+1}}% - \ST@colcount\@ne% on remet la colonne \'a 1 - \advance\ST@rowcount\@ne% on passe \'a la ligne suivante + \ST@colcount\@ne% on remet la colonne à 1 + \advance\ST@rowcount\@ne% on passe à la ligne suivante \else% il reste encore des cellules dans la ligne - \ST@add@tomacro\ST@debugtab&% on ajoute la tabulation + \STadd@tomacro\ST@debugtab&% on ajoute la tabulation \fi \expandafter\ST@debug@tab@i \fi @@ -1796,16 +1861,16 @@ %%%%%%%%%%%%%%%%%% Environnement spreadtab et macros publiques %%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% d\'efinit quelle sera le s\'equence de conytr\^ole qui finira les lignes +% définit quelle sera le séquence de conytrôle qui finira les lignes % dans les tableaux de spreadtab \def\STeol#1{\def\ST@eol{#1}} \STeol\\ -% renvoie la valeur num\'erique de la cellule de tag #1 +% renvoie la valeur numérique de la cellule de tag #1 \def\STtag#1{% \ifcsname ST@celltag@\detokenize\expandafter{#1}\endcsname\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi {\csname ST@celltag@\detokenize\expandafter{#1}\endcsname} - {\PackageError\STname{Tag "#1" is unknown, have you defined it?}\ST@seedoc@i + {\PackageError\STname{Tag "#1" is unknown, have you defined it?}\STseedoc@i }% } @@ -1821,31 +1886,31 @@ \global\expandafter\let\csname ST@celltag@\detokenize\expandafter{#1}\expandafter\endcsname \csname ST@celltag@\detokenize\expandafter{#1}\endcsname \else - \PackageError\STname{Tag "#1" is unknown, have you defined it?}\ST@seedoc@i + \PackageError\STname{Tag "#1" is unknown, have you defined it?}\STseedoc@i \fi \fi \expandafter\STmakegtag@i \fi } -% d\'efinit le s\'eparateur d\'ecimal +% définit le séparateur décimal \def\STsetdecimalsep#1{\def\ST@decsep{#1}} -\def\ST@decsepfp{.}% le s\'eparateur d\'ecimal donn\'e par fp -\STsetdecimalsep.% le point par d\'efaut +\def\ST@decsepfp{.}% le séparateur décimal donné par fp +\STsetdecimalsep.% le point par défaut -\STmessage{true}% affiche les messages par d\'efaut +\STmessage{true}% affiche les messages par défaut \newif\ifST@clipround \def\STautoround{\@ifstar{\ST@cliproundfalse\ST@autoround}{\ST@cliproundtrue\ST@autoround}} -\def\ST@autoround#1{\def\ST@rounddigit{#1}} -\STautoround{}% pas d'arrondi par d\'efaut +\def\ST@autoround#1{\def\STrounddigit{#1}} +\STautoround{}% pas d'arrondi par défaut -\def\STsavecell#1#2{% met dans la sc #1 la valeur du champ num\'erique de la cellule sp\'ecifi\'ee par sa r\'ef\'erence ABSOLUE +\def\STsavecell#1#2{% met dans la sc #1 la valeur du champ numérique de la cellule spécifiée par sa référence ABSOLUE \def\ST@temp@ref{#2}% \ST@ifref\ST@temp@ref{}\ST@illegal@ref \ST@Ifinstr\ST@temp@ref[\ST@illegal@ref{}% - \expandafter\let\expandafter#1\csname formula@\ST@temp@formula\endcsname% le nombre est assign\'e \'a #1 - \unless\ifx\ST@decsep\ST@decsepfp\ST@substdecsep#1\fi% et si le "." doit \^etre remplac\'e par "," on substitue + \ST@cslet#1{formula@\ST@temp@formula}% le nombre est assigné à #1 + \unless\ifx\ST@decsep\ST@decsepfp\ST@substdecsep#1\fi% et si le "." doit être remplacé par "," on substitue \global\let#1#1% on rend l'assignation globale } @@ -1856,7 +1921,7 @@ \ifx\ST@temp@a\STname \expandafter\spreadtab@i \else - \ST@add@tomacro\ST@tab{\end{#1}}% + \STadd@tomacro\ST@tab{\end{#1}}% \expandafter\ST@get@body@env \fi } @@ -1871,20 +1936,22 @@ \let\ST@get@body\ST@get@body@cs \fi \let\ST@FPmessages\ifFPmessages - \ifST@message\FPmessagesfalse\fi% pas de message de calcul de FP - \saveexpandmode\expandarg% 1-d\'eveloppement des arguments (r\'eglages de xstring) - \saveexploremode\noexploregroups% pas d'exploration des groupes (r\'eglages de xstring) + \if@STfpactive\ifST@message\FPmessagesfalse\fi\fi% pas de message de calcul de FP + \saveexpandmode\expandarg% 1-développement des arguments (réglages de xstring) + \saveexploremode\noexploregroups% pas d'exploration des groupes (réglages de xstring) \edef\ST@catocde@saved{\catcode`:=\the\catcode`:\relax\catcode`;=\the\catcode`;\relax}% - \@makeother\:\@makeother\;% changer les catcodes pour \'eviter les incompatibilit\'es avec frenchb - \def\ST@tab@preamble{#2}% pr\'eambule du tableau + \@makeother\:\@makeother\;% changer les catcodes pour éviter les incompatibilités avec frenchb + \def\ST@tab@preamble{#2}% préambule du tableau \StrChar{\@empty#2}\@ne[\ST@tab@name]% \def\ST@optcode{#1}% \let\ST@copylist\@empty \let\ST@row@skiplist\@empty \let\ST@col@skiplist\@empty \def\ST@laST@skipcol{0}% - \edef\ST@previous@seed{\number\FPseed}% sauvegarde de la graine - \ST@seed% graine variable + \if@STfpactive + \edef\ST@previous@seed{\number\FPseed}% sauvegarde de la graine + \STseed% graine variable + \fi \ST@emit@message{^^JNew spreadtab: \string\begin\detokenize{#2}^^J* reading tab:}% \let\ST@tab\@empty \ST@get@body% met le code du tableau dans \ST@tab @@ -1895,24 +1962,24 @@ \let\ST@ref@found\@empty \ST@read@tab% analyse le tableau contenu dans \ST@tab \ST@emit@message{ok^^J}% - \ST@search@lastshowcol% cherche la derni\`ere colonne affich\'ee - \ST@debugmodefalse% \'a priori, on n'est pas en mode d\'ebogage + \ST@search@lastshowcol% cherche la dernière colonne affichée + \ST@debugmodefalse% à priori, on n'est pas en mode débogage \let\ST@savecell\STsavecell \let\STsavecell\@gobbletwo \let\STdisplaytab\relax - \ST@optcode% ex\'ecute l'argument optionnel en ne tenant compte que de \STdebug + \ST@optcode% exécute l'argument optionnel en ne tenant compte que de \STdebug \let\STdebug\@gobble \def\STdisplaytab{% \ST@debugmodefalse \ST@emit@message{\space\space\space\space\space Debug mode: display final tab^^J}% \let\STdisplaytab\relax }% - \ST@optcode% ex\'ecute l'argument optionnel en ne tenant compte que de \STdisplaytab s'il y figure + \ST@optcode% exécute l'argument optionnel en ne tenant compte que de \STdisplaytab s'il y figure \unless\ifST@debugmode% si on doit afficher le tableau, on fait le boulot \ST@emit@message{* computing formulas:^^J}% - \ST@eval@tab + \STeval@tab \let\STsavecell\ST@savecell - \ST@optcode% ex\'ecute l'argument optionnel en ne tenant compte que de \STsavecell + \ST@optcode% exécute l'argument optionnel en ne tenant compte que de \STsavecell \expandafter\def\expandafter\ST@tab\expandafter{\expandafter\begin\ST@tab@preamble}% \ST@emit@message{* building tab:}% \ST@build@tab @@ -1921,7 +1988,7 @@ \expandafter\ST@tab% affiche le tableau \fi \ST@emit@message{End of spreadtab: \string\end\detokenize\expandafter{\ST@tab@name}^^J^^J}% - \FPseed\ST@previous@seed% restauration de la graine + \if@STfpactive\FPseed\ST@previous@seed\fi% restauration de la graine \let\ifFPmessages\ST@FPmessages \restoreexpandmode\restoreexploremode \ST@catocde@saved @@ -1952,6 +2019,7 @@ } \def\ST@undef@content{\ST@undef@content} + \endinput %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1962,161 +2030,164 @@ v0.1alpha avril 2009 v0.1beta1 2009/06/06 ------------------------------------------------------------------------------- v0.1beta2 2009/06/07 - 1 Une valeur n\'egative dans une cellule provoque un bug. - Les valeurs n\'egatives sont d\'esormais mises entre parenth\`eses - 2 Espaces supprim\'es en d\'ebut de formules. + 1 Une valeur négative dans une cellule provoque un bug. + Les valeurs négatives sont désormais mises entre parenthèses + 2 Espaces supprimés en début de formules. ------------------------------------------------------------------------------- v0.1beta3 2009/06/12 - 1 Espaces laiss\'es dans les formules pour pouvoir utiliser la notation - postfix\'ee de fp. - 2 Les r\'ef\'erences ne sont plus «@(B4)» mais indiff\'eremment «b4» ou - «B4». - 3 R\'ef\'erences relatives possibles par [x,y] ou x et y sont les - d\'ecalages de la colonne et de la ligne par rapport \'a la cellule - o\`u est la formule. - 4 Bugs corrig\'es pour rendre le package compatible avec tabularx ou + 1 Espaces laissés dans les formules pour pouvoir utiliser la notation + postfixée de fp. + 2 Les références ne sont plus «@(B4)» mais indifféremment «b4» ou + «B4». + 3 Références relatives possibles par [x,y] ou x et y sont les + décalages de la colonne et de la ligne par rapport à la cellule + où est la formule. + 4 Bugs corrigés pour rendre le package compatible avec tabularx ou tabulary (entre autres). ------------------------------------------------------------------------------- v0.1beta4 2009/06/21 - 1 Les espaces sont supprim\'es au d\'ebut de chaque cellule, cela - cr\'eait un bug lorsque la cellule commençait par un nombre n\'egatif. - 2 Mise en place de la compatibilit\'e avec la commande - \multicolumn{nbre}{type}{contenu} du package \'eponyme - 3 Possibilit\'e de masquer des lignes ou des colonnes enti\`eres avec les + 1 Les espaces sont supprimés au début de chaque cellule, cela + créait un bug lorsque la cellule commençait par un nombre négatif. + 2 Mise en place de la compatibilité avec la commande + \multicolumn{nbre}{type}{contenu} du package éponyme + 3 Possibilité de masquer des lignes ou des colonnes entières avec les commandes \SThiderow et \SThidecol - Seule condition : aucune colonne masqu\'ee ne doit se trouver dans les - colonnes impliqu\'ees dans un \multicolum \'a moins de prendre de - grandes pr\'ecautions et savoir les cons\'equences que cela occasionne. + Seule condition : aucune colonne masquée ne doit se trouver dans les + colonnes impliquées dans un \multicolum à moins de prendre de + grandes précautions et savoir les conséquences que cela occasionne. ------------------------------------------------------------------------------- v0.1beta5 2009/06/29 - 1 Am\'elioration des messages d'erreur et d'information + 1 Amélioration des messages d'erreur et d'information 2 Suppression de tests superflus - 3 Red\'efinition de \STtextcell en «@» qui est plus simple - 4 Impl\'ementation de \STsavecell - 5 \'Ecriture de la documentation provisoire en français + 3 Redéfinition de \STtextcell en «@» qui est plus simple + 4 Implémentation de \STsavecell + 5 écriture de la documentation provisoire en français ------------------------------------------------------------------------------- v0.1beta6 2009/08/23 - 1 Correction d'un bug : dans une cellule, on ne pouvait pas \'ecrire - plusieurs fois la m\^eme r\'ef\'erence. - 2 Correction d'un bug avec \multicolumn : cette commande \'etait mal - g\'er\'ee lorsqu'employ\'ee avec une cellule de texte. - 3 Impl\'ementation de macro-fonctions avec diff\'erenciation selon le - type d'argument et le type de donn\'ee renvoy\'ee. - 4 Possibilit\'e d'imbrication des macro-fonctions. - 5 Mise en place d'un environnement « spreadtab » - 6 Nombreuses optimisations pour une meilleure vitesse d'ex\'ecution + 1 Correction d'un bug : dans une cellule, on ne pouvait pas écrire + plusieurs fois la même référence. + 2 Correction d'un bug avec \multicolumn : cette commande était mal + gérée lorsqu'employée avec une cellule de texte. + 3 Implémentation de macro-fonctions avec différenciation selon le + type d'argument et le type de donnée renvoyée. + 4 Possibilité d'imbrication des macro-fonctions. + 5 Mise en place d'un environnement « spreadtab » + 6 Nombreuses optimisations pour une meilleure vitesse d'exécution ------------------------------------------------------------------------------- v0.1pre 2009/09/02 - 1 Mise au point des messages d'erreurs et des arr\^ets de compilation - selon les erreurs rencontr\'ees. + 1 Mise au point des messages d'erreurs et des arrêts de compilation + selon les erreurs rencontrées. 2 Correction d'un bug dans \ST@coord@toref 3 Les cellules vides, textuelles ou jointes par un \multicolumn sont - ignor\'ees dans les plages de cellules concern\'ees par les fonctions + ignorées dans les plages de cellules concernées par les fonctions sum et sumprod - 4 Les noms de mois accentu\'es et \today sont d\'esormais permis en + 4 Les noms de mois accentués et \today sont désormais permis en argument de la fonction frlongdatetonum - 5 somprod corrig\'e en sumprod, plus anglais ! - 6 La macro fonction rnd, trop complexe est supprim\'ee au profit de rand + 5 somprod corrigé en sumprod, plus anglais ! + 6 La macro fonction rnd, trop complexe est supprimée au profit de rand et randint - 7 Am\'eliorations et optimisations + 7 Améliorations et optimisations ------------------------------------------------------------------------------- -v0.1 2009/11/03 Premi\`ere version publique sur le CTAN +v0.1 2009/11/03 Première version publique sur le CTAN ------------------------------------------------------------------------------- v0.2 2010/01/24 - 1 On peut d\'efinir le s\'eparateur d\'ecimal par la macro - \STsetdecimalsep{<caract\`ere>} - 2 Il est possible de copier une formule dans le tableau \'a l'aide de - \STcopy{>a,vb}{formule} o\`u a et b sont les nombres de cellules - horizontaux et verticaux vers lesquels la formule sera copi\'ee. - 3 D\'esormais, spreadtab est enti\`erement compatible avec toutes les + 1 On peut définir le séparateur décimal par la macro + \STsetdecimalsep{<caractère>} + 2 Il est possible de copier une formule dans le tableau à l'aide de + \STcopy{>a,vb}{formule} où a et b sont les nombres de cellules + horizontaux et verticaux vers lesquels la formule sera copiée. + 3 Désormais, spreadtab est entièrement compatible avec toutes les commandes du package booktabs 4 La commande \noalign et son argument est prise en compte lorsqu'elle se - trouve apr\`es un \\ - 5 Suppression d'espaces ind\'esirables - 6 Mise en place d'un mode d\'ebogage o\`u l'on peut visualiser les champs - num\'eriques, les champs textuels ou les codes des cellules du tableau + trouve après un \\ + 5 Suppression d'espaces indésirables + 6 Mise en place d'un mode débogage où l'on peut visualiser les champs + numériques, les champs textuels ou les codes des cellules du tableau ------------------------------------------------------------------------------- v0.2a 2010/02/02 1 Ajout de la traduction en vietnamien et correction d'erreurs dans la - documentation française. + documentation française. 2 Implementation beta et donc non visible des macros fonctions gcd, lcm - Ces macro-fonctions ne sont pas encore document\'ees. + Ces macro-fonctions ne sont pas encore documentées. ------------------------------------------------------------------------------- v0.3 2010/03/28 - 1 La macro \STautoround{x} admet une version \'etoil\'ee pour laquelle - les nombres sont arrondis et format\'es pour avoir x chiffres apr\`es + 1 La macro \STautoround{x} admet une version étoilée pour laquelle + les nombres sont arrondis et formatés pour avoir x chiffres après la virgule en rajoutant des 0 inutiles si besoin - 2 La valeur sauvegard\'ee par \STsavecell tient d\'esormais compte du - s\'eparateur d\'ecimal + 2 La valeur sauvegardée par \STsavecell tient désormais compte du + séparateur décimal 3 Macro fonctions "gcd" (PGCD), "lcm" (PPCM) et "scitodec" pour convertir - une \'ecriture scientifique en une \'ecriture d\'ecimale - 4 Dans le champ textuel d'une cellule, on peut d\'esormais afficher le - champ num\'erique d'une cellule avec <<ref>> - 5 Am\'elioration de l'algorithme pour \STcopy : enleve une formule de - \ST@copylist lorsqu'on a d\'epass\'e la derni\`ere ligne de la plage - o\`u elle doit \^etre copi\'ee + une écriture scientifique en une écriture décimale + 4 Dans le champ textuel d'une cellule, on peut désormais afficher le + champ numérique d'une cellule avec <<ref>> + 5 Amélioration de l'algorithme pour \STcopy : enleve une formule de + \ST@copylist lorsqu'on a dépassé la dernière ligne de la plage + où elle doit être copiée 6 Correction d'un bug lorsque la macro-fonction admettant un argument - textuel a un argument faisant r\'ef\'erence \'a une autre cellule : + textuel a un argument faisant référence à une autre cellule : enlever ":=" si besoin 7 Correction d'un bug dans xstring qui changeait les catcodes des tokens de \@xs@afterinteger lorsqu'on appelle \IfInteger 8 Correction d'un bug dans \ST@build@tab@i pour prendre en compte les - cellules de code 0 dans lesquelles ":=" doit \^etre supprim\'e + cellules de code 0 dans lesquelles ":=" doit être supprimé ------------------------------------------------------------------------------- v0.3a 2010/05/15 - 1 Correction d'un bug dans \ST@gobble@remain : ce qui reste \'a manger + 1 Correction d'un bug dans \ST@gobble@remain : ce qui reste à manger peut contenir des tokens de catcode 1 ou 2 ce qui fait que - l'utilisation d'arguments d\'elimit\'es ne fonctionnerait pas dans ces + l'utilisation d'arguments délimités ne fonctionnerait pas dans ces cas. ------------------------------------------------------------------------------- v0.3b 2010/06/06 1 Correction d'un bug concernant les macro-fonctions renvoyant un texte. - Lorsque leur argument contenait une r\'ef\'erence, celle-ci devenait + Lorsque leur argument contenait une référence, celle-ci devenait une cellule texte. 2 Correction d'un bug sur la macro \ST@stackcall : il faut y enlever - toutes les occurrences de la cellule en train d'\^etre calcul\'ee - 3 Modification de l'ordre de calcul des cellules concern\'ees par les + toutes les occurrences de la cellule en train d'être calculée + 3 Modification de l'ordre de calcul des cellules concernées par les macro fonctions sum et somprod - 4 Correction d'un bug dans la façon dont sont produites les skiplist + 4 Correction d'un bug dans la façon dont sont produites les skiplist \ST@row@skiplist et \STcol@skiplist - 5 Impl\'ementation de la macro fonction "id" + 5 Implémentation de la macro fonction "id" ------------------------------------------------------------------------------- v0.3c 2011/04/08 - 1 Correction d'un gros bug lors de la substitution d'une r\'ef\'erence de - type <lettre><nbre> lorsque nbre>10 : a10 \'etait vu comme "a1" suivi - de 0, et m\^eme pour tous les nbre>10 ! + 1 Correction d'un gros bug lors de la substitution d'une référence de + type <lettre><nbre> lorsque nbre>10 : a10 était vu comme "a1" suivi + de 0, et même pour tous les nbre>10 ! 2 Macro \STprintnum ------------------------------------------------------------------------------- v0.4 2011/07/04 - 1 Les calculs se font en dehors d'un groupe pour \'eviter l'erreur de + 1 Les calculs se font en dehors d'un groupe pour éviter l'erreur de save-satck - 2 Possibilit\'e d'\'ecrire aussi \spreadtab<code tableau>\endspreadtab + 2 Possibilité d'écrire aussi \spreadtab<code tableau>\endspreadtab 3 Macros fonctions tag, cell, row, col et la macro \STtag qui permet de - faire appel \`a la valeur de la cellule marqu\'ee par la macro fonction + faire appel à la valeur de la cellule marquée par la macro fonction tag. \STmakegtag rend les sauvegardes globales. 4 La commande \STeol permet de choisir quel est le marqueur de fin de ligne dans les tableau de spreadtab 5 dans une cellule mixte, les macro fonctions renvoyant du texte ont leur - r\'esultat qui prend la place de :={<formule>} + résultat qui prend la place de :={<formule>} ------------------------------------------------------------------------------- v0.4a 2011/08/11 - 1 Un bug corrig\'e dans \ST@search@hline@i + 1 Un bug corrigé dans \ST@search@hline@i ------------------------------------------------------------------------------- v0.4b 2012/05/13 - 1 Un bug corrig\'e dans \ST@func@sum + 1 Un bug corrigé dans \ST@func@sum ------------------------------------------------------------------------------- v0.4c 2014/11/06 - 1 Un bug corrig\'e dans \ST@analyse@text@frdate et - \ST@analyse@text@engdate : si #1 commence par un espace parasite, - celui-ci est d\'esormais retir\'e. - 2 Bug corrig\'e dans \ST@displaynumfields : les macros - \ST@current@colnumber et \ST@current@rownumber sont d\'efinies avant - d'appeler \ST@ifref + 1 Un bug corrigé dans \ST@analyse@text@frdate et + \ST@analyse@text@engdate : si #1 commence par un espace parasite, + celui-ci est désormais retiré. + 2 Bug corrigé dans \ST@displaynumfields : les macros + \ST@current@colnumber et \ST@current@rownumber sont définies avant + d'appeler \ST@ifref ------------------------------------------------------------------------------- v0.4d 2018/01/02 - 1 Bug corrig\'e dans \ST@eval@cell : le \edef\ST@dependance@tree corrige - le \def ! - 2 Ajout d'un message d'erreur si une la fonction sum a une plage qui - contient la cellule courante elle-m\^eme - 3 Nouvelle macro fonction "value" - 4 Nettoyage du code
\ No newline at end of file + 1 Bug corrigé dans \STeval@cell : le \edef\ST@dependance@tree corrige + le \def ! + 2 Ajout d'un message d'erreur si une la fonction sum a une plage qui + contient la cellule courante elle-même + 3 Nouvelle macro fonction "value" + 4 Nettoyage du code + ------------------------------------------------------------------------------- +v0.5 2019/02/27 + 1 Choix du moteur de calcul : fp ou xfp
\ No newline at end of file |