diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/spreadtab')
-rw-r--r-- | Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty | 94 |
1 files changed, 61 insertions, 33 deletions
diff --git a/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty b/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty index 3b82d43ee65..049a2910181 100644 --- a/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty +++ b/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty @@ -1,9 +1,9 @@ % ____________________________________________________________________________ % | | % | | -% | spreadtab v0.3a | +% | spreadtab v0.3b | % | | -% | May 15, 2010 | +% | June 6, 2010 | % | | % |___________________________________________________________________________| % @@ -37,10 +37,10 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%% Définitions préalables %%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\newcommand\ST@ver {0.3a} -\newcommand\ST@date {2010/05/15} -\newcommand\ST@fr@date {15 mai 2010} -\newcommand\ST@eng@date{May $15^\text{th}$ 2010} +\newcommand\ST@ver {0.3b} +\newcommand\ST@date {2010/06/06} +\newcommand\ST@fr@date {6 juin 2010} +\newcommand\ST@eng@date{June $6^\text{th}$ 2010} \ProvidesPackage{spreadtab}[\ST@date\space v\ST@ver\space Spreadsheet features for table environments] \NeedsTeXFormat{LaTeX2e} @@ -345,7 +345,7 @@ \let\ST@next@readrows\relax \edef\ST@total@rownumber{\number\ST@rowcount}}% \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 + {\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]% }% \relax @@ -365,9 +365,9 @@ \let\ST@next@readcells\relax \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,}{\number\ST@colcount,}% ça a déjà été demandé ? + {\ST@Ifinstr\ST@col@skiplist{\expandafter(\number\ST@colcount)}% ça a déjà été demandé ? \relax% on fait rien - {\edef\ST@col@skiplist{\number\ST@colcount,\ST@col@skiplist}% sinon -> ajout à 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]% @@ -447,7 +447,7 @@ }% \noexploregroups \unless\ifnum\csname code@\number\ST@colcount @\number\ST@rowcount\endcsname=\z@% si le code est <> 0 - \ST@try@calc@cell(\number\ST@colcount,\number\ST@rowcount)% on essaie de calculer la cellule en cours TODO : bug + \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 @@ -861,7 +861,6 @@ {% \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}% - \let\ST@nexteval\ST@next@onstack% à priori, on regarde à la fin s'il reste quelque chose sur la pile d'appels \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)}% @@ -873,9 +872,13 @@ \ST@calc@cell(#1,#2)% on calcule la cellule en cours \else \ST@Ifinstr{\ST@functions@with@textresult,}{\ST@function@namesaved,}% si la dernière fonction rend du texte - {\@namedef{code@#1@#2}{0}% on met le code à 0, la cellule devient textuelle - \expandafter\let\csname text@#1@#2\expandafter\endcsname\csname formula@#1@#2\endcsname% copie de la formule vers la zone texte (avec écrasement de ce qui s'y trouvait) - \ST@letname{formula@#1@#2}\@empty% et plus rien dansla formule + {\ifx\ST@stackcall\@empty% et si on est dans la cellule source + \@namedef{code@#1@#2}{0}% on met le code à 0, la cellule devient textuelle + \expandafter\let\csname text@#1@#2\expandafter\endcsname\csname formula@#1@#2\endcsname% copie de la formule vers la zone texte (avec écrasement de ce qui s'y trouvait) + \ST@letname{formula@#1@#2}\@empty% et plus rien dansla formule + \else + \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érique : on calcule la cellule en cours \fi @@ -897,7 +900,7 @@ \relax % 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 - \def\ST@nexteval{\ST@eval@cell@i(#1,#2)}% puis, on évalue à 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ées de la cellule appelante \ST@subst\ST@coord @,% coordonnées appelées @@ -923,11 +926,11 @@ \ST@Ifinstr{\ST@functions@no@calc@arg,}{\ST@function@namefound,}% doit-on calculer l'argument de cette fonction ? \relax {\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 évalue la fonction + \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)}}\relax \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 - \def\ST@nexteval{\ST@eval@cell@i(#1,#2)}% puis, on évalue à nouveau cette cellule + \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule \else \ifnum\csname code@\ST@temp@formula\endcsname=\tw@% si la référence est calculée, on la replace par sa valeur \expandafter\let\expandafter\ST@current@formula\csname formula@\ST@temp@formula\endcsname% alias pour la formule distante @@ -938,7 +941,7 @@ \let\ST@replaced\ST@tobereplaced \ST@expsubst\ST@replaced\ST@ref@found\ST@current@formula \expandafter\ST@expsubst\csname formula@#1@#2\endcsname\ST@tobereplaced\ST@replaced - \def\ST@nexteval{\ST@eval@cell@i(#1,#2)}% puis, on évalue à nouveau cette cellule + \edef\ST@stackcall{(#1,#2)\ST@stackcall}% \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 @@ -952,7 +955,7 @@ \ST@Iffirstis\ST@result@func-{\expandafter\def\expandafter\ST@result@func\expandafter{\expandafter(\ST@result@func)}}\relax \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 - \def\ST@nexteval{\ST@eval@cell@i(#1,#2)}% puis, on évalue à 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 @@ -964,7 +967,7 @@ \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 - \def\ST@nexteval{\ST@eval@cell@i(#1,#2)}% puis, on évalue à nouveau cette cellule + \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 \expandafter\let\expandafter\ST@current@formula\csname text@\ST@temp@formula\endcsname% alias pour la zone texte distante @@ -974,14 +977,14 @@ \let\ST@tobereplaced\ST@function@namefound\ST@expadd@tomacro\ST@tobereplaced{\expandafter(\ST@function@argfound)}% \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 - \def\ST@nexteval{\ST@eval@cell@i(#1,#2)}% puis, on évalue à nouveau cette cellule + \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule \else \@latex@error{\ST@errname Macro function \ST@function@namefound\space requires a reference to a text cell!}\ST@seedoc@i \fi \fi \fi \fi - \expandafter\ST@nexteval + \expandafter\ST@next@onstack \fi } @@ -989,18 +992,27 @@ % Si oui, on enlève le 1er appel de la pile lifo et on l'exécute \newcommand\ST@next@onstack{% \unless\ifx\ST@stackcall\@empty - \ST@split\ST@stackcall)\ST@temp@a\ST@stackcall\ST@add@tomacro\ST@temp@a)% + \ST@split\ST@stackcall)\ST@temp@a\ST@stackcall + \ST@add@tomacro\ST@temp@a)% + \ST@sanitize@stack \expandafter\expandafter\expandafter\ST@eval@cell@i\expandafter\ST@temp@a \fi } +\newcommand\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}% + \relax +} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Macro-fonctions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % liste des fonctions dont l'argument est numérique \newcommand\ST@functions@with@num@arg{% - fact,ifeq,ifgt,iflt,numtofrshortdate,numtoengshortdate,numtofrlongdate,gcd,lcm,% + 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 @@ -1013,7 +1025,9 @@ \newcommand\ST@functions@with@text@arg{frshortdatetonum,engshortdatetonum,englongdatetonum,frlongdatetonum,scitodec} % liste des fonctions dont le résultat est un texte -\newcommand\ST@functions@with@textresult{numtofrshortdate,numtoengshortdate,numtofrlongdate,numtoenglongdate,numtofrmonth,numtoengmonth,numtofrday,numtoengday} +\newcommand\ST@functions@with@textresult{% + numtofrshortdate,numtoengshortdate,numtofrlongdate,numtoenglongdate,% + numtofrmonth,numtoengmonth,numtofrday,numtoengday} % liste totale des fonctions \edef\ST@functions@list{\ST@functions@with@num@arg,\ST@functions@with@range@arg,\ST@functions@with@text@arg} @@ -1112,7 +1126,7 @@ \edef\ST@openbrace@catcode{\number\catcode`\(}\edef\ST@closebrace@catcode{\number\catcode`\)}% \catcode`\(1 \catcode`\)2 \everyeof{\relax}\endlinechar\m@ne - \afterassignment\ST@gobble@remain% TODO bug + \afterassignment\ST@gobble@remain \expandafter\def\expandafter#2\scantokens\expandafter{#1}% \catcode`\(\ST@openbrace@catcode\catcode`\)\ST@closebrace@catcode \def\ST@assignarg##1\relax{\def#2{##1}}% @@ -1125,11 +1139,11 @@ \ST@for{#1}% on parcourt la <plage de cellules> {\ifcase\csname code@\number\ST@colcount@i @\number\ST@rowcount@i\endcsname% on ne prend en compte que les code 1 et 2 \or% code=1 - \edef\ST@temp@stack{(\number\ST@colcount@i,\number\ST@rowcount@i)\ST@temp@stack}% - \edef\ST@dependance@tree{\ST@dependance@tree(\number\ST@colcount@i,\number\ST@rowcount@i)}% mise à jour de l'arbre des dépendances + \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ées \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 à jour de l'arbre des dépendances \fi \fi }% @@ -1178,7 +1192,7 @@ {\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{(\number\ST@colcount@i,\number\ST@rowcount@i)\ST@temp@stack}% + \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 à 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 @@ -1190,7 +1204,7 @@ \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@tempcoord)\ST@temp@stack}% + \edef\ST@temp@stack{\ST@temp@stack(\ST@tempcoord)}% \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 @@ -1210,6 +1224,8 @@ \fi } +\newcommand\ST@func@id[2]{\expandafter\def\expandafter#2\expandafter{#1}} + % Calcule la factorielle du nombre #1 et met le résultat dans la sc #2 \newcommand\ST@func@fact[2]{% \FPifint{#1}% @@ -1494,7 +1510,7 @@ } \newcommand\ST@search@lastshowcol@i{% - \ST@Ifinstr{\ST@col@skiplist,}{\number\ST@colcount,}% + \ST@Ifinstr{\ST@col@skiplist}{\expandafter(\number\ST@colcount)}% {\advance\ST@colcount\m@ne\ST@search@lastshowcol@i}% {\edef\ST@lastshowcol{\number\ST@colcount}}% } @@ -1529,10 +1545,10 @@ \let\ST@nextcell\relax \else \let\ST@nextcell\ST@build@tab@i - \ST@Ifinstr\ST@row@skiplist{\number\ST@rowcount,}% la ligne fait partie de la skiplist ? + \ST@Ifinstr\ST@row@skiplist{\expandafter(\number\ST@rowcount)}% la ligne fait partie de la skiplist ? {\advance\ST@rowcount\@ne}% on passe à la ligne suivante {% - \ST@Ifinstr\ST@col@skiplist{\number\ST@colcount,}% la colonne fait partie de la skiplist ? + \ST@Ifinstr\ST@col@skiplist{\expandafter(\number\ST@colcount)}% la colonne fait partie de la skiplist ? \ST@hiddencoltrue {% \ST@hiddencolfalse @@ -1863,6 +1879,18 @@ v0.3a 2010/05/15 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é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é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'ê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 + \ST@row@skiplist et \STcol@skiplist + 5 Implémentation de la macro fonction "id" ############################################################################### # TODO list # ############################################################################### |