summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/spreadtab
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2011-08-02 00:10:52 +0000
committerKarl Berry <karl@freefriends.org>2011-08-02 00:10:52 +0000
commit82f210a578a1a169eaa26b02efc025bd1e8ea5d2 (patch)
treefc9cebe5bfc7c1755f93cc8374df582d911dcbf2 /Master/texmf-dist/tex/latex/spreadtab
parent6189f60645741ffcb1b6e730325243882d7e5526 (diff)
spreadtab 0.4 (5jul11)
git-svn-id: svn://tug.org/texlive/trunk@23309 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/spreadtab')
-rw-r--r--Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty1104
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