diff options
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty | 1104 |
1 files changed, 641 insertions, 463 deletions
diff --git a/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty b/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty index 39cd205b573..b7bfbfba56a 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.3c | +% | spreadtab v0.4 | % | | -% | April 8, 2011 | +% | 4 July 2011 | % | | % |___________________________________________________________________________| % @@ -19,15 +19,15 @@ % spreadtab_doc_en.tex, spreadtab_doc_en.pdf (manual in english) % % ------------------------------------------------------------------- -% This work may be distributed and/or modified under the -% conditions of the LaTeX Project Public License, either version 1.3 -% of this license or (at your option) any later version. +% This work may be distributed and/or modified under the conditions of the +% LaTeX Project Public License, either version 1.3 of this license or (at your +% option) any later version. % The latest version of this license is in % % http://www.latex-project.org/lppl.txt % -% and version 1.3 or later is part of all distributions of LaTeX -% version 2005/12/01 or later. +% and version 1.3 or later is part of all distributions of LaTeX version +% 2005/12/01 or later. % ------------------------------------------------------------------- % This work has the LPPL maintenance status `maintained'. % @@ -35,17 +35,17 @@ % ------------------------------------------------------------------- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%% D\'efinitions pr\'ealables %%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%% D\'efinitions pr\'ealables %%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\newcommand\ST@ver {0.3c} -\newcommand\ST@date {2011/04/08} -\newcommand\ST@fr@date {8 avril 2011} -\newcommand\ST@eng@date{April $8^\text{th}$ 2011} +\newcommand\ST@ver {0.4} +\newcommand\ST@date {2011/07/04} +\newcommand\ST@fr@date {4 juillet 2011} +\newcommand\ST@eng@date{4 July 2011} \ProvidesPackage{spreadtab}[\ST@date\space v\ST@ver\space Spreadsheet features for table environments] \NeedsTeXFormat{LaTeX2e} \RequirePackage{fp}% pour les calculs scientifiques -\RequirePackage{xstring}[2010/0/28]% version n\'ecessaire +\RequirePackage{xstring}[2010/03/28]% version n\'ecessaire \newcount\ST@count \newcount\ST@colcount @@ -60,107 +60,113 @@ \AtBeginDocument{\@ifpackageloaded{colortbl}\ST@colortblloadedtrue\ST@colortblloadedfalse} % D\'efinit le marqueur qui signale le commencement du champ num\'erique -\newcommand\STnumericfieldmarker{:=} +\newcommand*\STnumericfieldmarker{:=} % D\'efinit la macro qui va afficher les valeurs num\'eriques dans le tableau \newcommand\STprintnum[1]{#1} % D\'efinit les caract\`eres entre lesquels doivent entre envelopp\'ees les r\'ef\'erences des cellules % que l'on veut afficher dans les champs textuels -\newcommand\STsetdisplaymarks[2]{% +\newcommand*\STsetdisplaymarks[2]{% \def\ST@startdisplay{#1}\def\ST@enddisplay{#2}% } \STsetdisplaymarks{<<}{>>}% d\'elimiteurs par d\'efaut % d\'efinit le marqueur qui signale une cellule de texte -\makeatother\newcommand\STtextcell{@}\makeatletter +\makeatother\newcommand*\STtextcell{@}\makeatletter % 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 -\AtBeginDocument{\newcommand\STtransposecar{!}} +\AtBeginDocument{\newcommand*\STtransposecar{!}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Messages d'erreur %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newif\ifST@message -\newcommand\ST@errname{[spreadtab] } +\def\ST@package@name{spreadtab} -\newcommand\STmessage[1]{% #1 = true ou false pour autoriser ou pas les messages +\newcommand*\STmessage[1]{% #1 = true ou false pour autoriser ou pas les messages \csname ST@message#1\endcsname } -\newcommand\ST@emit@message[1]{\ifST@message\message{#1}\fi} +\newcommand*\ST@emit@message[1]{\ifST@message\message{#1}\fi} -\newcommand\ST@seedoc@i{Please, read the manual.} +\newcommand*\ST@seedoc@i{Please, read the manual.} -\newcommand\ST@circular@reference{% +\newcommand*\ST@circular@reference{% \ST@coord@toref\ST@coord \let\ST@deptree\@empty \ST@show@dependance@tree - \@latex@error{\ST@errname circular reference found in cell \ST@coord!^^J + \PackageError\ST@package@name{circular reference found in cell \ST@coord!^^J Here is its dependant cells: \ST@deptree}\ST@seedoc@i\stop } -\newcommand\ST@undefined@cell{% +\newcommand*\ST@undefined@cell{% \ST@coord@toref\ST@temp@callcell \ST@coord@toref\ST@coord - \@latex@error{\ST@errname Undefined reference!^^J + \PackageError\ST@package@name{Undefined reference!^^J Cell \ST@temp@callcell\space contains a reference to an undefined cell: \ST@coord}\ST@seedoc@i\stop } -\newcommand\ST@zerocodecell@cell{% +\newcommand*\ST@zerocodecell@cell{% \ST@coord@toref\ST@temp@callcell \ST@coord@toref\ST@coord - \@latex@error{\ST@errname A reference to a non-numeric or empty cell is not allowed!^^J + \PackageError\ST@package@name{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\stop } -\newcommand\ST@multicol@cell{% +\newcommand*\ST@multicol@cell{% \ST@coord@toref\ST@temp@callcell \ST@coord@toref\ST@coord - \@latex@error{\ST@errname Cell \ST@temp@callcell\space contains a reference to a merged \string\multicolumn\space cell: \ST@coord}\ST@seedoc@i\stop + \PackageError\ST@package@name{Cell \ST@temp@callcell\space contains a reference to a merged \string\multicolumn\space cell: \ST@coord}\ST@seedoc@i } -\newcommand\ST@illegal@relativeref{% +\newcommand*\ST@illegal@relativeref{% \edef\ST@temp@callcell{\ST@current@colnumber,\ST@current@rownumber}% \ST@coord@toref\ST@temp@callcell - \@latex@error{\ST@errname Illegal relative reference found in cell \ST@temp@callcell!}\ST@seedoc@i + \PackageError\ST@package@name{Illegal relative reference found in cell \ST@temp@callcell!}\ST@seedoc@i\stop } -\newcommand\ST@illegal@ref{% - \@latex@error{\ST@errname Illegal reference in \string\STsavecell!}\ST@seedoc@i +\newcommand*\ST@illegal@ref{% + \PackageError\ST@package@name{Illegal reference in \string\STsavecell!}\ST@seedoc@i } -\newcommand\ST@unmatch@matrixdim{% +\newcommand*\ST@unmatch@matrixdim{% \edef\ST@temp@callcell{\ST@current@colnumber,\ST@current@rownumber}% \ST@coord@toref\ST@temp@callcell - \@latex@error{\ST@errname Somprod dimension of matrix do not match in cell \ST@temp@callcell!}\ST@seedoc@i + \PackageError\ST@package@name{Somprod dimension of matrix do not match in cell \ST@temp@callcell!}\ST@seedoc@i } -\newcommand\ST@fact@outofrange{% - \@latex@error{\ST@errname Argument of fact is not integer or is out of range!}\ST@seedoc@i +\newcommand*\ST@fact@outofrange{% + \PackageError\ST@package@name{Argument of fact is not integer or is out of range!}\ST@seedoc@i } \newcommand\ST@invalid@date{% \edef\ST@temp@callcell{\ST@current@colnumber,\ST@current@rownumber}% \ST@coord@toref\ST@temp@callcell - \@latex@error{\ST@errname Invalid date in cell \ST@temp@callcell.}\ST@seedoc@i + \PackageError\ST@package@name{Invalid date in cell \ST@temp@callcell.}\ST@seedoc@i } -\newcommand\ST@invalid@range{% +\newcommand*\ST@invalid@range{% \edef\ST@temp@callcell{\ST@current@colnumber,\ST@current@rownumber}% \ST@coord@toref\ST@temp@callcell - \@latex@error{\ST@errname Invalid range in cell \ST@temp@callcell.}\ST@seedoc@i\stop + \PackageError\ST@package@name{Invalid range in cell \ST@temp@callcell.}\ST@seedoc@i\stop } -\newcommand\ST@invalidSTcopy{% +\newcommand*\ST@invalidSTcopy{% \edef\ST@temp@callcell{\ST@current@colnumber,\ST@current@rownumber}% \ST@coord@toref\ST@temp@callcell - \@latex@error{\ST@errname Numeric field marker found, \string\STcopy\space forbidden in cell \ST@temp@callcell.}\ST@seedoc@i\stop + \PackageError\ST@package@name{Numeric field marker found, \string\STcopy\space forbidden in cell \ST@temp@callcell.}\ST@seedoc@i\stop +} + +\newcommand*\ST@unknown@tag{% + \edef\ST@temp@callcell{\ST@current@colnumber,\ST@current@rownumber}% + \ST@coord@toref\ST@temp@callcell + \PackageError\ST@package@name{Undefined tag in cell \ST@temp@callcell.}\ST@seedoc@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" -\newcommand\ST@show@dependance@tree{% +\newcommand*\ST@show@dependance@tree{% \ST@between\ST@dependance@tree()\ST@currentref \ST@right\ST@dependance@tree)\ST@dependance@tree \ST@coord@toref\ST@currentref @@ -172,30 +178,26 @@ } % transforme la s\'equence de contrôle #1 qui contient par exemple «4,5» en «D5» -\newcommand\ST@coord@toref[1]{% +\newcommand*\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}% } -\newcommand\ST@illegal@copy{% - \@latex@error{\ST@errname Illegal reference in copied formula!}\ST@seedoc@i +\newcommand*\ST@illegal@copy{% + \PackageError\ST@package@name{Illegal reference in copied formula!}\ST@seedoc@i } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% Macros d'affectation et d'expansion %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\newcommand\ST@letname[1]{\expandafter\let\csname#1\endcsname} +\newcommand*\ST@letname[1]{\expandafter\let\csname#1\endcsname} \newcommand\ST@exp@two@args[3]{% - \begingroup - \def\ST@tmpstr{#1}% - \ST@expadd@tomacro\ST@tmpstr{\expandafter{#2}}% - \ST@expadd@tomacro\ST@tmpstr{\expandafter{#3}}% - \expandafter\endgroup - \ST@tmpstr -% \expandafter\def\expandafter\ST@tmpstr\expandafter{\expandafter#1\expandafter{#2}}% -% \expandafter\ST@tmpstr\expandafter{#3}% + \def\ST@tmp@{#1}% + \ST@expadd@tomacro\ST@tmp@{\expandafter{#2}}% + \ST@expadd@tomacro\ST@tmp@{\expandafter{#3}}% + \ST@tmp@ } \newcommand\ST@add@tomacro[2]{\expandafter\def\expandafter#1\expandafter{#1#2}} @@ -203,8 +205,7 @@ \newcommand\ST@expadd@tomacro[2]{\expandafter\ST@add@tomacro\expandafter#1\expandafter{#2}} \newcommand\ST@edefadd@tomacro[2]{% - \begingroup\edef\ST@tmpstr{#2}\expandafter\endgroup - \expandafter\ST@add@tomacro\expandafter#1\expandafter{\ST@tmpstr}% + \edef#1{\unexpanded\expandafter{#1}#2}% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -216,7 +217,7 @@ } \def\ST@gobble@remain@i{% - \unless\ifx\ST@toks\relax\expandafter\ST@gobble@remain\fi + \unless\ifx\ST@toks\ST@nil\expandafter\ST@gobble@remain\fi } \newcommand\ST@splitatfirstcar[3]{% @@ -323,6 +324,18 @@ \newcommand\ST@removespaces[1]{\ST@subst#1{ }{}} +\newcommand\ST@ifvalid@csname[1]{% + \ifcsname#1\endcsname + \expandafter\ifx\csname#1\endcsname\ST@undef@content + \expandafter\expandafter\expandafter\@secondoftwo + \else + \expandafter\expandafter\expandafter\@firstoftwo + \fi + \else + \expandafter\@secondoftwo + \fi +} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Lecture du tableau %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -330,31 +343,32 @@ \newcommand\ST@read@tab{% \def\ST@total@colnumber{0}% \ST@rowcount\z@ - \ST@search@hline\ST@tab% on met de côt\'e la (ou les) ligne sup\'erieure du tableau + \ST@search@hline% on met de côt\'e la (ou les) ligne sup\'erieure du tableau \ST@read@tab@i } \newcommand\ST@read@tab@i{% \advance\ST@rowcount\@ne - \ST@Ifinstr\ST@tab{\@empty\\}% si contient \\, il reste encore des lignes - {\ST@split\ST@tab\\\ST@current@row\ST@tab - \@namedef{endrow@\number\ST@rowcount}{\\}% est la fin de cette ligne, pour l'instant - \ST@Iffirstis\ST@tab[% on prend en compte l'\'eventuel argument optionnel de \\ + \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@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) - \relax% 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 - }% - \relax - \ST@search@hline\ST@tab% on va purger les hlines et les mettre dans la fin de ligne - \ifx\ST@tab\@empty\let\ST@next@readrows\relax\edef\ST@total@rownumber{\number\ST@rowcount}\else\let\ST@next@readrows\ST@read@tab@i\fi}% + \ST@Ifinstr\ST@temp@a,% si c'est une r\'ef\'erence (on teste juste la pr\'esence de la virgule, ça devrait suffire) + \relax% 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 + }% + \relax + \ST@search@hline% on va purger les hlines et les mettre dans la fin de ligne + \ifx\ST@tab\@empty\let\ST@next@readrows\relax\edef\ST@total@rownumber{\number\ST@rowcount}\else\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@next@readrows\relax - \edef\ST@total@rownumber{\number\ST@rowcount}}% + \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 - \StrDel\ST@current@row{\@empty\SThiderow}[\ST@current@row]% + \StrDel\ST@current@row{\@empty\SThiderow}[\ST@current@row]% }% \relax \ST@colcount\z@ @@ -368,17 +382,17 @@ \advance\ST@colcount\@ne \ST@Ifinstr\ST@current@row&% {\ST@split\ST@current@row&\ST@current@cell\ST@current@row - \let\ST@next@readcells\ST@read@cells}% + \let\ST@next@readcells\ST@read@cells}% {\let\ST@current@cell\ST@current@row - \let\ST@next@readcells\relax - \ifnum\ST@colcount>\ST@total@colnumber\edef\ST@total@colnumber{\number\ST@colcount}\fi}% + \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{\expandafter(\number\ST@colcount)}% ça a d\'ej\'a \'et\'e demand\'e ? \relax% on fait rien {\edef\ST@col@skiplist{(\number\ST@colcount)\ST@col@skiplist}% sinon -> ajout \'a la skiplist - \ifnum\ST@colcount>\ST@last@skipcol\edef\ST@last@skipcol{\number\ST@colcount}\fi + \ifnum\ST@colcount>\ST@last@skipcol\edef\ST@last@skipcol{\number\ST@colcount}\fi }% - \StrDel\ST@current@cell{\@empty\SThidecol}[\ST@current@cell]% + \StrDel\ST@current@cell{\@empty\SThidecol}[\ST@current@cell]% }% \relax \exploregroups @@ -387,82 +401,83 @@ {\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\relax% s'il y a un \STcopy, erreur (pas de champ num\'erique et de \STcopy dans une m\^eme cellule) - \StrBehind\ST@current@cell\STnumericfieldmarker[\ST@current@formula]% - \noexploregroups - \StrChar\ST@current@formula1[\ST@temp@a]% \ST@temp@a contient {<formule} - \exploregroups - \let\ST@temp@b\STnumericfieldmarker - \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@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 - \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 - \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 - \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 - \fi + \StrBehind\ST@current@cell\STnumericfieldmarker[\ST@current@formula]% + \noexploregroups + \StrChar\ST@current@formula1[\ST@temp@a]% \ST@temp@a contient {<formule} + \exploregroups + \let\ST@temp@b\STnumericfieldmarker + \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@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 + \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 + \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 + \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 + \fi }% ci dessous, il n'y a pas de marqueur de champ num\'erique {\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 + \@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 {\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\@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 \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 - \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 - \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 - \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@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@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 - \fi + \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 + \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 + \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 + \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@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@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 + }% + \fi }% }% \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 + \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 \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}% - \advance\ST@colcount1 + \advance\ST@colcount\@ne \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{-1}% -1 = cellule multicol \repeat \fi @@ -471,48 +486,54 @@ % 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.) -\newcommand\ST@search@hline[1]{% - \unless\ifcsname endrow@\number\ST@rowcount\endcsname\ST@letname{endrow@\number\ST@rowcount}\@empty\fi - \ST@remove@first@spaces#1% on enl\`eve les espaces au d\'ebut - \StrChar#11[\ST@temp@a]% \ST@temp@a est le 1er car - \let\next\ST@search@hline +\newcommand\ST@search@hline{% + \ST@ifvalid@csname{endrow@\number\ST@rowcount}% + \relax + {\ST@letname{endrow@\number\ST@rowcount}\@empty}% + \ST@search@hline@i +} + +\newcommand\ST@search@hline@i{% + \ST@remove@first@spaces\ST@tab% on enl\`eve les espaces au d\'ebut + \StrChar\ST@tab1[\ST@temp@a]% \ST@temp@a est le 1er car + \let\ST@temp@b\ST@search@hline@i \IfStrEqCase\ST@temp@a{% on envisage tous les cas de trac\'e de ligne horizontale - {\@empty\hline}{\StrGobbleLeft#11[#1]\expandafter\ST@add@tomacro\csname endrow@\number\ST@rowcount\endcsname\hline}% - {\@empty\cline}{\StrSplit#12\ST@temp@a#1\expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a}% - {\@empty\hhline}{\StrSplit#12\ST@temp@a#1\expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a}% - {\@empty\noalign}{\StrSplit#12\ST@temp@a#1\expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a}% + {\@empty\hline}{\StrGobbleLeft\ST@tab1[\ST@tab]\expandafter\ST@add@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#11\ST@temp@a#1% chope le 1er lex\`eme : la commande \toprule - \IfBeginWith#1[{\StrBefore#1][\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b]}\StrBehind#1][#1]}\relax + \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lex\`eme : 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]}\relax \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a }% {\@empty\midrule}{% - \StrSplit#11\ST@temp@a#1% chope le 1er lex\`eme : la commande \midrule - \IfBeginWith#1[{\StrBefore#1][\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b]}\StrBehind#1][#1]}\relax + \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lex\`eme : 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]}\relax \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a }% {\@empty\bottomrule}{% - \StrSplit#11\ST@temp@a#1% chope le 1er lex\`eme : la commande \bottomrule - \IfBeginWith#1[{\StrBefore#1][\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b]}\StrBehind#1][#1]}\relax + \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lex\`eme : 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]}\relax \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a }% {\@empty\cmidrule}{% - \StrSplit#11\ST@temp@a#1% chope le 1er lex\`eme : la commande \cmidrule - \IfBeginWith#1[{\StrBefore#1][\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b]}\StrBehind#1][#1]}\relax - \IfBeginWith#1({\StrBefore#1)[\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b)}\StrBehind#1)[#1]}\relax - \StrSplit#11\ST@temp@b#1% chope l'argument obligatoire : {a-b} + \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lex\`eme : 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]}\relax + \IfBeginWith\ST@tab({\StrBefore\ST@tab)[\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b)}\StrBehind\ST@tab)[\ST@tab]}\relax + \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 }% {\@empty\addlinespace}{% - \StrSplit#11\ST@temp@a#1% chope le 1er lex\`eme : la commande \addlinespace - \IfBeginWith#1[{\StrBefore#1][\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b]}\StrBehind#1][#1]}\relax + \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lex\`eme : 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]}\relax \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a }% - {\@empty\morecmidrules}{\StrGobbleLeft#11[#1]\expandafter\ST@add@tomacro\csname endrow@\number\ST@rowcount\endcsname\morecmidrules}% - {\@empty\specialrule}{\StrSplit#14\ST@temp@a#1\expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a}% - }[\let\next\@gobble]% - \next#1% + {\@empty\morecmidrules}{\StrGobbleLeft\ST@tab1[\ST@tab]\expandafter\ST@add@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@temp@b\relax]% + \ST@temp@b } % Cette macro transpose toutes les r\'ef\'erences (absolues et relatives) de la sc #3. @@ -536,13 +557,13 @@ \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 ! - \else - \let\ST@addrow@\ST@addrow% sinon, on copie le vecteur - \fi - \IfInteger\ST@temp@formula\relax\relax% on prend le nombre qui suit - \ifnum\integerpart>\z@% si ce nombre est plus grand que 0 -> r\'ef\'erence valide + \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 ! + \else + \let\ST@addrow@\ST@addrow% sinon, on copie le vecteur + \fi + \IfInteger\ST@temp@formula\relax\relax% 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 \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 @@ -552,36 +573,36 @@ 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 ? - \else - \let\ST@temp@formula\@xs@afterinteger - \ST@expadd@tomacro\ST@transposed@formula\ST@firstcar - \fi + \else + \let\ST@temp@formula\@xs@afterinteger + \ST@expadd@tomacro\ST@transposed@formula\ST@firstcar + \fi }% {\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@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 ! - \else - \let\ST@addcol@\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 - \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 ! - \else - \let\ST@addrow@\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@illegal@relativeref - }% - \ST@illegal@relativeref + \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@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 ! + \else + \let\ST@addcol@\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 + \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 ! + \else + \let\ST@addrow@\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@illegal@relativeref + }% + \ST@illegal@relativeref \else \ST@expadd@tomacro\ST@transposed@formula\ST@firstcar \fi @@ -671,13 +692,13 @@ \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@returnedformula{#1}% - \ST@transposeformula{\numexpr\ST@copycol-#2}{\numexpr\ST@copyrow-#3}\ST@returnedformula\ST@returnedformula + \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 - \fi - \fi + \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 + \fi + \fi }% } @@ -744,7 +765,7 @@ \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\relax\relax% 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\'ef\'erence 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 @@ -752,7 +773,7 @@ \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 \let\ST@next@search\relax - \fi + \fi }% {\if[\expandafter\noexpand\ST@firstcar% si le 1er car est [ \ST@right\ST@temp@formula]\ST@after@ref@found @@ -761,16 +782,16 @@ \ST@left\ST@temp@formula,\ST@rel@num \IfInteger\ST@rel@num {\edef\ST@distant@colnumber{\number\numexpr\ST@current@colnumber+\ST@rel@num}% - \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 - \let\ST@next@search\relax - }% - \ST@illegal@relativeref + \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 + \let\ST@next@search\relax + }% + \ST@illegal@relativeref }% \ST@illegal@relativeref - \fi + \fi }% \fi \ST@next@search @@ -799,10 +820,10 @@ % Essaie de calculer la cellule (#1,#2) \def\ST@try@calc@cell(#1,#2)% {% - \ifcsname formula@#1@#2\endcsname% on v\'erifie que la formule existe - \expandafter\ifx\csname formula@#1@#2\endcsname\@empty% et qu'elle est non vide + \ST@ifvalid@csname{formula@#1@#2}% on v\'erifie que la formule existe + {\expandafter\ifx\csname formula@#1@#2\endcsname\@empty \@namedef{code@#1@#2}{0}% si vide, code \'a 0 - \else + \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 @@ -811,8 +832,7 @@ \ST@calc@cell(#1,#2)% on va la calculer la cellule \fi \fi - \fi - \fi + \fi}\relax } \def\ST@calc@cell(#1,#2)% @@ -831,7 +851,7 @@ \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) - \fi + \fi } % Calcule toutes les formules du tableau @@ -844,10 +864,9 @@ \ifnum\ST@rowcount>\ST@total@rownumber \let\ST@nextcell\relax \else - \ifcsname formula@\number\ST@colcount @\number\ST@rowcount\endcsname% si la formule existe - \edef\ST@temp@a{\noexpand\ST@eval@cell(\number\ST@colcount,\number\ST@rowcount)}% on la calcule - \ST@temp@a - \fi + \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 + \relax \advance\ST@colcount\@ne \let\ST@nextcell\ST@eval@tab@i \ifnum\ST@colcount>\ST@total@colnumber @@ -873,7 +892,7 @@ }% } -% Évalue la cellule (#1#2) par ses coordonn\'ees num\'eriques (col,row) +% \'Evalue la cellule (#1#2) par ses coordonn\'ees num\'eriques (col,row) \def\ST@eval@cell(#1,#2)% {% \def\ST@dependance@tree{(#1,#2)}% @@ -905,18 +924,20 @@ \else \ST@Ifinstr{\ST@functions@with@textresult,}{\ST@function@namesaved,}% si la derni\`ere 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 - \expandafter\let\csname text@#1@#2\expandafter\endcsname\csname formula@#1@#2\endcsname% copie de la formule vers la zone texte (avec \'ecrasement 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\'ee par une macrofonction et donc, on la calcule - \fi + \@namedef{code@#1@#2}{0}% on met le code \'a 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 + \fi }% {\ST@calc@cell(#1,#2)}% c'est une fonction qui donne un arg num\'erique : on calcule la cellule en cours \fi \else - \ifcsname code@\ST@coord\endcsname% le code distant exite ? - \ifcase\csname code@\ST@coord\endcsname% code distant = 0 ==> cellule vide ou textuelle, pas bon du tout ! + \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 @@ -937,18 +958,17 @@ \edef\ST@temp@callcell{#1,#2}% coordonn\'ees de la cellule appelante \ST@subst\ST@coord @,% coordonn\'ees appel\'ees \ST@multicol@cell - \fi - \else% le code distant n'est pas d\'efini - \edef\ST@temp@callcell{#1,#2}% coordonn\'ees de la cellule appelante + \fi}% + {\edef\ST@temp@callcell{#1,#2}% coordonn\'ees de la cellule appelante \ST@subst\ST@coord @,% coordonn\'ees appel\'ees \ST@undefined@cell% code distant inexistant -> cellule hors limite du tableau - \fi + }% \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 - \ifcase\ST@codefunc - \@latex@error{\ST@errname This error should not occur! Please email the author. Thanks.}{}% + \ifcase\ST@codefunc\relax + \PackageError\ST@package@name{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 @@ -962,7 +982,11 @@ \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 - \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on \'evalue \'a nouveau cette cellule + \ifx\@empty\ST@current@formula% pour cause de macro fonction "tag" qui est seule et qui a disparue apr\`es substitution + \@namedef{code@#1@#2}{0}% + \else + \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on \'evalue \'a 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 @@ -982,18 +1006,18 @@ \fi \fi \or% le code vaut 2, c'est une fonction \'a argument «plage de cellules» - \expandafter\let\expandafter\ST@current@formula\csname formula@#1@#2\endcsname% alias pour la formule \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 \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)}}\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 + \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 \fi \or% le code vaut 3, c'est un fonction dont l'argument est textuel \let\ST@function@argfound@edefed\ST@function@argfound - \ST@findref@informula\ST@function@argfound\ST@temp@formula% y a t-il une r\'ef\'erence dans l'argument de la fonction ? + \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 \let\ST@tobereplaced\ST@function@namefound @@ -1015,7 +1039,7 @@ \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 \else - \@latex@error{\ST@errname Macro function \ST@function@namefound\space requires a reference to a text cell!}\ST@seedoc@i + \PackageError\ST@package@name{Macro function \ST@function@namefound\space requires a reference to a text cell!}\ST@seedoc@i \fi \fi \fi @@ -1031,15 +1055,16 @@ \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 + \expandafter\def\expandafter\ST@temp@a\expandafter{\expandafter\ST@eval@cell@i\ST@temp@a}% + \expandafter\ST@temp@a \fi } \newcommand\ST@sanitize@stack{% enl\`eve 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 - }% + \ST@sanitize@stack + }% \relax } @@ -1059,7 +1084,10 @@ \newcommand\ST@functions@no@calc@arg{ifeq,ifgt,iflt,gcd,lcm} % liste des fonctions dont l'argument est un texte -\newcommand\ST@functions@with@text@arg{frshortdatetonum,engshortdatetonum,englongdatetonum,frlongdatetonum,scitodec} +\newcommand\ST@functions@with@text@arg{frshortdatetonum,engshortdatetonum,englongdatetonum,frlongdatetonum,scitodec,tag,row,col,cell} + +% liste des fonctions dont l'argument est une variable -> il ne faut donc pas aller chercher des r\'ef\'erences dans l'argument +\newcommand\ST@functions@with@assign@argument{tag,row,col,cell} % liste des fonctions dont le r\'esultat est un texte \newcommand\ST@functions@with@textresult{% @@ -1067,7 +1095,7 @@ 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} +\edef\ST@functions@list{\ST@functions@with@range@arg,\ST@functions@with@num@arg,\ST@functions@with@text@arg} \newcommand\ST@for[2]{% \ST@for{#1}{code} -> ex\'ecute le code pour toutes les cellules des plages pass\'ees en argument #1 \def\ST@forcode{#2}% @@ -1084,7 +1112,7 @@ \advance\ST@rowcount@i\@ne \ifnum\ST@rowcount@i>\ST@for@row@end \ST@right\ST@for@rangelist;\ST@for@rangelist - \expandafter\let\expandafter\ST@nextfor\ifx\ST@for@rangelist\@empty\relax\else\ST@for@i\fi + \ifx\ST@for@rangelist\@empty\let\ST@nextfor\relax\else\let\ST@nextfor\ST@for@i\fi \fi \fi \ST@nextfor @@ -1100,16 +1128,20 @@ \ST@rowcount@i\ST@distant@rownumber \ST@Ifinstr\ST@for@currentrange{\@empty:}% {\ST@right\ST@for@currentrange{\@empty:}\ST@temp@a - \ST@ifref\ST@temp@a\relax\ST@invalid@range - \let\ST@for@col@end\ST@distant@colnumber - \let\ST@for@row@end\ST@distant@rownumber - \let\ST@nextfor\ST@for@loopcode - \ifnum\ST@for@col@start>\ST@for@col@end\let\ST@nextfor\relax\fi - \ifnum\ST@for@row@start>\ST@for@row@end\let\ST@nextfor\relax\fi - }% + \ST@ifref\ST@temp@a\relax\ST@invalid@range + \let\ST@for@col@end\ST@distant@colnumber + \let\ST@for@row@end\ST@distant@rownumber + \let\ST@nextfor\ST@for@loopcode + \ifnum\ST@for@col@start>\ST@for@col@end\let\ST@nextfor\relax\fi + \ifnum\ST@for@row@start>\ST@for@row@end\let\ST@nextfor\relax\fi + }% {\ST@forcode - \ST@right\ST@for@rangelist;\ST@for@rangelist - \expandafter\let\expandafter\ST@nextfor\ifx\ST@for@rangelist\@empty\relax\else\ST@for@i\fi + \ST@right\ST@for@rangelist;\ST@for@rangelist + \ifx\ST@for@rangelist\@empty + \let\ST@nextfor\relax + \else + \let\ST@nextfor\ST@for@i + \fi }% \ST@nextfor } @@ -1148,7 +1180,7 @@ \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\'eduit l'argument \'a ce qui est avant ce nom }% \relax \expandafter\expandafter\expandafter\ST@find@first@func@ii @@ -1160,29 +1192,31 @@ % La macro trouve l'argument se trouvant entre les parenth\`eses les plus ext\'erieures % et l'assigne \'a la sc #2 \newcommand\ST@seekfunc@arg[2]{% - \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 - \expandafter\def\expandafter#2\scantokens\expandafter{#1}% - \catcode`\(\ST@openbrace@catcode\catcode`\)\ST@closebrace@catcode - \def\ST@assignarg##1\relax{\def#2{##1}}% - \expandafter\ST@assignarg\scantokens\expandafter{#2}% + \begingroup + \everyeof{\ST@nil}% met un \@nil \`a 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}% + \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 } \newcommand\ST@func@sum[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 \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{\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 - \fi - \fi + {\ifcase0\csname code@\number\ST@colcount@i @\number\ST@rowcount@i\endcsname\relax% on ne prend en compte que les code 1 et 2 + \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 + \fi + \fi }% \ifx\ST@temp@stack\@empty% toutes les cellules dans la plage \'etaient calcul\'ees ? \FPclip#2#2% on ôte les 0 inutiles si le calcul a \'et\'e men\'e au bout @@ -1227,31 +1261,31 @@ \def#2{0}% r\'esultat 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 - \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 - \or% code=2 - \expandafter\let\expandafter\ST@inter@result\csname formula@\number\ST@colcount@i @\number\ST@rowcount@i\endcsname - \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 - \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 - \or% code=2 - \expandafter\FPmul\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 - \fi - \advance\ST@count\@ne - \ifnum\ST@count<\ST@numbermat - \repeat - \FPadd#2#2\ST@inter@result + \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 + \or% code=2 + \expandafter\let\expandafter\ST@inter@result\csname formula@\number\ST@colcount@i @\number\ST@rowcount@i\endcsname + \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 + \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 + \or% code=2 + \expandafter\FPmul\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 + \fi + \advance\ST@count\@ne + \ifnum\ST@count<\ST@numbermat + \repeat + \FPadd#2#2\ST@inter@result }% \ifx\ST@temp@stack\@empty% toutes les cellules dans la plage \'etaient calcul\'ees ? \FPclip#2#2% on ôte les 0 inutiles si le calcul a \'et\'e men\'e au bout @@ -1319,18 +1353,18 @@ \newcommand\ST@func@randint[2]{% #1=sc contenant l'argument #2: sc recevant le r\'esultat \ST@Ifinstr#1,% s'il y a 2 nombres -> intervalle [nb1;nb2] {\ST@split#1,\ST@limita\ST@limitb - \FPifeq\ST@limita\ST@limitb\@latex@error{\ST@errname Macro function randint require two different numbers}\ST@seedoc@i\fi - \FPifgt\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\@latex@error{\ST@errname Macro function randint require integer argument}\ST@seedoc@i\fi - \FPifint\ST@limitb\else\@latex@error{\ST@errname Macro function randint require integer argument}\ST@seedoc@i\fi - \FPrandom#2% - \FPeval#2{trunc(trunc(#2*(\ST@limitb-\ST@limita+1),0)+\ST@limita,0)}% + \FPifeq\ST@limita\ST@limitb\PackageError\ST@package@name{Macro function randint require two different numbers}\ST@seedoc@i\fi + \FPifgt\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\PackageError\ST@package@name{Macro function randint require integer argument}\ST@seedoc@i\fi + \FPifint\ST@limitb\else\PackageError\ST@package@name{Macro function randint require integer argument}\ST@seedoc@i\fi + \FPrandom#2% + \FPeval#2{trunc(trunc(#2*(\ST@limitb-\ST@limita+1),0)+\ST@limita,0)}% }% - {\FPifint#1\else\@latex@error{\ST@errname Macro function randint require integer argument}\ST@seedoc@i\fi - \FPrandom#2% s'il n'y a qu'un nombre -> intervalle [0;nb2] - \FPeval#2{trunc(#2*(#1+1),0)}% + {\FPifint#1\else\PackageError\ST@package@name{Macro function randint require integer argument}\ST@seedoc@i\fi + \FPrandom#2% s'il n'y a qu'un nombre -> intervalle [0;nb2] + \FPeval#2{trunc(#2*(#1+1),0)}% }% } @@ -1346,11 +1380,11 @@ \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}% + \ST@powerten\ST@exposant\ST@tenpow + \csname FP\ifnum\ST@exposant<\z@ div\else mul\fi\endcsname#2\ST@mantissa\ST@tenpow}% {\IfDecimal#1% {\let#2#1}% - {\@latex@error{\ST@errname Illegal number in scitodec argument}\ST@seedoc@i}}% + {\PackageError\ST@package@name{Illegal number in scitodec argument}\ST@seedoc@i}}% } % les fonctions de test @@ -1546,6 +1580,57 @@ \fi } +\newcommand\ST@func@tag[2]{% + \let#2\@empty + \ifcsname ST@@\detokenize\expandafter{#1}\endcsname + \PackageWarning\ST@package@name{The tag "\detokenize\expandafter{#1}" already exists, previous is lost.}% + \fi + \expandafter\edef\csname ST@@\detokenize\expandafter{#1}\endcsname{\number\ST@colcount,\number\ST@rowcount}% + \ST@expadd@tomacro\ST@tag@list{% + \expandafter\let\csname ST@celltag@\detokenize\expandafter{#1}\expandafter\endcsname\csname formula@\number\ST@colcount @\number\ST@rowcount\endcsname}% + \expandafter\ST@coord@toref\csname ST@@\detokenize\expandafter{#1}\endcsname +} + +\newcommand\ST@func@cell[2]{% + \unless\ifcsname ST@@\detokenize\expandafter{#1}\endcsname\ST@unknown@tag\fi + \edef#2{\csname ST@@\detokenize\expandafter{#1}\endcsname}% +} + +\newcommand\ST@func@row[2]{% + \unless\ifcsname ST@@\detokenize\expandafter{#1}\endcsname\ST@unknown@tag\fi + \edef#2{\expandafter\expandafter\expandafter\@gobble\csname ST@@\detokenize\expandafter{#1}\endcsname}% +} + +\newcommand\ST@func@col[2]{% + \unless\ifcsname ST@@\detokenize\expandafter{#1}\endcsname\ST@unknown@tag\fi + \edef#2{% + \number\numexpr + \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter + `\expandafter\expandafter\expandafter\@car\csname ST@@\detokenize\expandafter{#1}\endcsname\@nil-64}% +} + +% \newcommand\ST@func@timetosec[2]{% +% \ST@left{#1}:\ST@nb@hours +% \ST@right{#1}:\ST@nb@min +% \ST@Ifinstr\ST@nb@min:% +% {\ST@right\ST@nb@min:\ST@nb@sec +% \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% +% } +% +% \newcommand\ST@func@sectotime[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 +% \edef#2{% +% \ST@nb@hours +% :\ifnum\ST@nb@min<10 0\fi\ST@nb@min +% \ifnum\ST@nb@sec>\z@:\ifnum\ST@nb@sec<10 0\fi\ST@nb@sec\fi}% +% } + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% Construction du tableau \'a afficher %%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1568,12 +1653,12 @@ \unless\ifx\@empty\ST@dipslaycell% si ce qui a entre les marqueurs n'est pas vide \ST@ifref\ST@dipslaycell% et si c'est une r\'ef\'erence 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 - \let\ST@next\ST@displaynumfields + \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 + \let\ST@next\ST@displaynumfields }\relax \fi \ST@next#1% @@ -1597,8 +1682,8 @@ \ST@hiddencoltrue {% \ST@hiddencolfalse - \ifcsname text@\number\ST@colcount @\number\ST@rowcount\endcsname% 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@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 \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 @@ -1610,31 +1695,30 @@ \ST@displaynumfields\ST@temp@a% affiche les champs num\'eriques des cellules entre << et >> \noexploregroups \ST@expadd@tomacro\ST@tab\ST@temp@a% on ajoute la cellule au tableau - \fi + }\relax }% \advance\ST@colcount\@ne% on passe \'a la colonne suivante ! - \ifcsname code@\number\ST@colcount @\number\ST@rowcount\endcsname% y a t-il encore un code d\'efini ensuite ? - \ifnum\csname code@\number\ST@colcount @\number\ST@rowcount\endcsname<\z@% on est dans une cellule contenant \multicol ? + \ST@ifvalid@csname{code@\number\ST@colcount @\number\ST@rowcount}% y a t-il encore un code d\'efini 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 \advance\ST@colcount\m@ne - \ifcsname code@\number\ST@colcount @\number\ST@rowcount\endcsname% y a t-il un code d\'efini apr\`es le multicol ? - \ST@add@tomacro\ST@tab&% on ajoute la tabulation - \fi + \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 + \relax \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 \fi \fi - \fi - \else% il n'y a plus de code ensuite donc c'\'etait la derni\`ere colonne - \ifcsname endrow@\number\ST@rowcount\endcsname - \expandafter\ST@expadd@tomacro\expandafter\ST@tab\csname endrow@\number\ST@rowcount\endcsname% ajoute la fin de la ligne - \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 + \relax \ST@colcount\@ne% on remet la colonne \'a 1 \advance\ST@rowcount\@ne% on passe \'a la ligne suivante - \fi + }% }% \fi \ST@nextcell @@ -1681,9 +1765,9 @@ &% passe \'a la derni\`ere colonne de la premi\`ere ligne \noexpand\multicolumn1l{% \ifx\ST@temp@a\ST@debuginfo - \ifcsname endrow@\number\ST@rowcount\endcsname - \detokenize\expandafter\expandafter\expandafter{\csname endrow@0\endcsname}% - \fi + \ST@ifvalid@csname{endrow@\number\ST@rowcount}% + {\detokenize\expandafter\expandafter\expandafter{\csname endrow@0\endcsname}}% + \relax \fi}% \noexpand\\\noexpand\cline{2-\number\numexpr\ST@lastshowcol+1}% }% @@ -1712,9 +1796,9 @@ \ST@edefadd@tomacro\ST@debugtab{% &\noexpand\multicolumn1l{% \ifx\ST@temp@a\ST@debuginfo - \ifcsname endrow@\number\ST@rowcount\endcsname - \detokenize\expandafter\expandafter\expandafter{\csname endrow@\number\ST@rowcount\endcsname}% - \fi + \ST@ifvalid@csname{endrow@\number\ST@rowcount}% + {\detokenize\expandafter\expandafter\expandafter{\csname endrow@\number\ST@rowcount\endcsname}}% + \relax \fi}% \noexpand\\\noexpand\cline{2-\number\numexpr\ST@lastshowcol+1}}% \ST@colcount\@ne% on remet la colonne \'a 1 @@ -1730,16 +1814,52 @@ %%%%%%%%%%%%%%%%%% Environnement spreadtab et macros publiques %%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% d\'efinit quelle sera le s\'equence de conytr\^ole qui finira les lignes +% dans les tableaux de spreadtab +\newcommand*\STeol[1]{\def\ST@eol{#1}} +\STeol\\ + +% renvoie la valeur num\'erique de la cellule de tag #1 +\newcommand\STtag[1]{% + \ifcsname ST@celltag@\detokenize\expandafter{#1}\endcsname + \csname ST@celltag@\detokenize\expandafter{#1}\endcsname + \else + \PackageError\ST@package@name{Tag "#1" is unknown, have you defined it?}\ST@seedoc@i + \fi +} + +\newcommand*\STmakegtag[1]{% + \STmakegtag@i#1,\STmakegtag@i,% +} + +\def\STmakegtag@i#1,{% + \ifx\STmakegtag@i#1% + \else + \def\ST@temp@a{#1}% + \ifx\@empty\ST@temp@a + \PackageWarning\ST@package@name{An empty tag is ignored.}% + \else + \ifcsname ST@celltag@\detokenize\expandafter{#1}\endcsname + \global\expandafter\let\csname ST@celltag@\detokenize\expandafter{#1}\expandafter\endcsname + \csname ST@celltag@\detokenize\expandafter{#1}\endcsname + \else + \PackageError\ST@package@name{Tag "#1" is unknown, have you defined it?}\ST@seedoc@i + \fi + \fi + \expandafter\STmakegtag@i + \fi +} + % d\'efinit le s\'eparateur d\'ecimal -\newcommand\STsetdecimalsep[1]{\def\ST@decsep{#1}} +\newcommand*\STsetdecimalsep[1]{\def\ST@decsep{#1}} \def\ST@decsepfp{.}% le s\'eparateur d\'ecimal donn\'e par fp \STsetdecimalsep.% le point par d\'efaut \STmessage{true}% affiche les messages par d\'efaut \newif\ifST@clipround -\newcommand\STautoround{\@ifstar{\ST@cliproundfalse\ST@autoround}{\ST@cliproundtrue\ST@autoround}} -\newcommand\ST@autoround[1]{\def\ST@rounddigit{#1}} +\newcommand*\STautoround{\@ifstar{\ST@cliproundfalse\ST@autoround}{\ST@cliproundtrue\ST@autoround}} +\newcommand*\ST@autoround[1]{\def\ST@rounddigit{#1}} \STautoround{}% pas d'arrondi par d\'efaut \newcommand\STsavecell[2]{% met dans la sc #1 la valeur du champ num\'erique de la cellule sp\'ecifi\'ee par sa r\'ef\'erence ABSOLUE @@ -1751,38 +1871,53 @@ \global\let#1#1% on rend l'assignation globale } -\long\def\ST@get@body#1\end{% +\long\def\ST@get@body@env#1\end{% \expandafter\def\expandafter\ST@tab\expandafter{\ST@tab#1}\ST@find@end } \newcommand\ST@find@end[1]{% \def\ST@temp@a{#1}% - \ifx\ST@temp@a\ST@name@env - \def\ST@temp@a{\end{#1}}% - \expandafter\ST@temp@a + \ifx\ST@temp@a\ST@package@name + \expandafter\spreadtab@i \else - \@addtomacro\ST@tab{\end{#1}}% - \expandafter\ST@get@body + \ST@add@tomacro\ST@tab{\end{#1}}% + \expandafter\ST@get@body@env \fi } -\newenvironment{spreadtab}[2][]{% +\long\def\ST@get@body@cs#1\endspreadtab{% + \def\ST@tab{#1}\spreadtab@i +} + +\newcommand\spreadtab[2][]{% + \ifx\ST@package@name\@currenvir% on vient d'un \begin{spreadtab} ? + \endgroup + \let\ST@get@body\ST@get@body@env + \else + \let\ST@get@body\ST@get@body@cs + \fi + \let\ST@FPmessages\ifFPmessages \ifST@message\FPmessagesfalse\fi% pas de message de calcul de FP - \expandarg% 1-d\'eveloppement des arguments (r\'eglages de xstring) - \noexploregroups% pas d'exploration des groupes (r\'eglages de xstring) - \@makeother\:\@makeother\;\@makeother\,% changer les catcodes pour \'eviter les incompatibilit\'es avec frenchb - \edef\ST@name@env{\@currenvir}% - \def\ST@tab@preamble{#2}%% pr\'eambule du tableau - \StrChar{\@empty#2}1[\ST@tab@name]% + \saveexpandmode\expandarg% 1-d\'eveloppement des arguments (r\'eglages de xstring) + \saveexploremode\noexploregroups% pas d'exploration des groupes (r\'eglages 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 + \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}% + \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 - \ST@emit@message{\ST@errname New spreadtab: \string\begin\detokenize{#2}^^J* reading tab:}% + \ST@emit@message{New spreadtab: \string\begin\detokenize{#2}^^J* reading tab:}% \let\ST@tab\@empty - \ST@get@body% met le corps de l'environnement dans \ST@tab - }% - {% + \ST@get@body% met le code du tableau dans \ST@tab +} + +\newcommand\spreadtab@i{% + \let\ST@tag@list\@empty \let\ST@ref@found\@empty \ST@read@tab% analyse le tableau contenu dans \ST@tab \ST@emit@message{ok^^J}% @@ -1808,141 +1943,184 @@ \ST@build@tab \ST@emit@message{ok^^J}% \ST@expadd@tomacro\ST@tab{\expandafter\end\ST@tab@name}% - \ST@tab% affiche le tableau + \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 + \let\ifFPmessages\ST@FPmessages + \restoreexpandmode\restoreexploremode + \ST@catocde@saved + \ST@tag@list + \ST@sanitize@cs +} + +\newcommand\ST@sanitize@cs{% + \ST@letname{endrow@0}\ST@undef@content + \ST@sanitize@cs@i1} + +\newcommand\ST@sanitize@cs@i[1]{% + \unless\ifnum#1>\ST@total@rownumber + \def\ST@temp@a{#1}% + \ST@letname{endrow@#1}\ST@undef@content + \ST@sanitize@cs@ii1% + \expandafter\ST@sanitize@cs@i\expandafter{\number\numexpr#1+1\expandafter}% \fi - \ST@emit@message{\ST@errname End of spreadtab: \string\end\detokenize\expandafter{\ST@tab@name}^^J^^J}% - \global\FPseed\ST@previous@seed% restauration de la graine } +\newcommand\ST@sanitize@cs@ii[1]{% + \unless\ifnum#1>\ST@total@colnumber + \ST@letname{formula@#1@\ST@temp@a}\ST@undef@content + \ST@letname{code@#1@\ST@temp@a}\ST@undef@content + \ST@letname{text@#1@\ST@temp@a}\ST@undef@content + \expandafter\ST@sanitize@cs@ii\expandafter{\number\numexpr#1+1\expandafter}% + \fi +} + +\def\ST@undef@content{\ST@undef@content} + \endinput -############################################################################### -# Historique # -############################################################################### +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Historique %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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\'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. ------------------------------------------------------------------------------- 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 - tabulary (entre autres). + 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 + 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 - 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. + 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 + 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. ------------------------------------------------------------------------------- v0.1beta5 2009/06/29 - 1 Am\'elioration 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 Écriture de la documentation provisoire en français + 1 Am\'elioration 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 ------------------------------------------------------------------------------- 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 \'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 ------------------------------------------------------------------------------- v0.1pre 2009/09/02 - 1 Mise au point des messages d'erreurs et des arr\^ets de compilation selon - les erreurs rencontr\'ees. - 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 sum - et sumprod - 4 Les noms de mois accentu\'es et \today sont d\'esormais 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 et - randint - 7 Am\'eliorations et optimisations + 1 Mise au point des messages d'erreurs et des arr\^ets de compilation + selon les erreurs rencontr\'ees. + 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 + sum et sumprod + 4 Les noms de mois accentu\'es et \today sont d\'esormais 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 + et randint + 7 Am\'eliorations et optimisations ------------------------------------------------------------------------------- v0.1 2009/11/03 Premi\`ere 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\'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 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 + 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 ------------------------------------------------------------------------------- v0.2a 2010/02/02 - 1 Ajout de la traduction en vietnamien et correction d'erreurs dans la - documentation française. - 2 Implementation beta et donc non visible des macros fonctions gcd, lcm - Ces macro-fonctions ne sont pas encore document\'ees. + 1 Ajout de la traduction en vietnamien et correction d'erreurs dans la + documentation française. + 2 Implementation beta et donc non visible des macros fonctions gcd, lcm + Ces macro-fonctions ne sont pas encore document\'ees. ------------------------------------------------------------------------------- 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 la - virgules en rajoutant des 0 inutiles si besoin - 2 La valeur sauvegard\'ee par \STsavecell tient d\'esormais compte du + 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 + 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 - 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 - 6 Correction d'un bug lorsque la macro-fonction admettant un argument - textuel a un argument faisant r\'ef\'erence \'a 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 + 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 + 6 Correction d'un bug lorsque la macro-fonction admettant un argument + textuel a un argument faisant r\'ef\'erence \'a 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 ------------------------------------------------------------------------------- v0.3a 2010/05/15 - 1 Correction d'un bug dans \ST@gobble@remain : ce qui reste \'a 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 cas. + 1 Correction d'un bug dans \ST@gobble@remain : ce qui reste \'a 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 + 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 une - cellule texte. - 2 Correction d'un bug sur la macro \ST@stackcall : il faut y enlever + 1 Correction d'un bug concernant les macro-fonctions renvoyant un texte. + Lorsque leur argument contenait une r\'ef\'erence, 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 macro - fonctions sum et somprod - 4 Correction d'un bug dans la façon dont sont produites les skiplist + 3 Modification de l'ordre de calcul des cellules concern\'ees 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\'ementation de la macro fonction "id" + 5 Impl\'ementation 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 tousles nbre>10 ! - 2 Macro \STprintnum
\ No newline at end of file + 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 ! + 2 Macro \STprintnum +------------------------------------------------------------------------------- +v0.4 2011/07/04 + 1 Les calculs se font en dehors d'un groupe pour \'eviter l'erreur de + save-satck + 2 Possibilit\'e d'\'ecrire 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 + 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>}
\ No newline at end of file |