diff options
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r-- | Master/texmf-dist/doc/latex/spreadtab/README | 14 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/spreadtab/spreadtab-en.pdf | bin | 578154 -> 327599 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/spreadtab/spreadtab-en.tex | 25 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/spreadtab/spreadtab-fr.pdf | bin | 609980 -> 346204 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/spreadtab/spreadtab-fr.tex | 27 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty | 1001 |
6 files changed, 577 insertions, 490 deletions
diff --git a/Master/texmf-dist/doc/latex/spreadtab/README b/Master/texmf-dist/doc/latex/spreadtab/README index 2f7ffaf9f78..0ffd4c6082e 100644 --- a/Master/texmf-dist/doc/latex/spreadtab/README +++ b/Master/texmf-dist/doc/latex/spreadtab/README @@ -1,9 +1,9 @@ L'extension spreadtab - v0.5 + v0.52 - 27 f\'evrier 2019 + 11 septembre 2023 Author : Christian Tellechea Email : unbonpetit@netc.fr (CT) @@ -13,14 +13,14 @@ Licence : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt ---------------------------------------------------------------------- - R\'esum\'é + Résumé -Cette extension met \`a disposition des fonctionnalit\'es de tableur +Cette extension met à disposition des fonctionnalités de tableur dans les environnements tableaux de LaTeX. -Les cellules d'un tableau ont des coordonn\'ees repr\'esentant leur -ligne et colonne, et par cet interm\'ediaire, peuvent \^etre -ins\'er\'ees dans des formules pour g\'en\'erer des valeurs dans +Les cellules d'un tableau ont des coordonnées représentant leur +ligne et colonne, et par cet intermédiaire, peuvent être +insérées dans des formules pour générer des valeurs dans d'autres cellules. ---------------------------------------------------------------------- diff --git a/Master/texmf-dist/doc/latex/spreadtab/spreadtab-en.pdf b/Master/texmf-dist/doc/latex/spreadtab/spreadtab-en.pdf Binary files differindex 2c95a606f06..72e56b585d5 100644 --- a/Master/texmf-dist/doc/latex/spreadtab/spreadtab-en.pdf +++ b/Master/texmf-dist/doc/latex/spreadtab/spreadtab-en.pdf diff --git a/Master/texmf-dist/doc/latex/spreadtab/spreadtab-en.tex b/Master/texmf-dist/doc/latex/spreadtab/spreadtab-en.tex index 5618aa8b1fd..0852283314b 100644 --- a/Master/texmf-dist/doc/latex/spreadtab/spreadtab-en.tex +++ b/Master/texmf-dist/doc/latex/spreadtab/spreadtab-en.tex @@ -1,14 +1,13 @@ +% !TeX TS-program = lualatex % Manual of the "spreadtab" package \documentclass[english,a4paper,10pt]{article} -\usepackage[utf8]{inputenc} -\usepackage[T1]{fontenc} \usepackage[a4paper,margin=2.6cm]{geometry} \usepackage[table]{xcolor} \usepackage{amsmath,amssymb,textcomp,array,arydshln,tabularx,listings,numprint,xspace,fancyhdr,libertine,babel,enumitem,bxtexlogo} \bxtexlogoimport{*} \usepackage[xfp,fp]{spreadtab}\STusexfp \usepackage[italic]{mathastext} -\usepackage[scaled=0.8]{luximono} +\usepackage[scaled=0.8]{GoMono} \fancyhead[L]{} \fancyhead[C]{\small\bfseries\ST} \fancyhead[R]{\scriptsize\slshape \leftmark} @@ -148,7 +147,7 @@ where the options "\verb|fp|" or "\verb|xfp|" select the calculation engine. If \item the functions \verbinline|rand| and \verbinline|randint| are not available with the engine \xfp when compiling with an old version of \XeLaTeX{}. \end{itemize} -The package requires \eTeX, \LaTeXe{} format and the \href{http://www.ctan.org/tex-archive/macros/latex/contrib/fp/}{\fp} or \href{https://ctan.org/pkg/xfp}{\xfp} packages, which performs arithmetic on cell values. Also, the \href{http://www.ctan.org/tex-archive/macros/latex/contrib/xstring/}{\texttt{\textbf{xstring}}} package is needed.\medskip +The package requires \eTeX, \LaTeXe{} format and the \href{https://ctan.org/pkg/fp}{\fp} or \href{https://ctan.org/pkg/xfp}{\xfp} packages, which performs arithmetic on cell values. Also, the \href{https://ctan.org/pkg/xstring}{\texttt{\textbf{xstring}}} package is needed.\medskip The package is compatible with \emph{all} tabular environments, and assumes that `\verb=&=' is used to delimit columns and `\verb-\\-' to end lines (but see page~\pageref{STeol}). This compatibility requirement led me to program \ST so that it works independently of the table environment. Thus, reading the table, processing and calculating the formulas is done \emph{before} the environment table `sees' the body of the table.\medskip @@ -183,7 +182,7 @@ After the work of \ST, we get a display as if we had written: Although having features resembling those of a spreadsheet with \LaTeX{} is appreciable, the 3 stages described above take time. The \ST environment leads to \emph{much slower compilation} than with a classical table. -Moreover, \ST \emph{cannot stand in for a spreadsheet program}. Indeed, it has very few features, and it does not provide visual assistance. This point may cause difficulty\footnote{I certify that, with use, this discomfort tends to disappear (if you do not work with huge tables, of course).} for big or complex tables. The syntax of \ST is also another difficulty. However, the advantage of this package is that it makes it possible to write \emph{in the \LaTeX{} code} tables involving calculation when these tables are usually exported\footnote{I mention the two main exportation programs: \href{http://calc2latex.sourceforge.net/}{\texttt{\textbf{cacl2latex}}} for `calc' (Open Office), and \href{http://www.ctan.org/tex-archive/support/excel2latex/}{\texttt{\textbf{excel2latex}}} for `excel' (Microsoft Office).} from a spreadsheet program to \LaTeX{} code. Consequently, it becomes possible to avoid the disadvantages of the exportation programs: fine tuning often necessary to obtain exactly what you want, exported tables containing the values only (formulas are lost when exportation is done), no compatibility with all types of environments, exportation must be started again if a single number or formula is modified in the table. +Moreover, \ST \emph{cannot stand in for a spreadsheet program}. Indeed, it has very few features, and it does not provide visual assistance. This point may cause difficulty\footnote{I certify that, with use, this discomfort tends to disappear (if you do not work with huge tables, of course).} for big or complex tables. The syntax of \ST is also another difficulty. However, the advantage of this package is that it makes it possible to write \emph{in the \LaTeX{} code} tables involving calculation when these tables are usually exported\footnote{I mention the two main exportation programs: \href{http://calc2latex.sourceforge.net/}{\texttt{\textbf{cacl2latex}}} for `calc' (Open Office), and \href{https://ctan.org/pkg/excel2latex}{\texttt{\textbf{excel2latex}}} for `excel' (Microsoft Office).} from a spreadsheet program to \LaTeX{} code. Consequently, it becomes possible to avoid the disadvantages of the exportation programs: fine tuning often necessary to obtain exactly what you want, exported tables containing the values only (formulas are lost when exportation is done), no compatibility with all types of environments, exportation must be started again if a single number or formula is modified in the table. \subsection{Motivation} A few months before I started to write this package, Derek \textsc{O'Connor} had pointed out that nothing was available in the world of \LaTeX{} packages to imitate --~even a little~-- the behaviour of spreadsheet programs. I found the challenge interesting and I started writing this package as a good programming exercise. @@ -256,7 +255,7 @@ a2 & a4+b4 & b4+c4 & c4+d4 & d4 \subsection{Relative references} To refer to a cell, it may be convenient to specify its position relative to where the formula is written. Thus, the relative coordinates of a cell are 2 relative numbers written using this syntax: \falseverb{[x,y]} where \falseverb x is the horizontal offset from the cell containing the formula and \falseverb y is the vertical offset. For example, \falseverb{[-2,3]} refers to the cell located 2 columns before (on the left) and 3 rows after (below) the cell where the formula is located. -Here is the same table as above but the references are relatives and the \verbinline-matrix- environment of the \href{http://www.ctan.org/tex-archive/macros/latex/required/amslatex/math/}{\texttt{\textbf{amsmath}}} package is used:\par\nobreak +Here is the same table as above but the references are relatives and the \verbinline-matrix- environment of the \href{https://ctan.org/pkg/amsmath}{\texttt{\textbf{amsmath}}} package is used:\par\nobreak \begin{minipage}{0.82\linewidth} \begin{lstlisting} $ @@ -508,11 +507,11 @@ When cells are in math mode, you can\footnote{It is preferable to use the \textt \end{minipage} \subsection{Number formatting and the \fp package} -With \verb|fp| option, all calculations are made by the \verb-\FPeval- macro\footnote{This macro accepts infix or postfix notation. Consequently, both can be used to write formulas in a cell. For example the infix formula `\falseverb{a1+b1}' is equivalent to the postfix ones `\falseverb{a1 b1 add}' or `\falseverb{a1 b1 +}'.} of the \href{http://www.ctan.org/tex-archive/macros/latex/contrib/fp/}{\fp} package. This package provides all necessary arithmetical functions along with various scientific and trigonometric functions. Calculations are made with 18 decimal digits of precision, and \fp displays \emph{all} the decimals! Without taking precautions, you can end up with a lot of numbers in the decimal parts of some results. This section is compiled with \verbinline|\STusefp|.\STusefp +With \verb|fp| option, all calculations are made by the \verb-\FPeval- macro\footnote{This macro accepts infix or postfix notation. Consequently, both can be used to write formulas in a cell. For example the infix formula `\falseverb{a1+b1}' is equivalent to the postfix ones `\falseverb{a1 b1 add}' or `\falseverb{a1 b1 +}'.} of the \href{https://ctan.org/pkg/fp}{\fp} package. This package provides all necessary arithmetical functions along with various scientific and trigonometric functions. Calculations are made with 18 decimal digits of precision, and \fp displays \emph{all} the decimals! Without taking precautions, you can end up with a lot of numbers in the decimal parts of some results. This section is compiled with \verbinline|\STusefp|.\STusefp The number of digits displayed can be controlled in various ways: \begin{itemize} - \item the \href{http://www.ctan.org/tex-archive/macros/latex/contrib/numprint/}{\texttt{\textbf{numprint}}} package can be used in order to properly display numbers; + \item the \href{https://ctan.org/pkg/numprint}{\texttt{\textbf{numprint}}} package can be used in order to properly display numbers; \item \fp can round or truncate numbers with \verb-round(number,integer)- or \verb-trunc(number,integer)- but the syntax makes this tedious to write if this is needed for many cells; \item \ST can round \emph{all} the numbers in the table with the macro \verbinline-\STautoround- whose argument is number of digits in the decimal part. If the argument is empty, no rounding is done. If the starred macro \verbinline-\STautoround*- is used, the decimal part is filled with 0 as necessary (only with \fp). \end{itemize} @@ -597,8 +596,8 @@ For horizontal rules, it is possible to use:\par\nobreak \begin{itemize} \item \verb-\hline-; \item \verb=\cline{x-y}= where \falseverb x and \falseverb y define the start and the end of the rule; - \item \verb=\hhline{<type>}= where \verb=<type>= is the type of rule (read the manual of the \href{http://www.ctan.org/tex-archive/macros/latex/required/tools/}{\texttt{\textbf{hhline}}} package). - \item any command of the \href{http://www.ctan.org/tex-archive/macros/latex/contrib/booktabs/}{\texttt{\textbf{booktabs}}} package: \verb-\toprule-, \verb-\midrule-, \verb-\bottomrule-, \verb-\cmidrule-, \verb-\addlinespace-, \verb-\morecmidrule- and \verb-\specialrule-. All the arguments of these macros, optional or mandatory are taken into account; + \item \verb=\hhline{<type>}= where \verb=<type>= is the type of rule (read the manual of the \href{https://ctan.org/pkg/hhline}{\texttt{\textbf{hhline}}} package). + \item any command of the \href{https://ctan.org/pkg/booktabs}{\texttt{\textbf{booktabs}}} package: \verb-\toprule-, \verb-\midrule-, \verb-\bottomrule-, \verb-\cmidrule-, \verb-\addlinespace-, \verb-\morecmidrule- and \verb-\specialrule-. All the arguments of these macros, optional or mandatory are taken into account; \item \verbinline-\noalign- and its mandatory argument can be written after \verb-\\-. \end{itemize} Example: @@ -813,7 +812,7 @@ In the following table, the sum of the binomial coefficients of Pascal's triangl \end{minipage}% \subsubsection{The \texttt{fact} macro} -The macro-function \verbinline=fact(<number>)= computes the factorial of its argument. With the engine \href{https://www.ctan.org/pkg/fp}{\fp}, the argument must be less than 19 to avoid overflows. The \falseverb{<number>} can also be a reference to a cell whose numeric field contains an integer.\medskip +The macro-function \verbinline=fact(<number>)= computes the factorial of its argument. With the engine \href{https://ctan.org/pkg/fp}{\fp}, the argument must be less than 19 to avoid overflows. The \falseverb{<number>} can also be a reference to a cell whose numeric field contains an integer.\medskip Here are the factorials from 0 to 8:\par\nobreak \begin{lstlisting} @@ -837,7 +836,7 @@ It should be used like this: \verbinline{sumprod(<range 1>;<range 2>;...;<range In this simple example, the average age of a group of children aged from 10 to 15 years old is calculated:\par\nobreak \begin{lstlisting} \begin{spreadtab}{{tabular}{r*6c}} -@\Ages & 10 & 11 & 12 & 13 & 14 & 15\\ +@Ages & 10 & 11 & 12 & 13 & 14 & 15\\ @Number & 5 & 8 & 20 & 55 & 9 & 3\\\hline @Average&\multicolumn{6}{l}{:={sumprod(b1:g1;b2:g2)/sum(b2:g2)}} \end{spreadtab} @@ -1449,7 +1448,7 @@ $Sx=:={a2+a3+a4}$ & $Sy=:={b2+b3+b4}$ & $Sx+Sy=:={}$\\\hline \end{center} These 3 debugging tables may help to better understand what happens behind the scene when \ST works. We can observe that all cells with a numeric field (see table 2) have an internal code of 1 or 2 (see table 3) and an associated numeric field marker `\verb-:=-' in table 1. This marker represents the location where (by substitution) the result of the numeric field will be inserted. So from the contents of text fields in table 1 and, once calculated, the numeric fields, by a simple substitution, the cells are reconstituted to give those of the final table. -In the debugging tables, cells containing the coordinates are grayed if the package \href{http://www.ctan.org/tex-archive/macros/latex/contrib/colortbl/}{\texttt{\textbf{colortbl}}} has been loaded; they are left white otherwise. +In the debugging tables, cells containing the coordinates are grayed if the package \href{https://ctan.org/pkg/colortbl}{\texttt{\textbf{colortbl}}} has been loaded; they are left white otherwise. \section{Examples} In the examples of this section, the numbers entered by the user are in \textcolor{black}{red} and the calculated numbers are in \textcolor{black}{black} diff --git a/Master/texmf-dist/doc/latex/spreadtab/spreadtab-fr.pdf b/Master/texmf-dist/doc/latex/spreadtab/spreadtab-fr.pdf Binary files differindex 52df68ec605..c0b3f2dbe24 100644 --- a/Master/texmf-dist/doc/latex/spreadtab/spreadtab-fr.pdf +++ b/Master/texmf-dist/doc/latex/spreadtab/spreadtab-fr.pdf diff --git a/Master/texmf-dist/doc/latex/spreadtab/spreadtab-fr.tex b/Master/texmf-dist/doc/latex/spreadtab/spreadtab-fr.tex index 1eab8cb3864..a4390e0a07d 100644 --- a/Master/texmf-dist/doc/latex/spreadtab/spreadtab-fr.tex +++ b/Master/texmf-dist/doc/latex/spreadtab/spreadtab-fr.tex @@ -1,14 +1,13 @@ +% !TeX TS-program = lualatex % Documentation de l'extension "spreadtab" \documentclass[french,a4paper,10pt]{article} -\usepackage[utf8]{inputenc} -\usepackage[T1]{fontenc} \usepackage[a4paper,margin=2.6cm]{geometry} \usepackage[table]{xcolor} \usepackage{amsmath,amssymb,textcomp,array,arydshln,tabularx,numprint,xspace,fancyhdr,libertine,babel,enumitem,listings,bxtexlogo} \bxtexlogoimport{*}\frenchsetup{og=«,fg=»} \usepackage[xfp,fp]{spreadtab}\STusexfp \usepackage[italic]{mathastext} -\usepackage[scaled=0.8]{luximono} +\usepackage[scaled=0.8]{GoMono} \fancyhead[L]{} \fancyhead[C]{\small\bfseries\ST} \fancyhead[R]{\scriptsize\slshape \leftmark} @@ -148,7 +147,7 @@ où les options «\verb|fp|» ou «\verb|xfp|» spécifient le moteur de calcul \item les fonctions \verbinline|rand| et \verbinline|randint| ne sont pas disponibles avec le moteur \xfp lorsqu'on compile avec une version de \XeLaTeX{} trop ancienne. \end{itemize} -Ce package nécessite le moteur \eTeX, le format \LaTeXe{} ainsi que le package \href{https://www.ctan.org/pkg/fp}{\fp} ou \href{https://ctan.org/pkg/xfp}{\xfp} à qui sont confiés les calculs. Le package \href{https://www.ctan.org/pkg/xstring}{\texttt{\textbf{xstring}}} est également requis. +Ce package nécessite le moteur \eTeX, le format \LaTeXe{} ainsi que le package \href{https://ctan.org/pkg/fp}{\fp} ou \href{https://ctan.org/pkg/xfp}{\xfp} à qui sont confiés les calculs. Le package \href{https://ctan.org/pkg/xstring}{\texttt{\textbf{xstring}}} est également requis. J'ai souhaité dès le départ de rendre ce package compatible avec \emph{tous} les environnements de tableaux, sous réserve que les séparateurs entre colonnes soient «\verb=&=» et les retours à la ligne soient «\verb=\\=». Cette contrainte forte sur la compatibilité m'a conduit à programmer \ST pour qu'il agisse d'une façon \emph{totalement indépendante} de l'environnement tableau. Ainsi, la lecture du tableau, le traitement et le calcul des formules se fait \emph{avant} que l'environnement tableau ne prenne la main et ne «voit» le corps du tableau. @@ -183,7 +182,7 @@ et après le travail de \ST, on obtient un affichage comme si l'on avait écrit Même si disposer de fonctionnalités ressemblant à celles d'un tableur avec \LaTeX{} est appréciable, il ne faut pas perdre de vue que les 3 étapes décrites ci-dessus prennent du temps. L'ensemble conduit donc à des temps de compilation \emph{beaucoup plus importants} qu'avec un tableau classique. -Il faut ajouter que \ST \emph{ne peut remplacer un tableur}. En effet, ses possibilités sont très limitées. De plus, surtout pour des tableaux complexes ou de grande taille, le manque d'aide visuelle devient gênant\footnote{Ceci dit, je certifie qu'avec l'habitude, cette gêne tend à s'estomper (si l'on s'en tient à des tableaux raisonnables, bien sûr).}, et la syntaxe de \ST constitue aussi un obstacle supplémentaire. L'avantage de cette extension est de pouvoir écrire \emph{dans le code \LaTeX} des tableaux comportant des calculs, alors que ces tableaux sont généralement exportés\footnote{On peut signaler les 2 principaux programmes d'exportation : \href{http://calc2latex.sourceforge.net/}{\texttt{\textbf{cacl2latex}}} pour «calc» de Open Office, et \href{http://www.ctan.org/tex-archive/support/excel2latex/}{\texttt{\textbf{excel2latex}}} pour «excel» de Microsoft Office.} d'une feuille de calcul d'un tableur vers le code \LaTeX. On évite ainsi les désagréments des programmes d'exportation : mise en forme souvent à retoucher pour obtenir exactement ce que l'on veut, non compatibilité avec tous les environnements de tableaux, obtention de tableaux ne contenant que les valeurs (les formules sont perdues à l'exportation), exportation à recommencer si l'on modifie un seul nombre ou formule dans le tableau. +Il faut ajouter que \ST \emph{ne peut remplacer un tableur}. En effet, ses possibilités sont très limitées. De plus, surtout pour des tableaux complexes ou de grande taille, le manque d'aide visuelle devient gênant\footnote{Ceci dit, je certifie qu'avec l'habitude, cette gêne tend à s'estomper (si l'on s'en tient à des tableaux raisonnables, bien sûr).}, et la syntaxe de \ST constitue aussi un obstacle supplémentaire. L'avantage de cette extension est de pouvoir écrire \emph{dans le code \LaTeX} des tableaux comportant des calculs, alors que ces tableaux sont généralement exportés\footnote{On peut signaler les 2 principaux programmes d'exportation : \href{http://calc2latex.sourceforge.net/}{\texttt{\textbf{cacl2latex}}} pour «calc» de Open Office, et \href{https://ctan.org/pkg/excel2latex}{\texttt{\textbf{excel2latex}}} pour «excel» de Microsoft Office.} d'une feuille de calcul d'un tableur vers le code \LaTeX. On évite ainsi les désagréments des programmes d'exportation : mise en forme souvent à retoucher pour obtenir exactement ce que l'on veut, non compatibilité avec tous les environnements de tableaux, obtention de tableaux ne contenant que les valeurs (les formules sont perdues à l'exportation), exportation à recommencer si l'on modifie un seul nombre ou formule dans le tableau. \subsection{Motivation} Quelques mois avant de commencer à m'attaquer à ce package, Derek \textsc{O'Connor} m'avait fait remarquer que rien n'était disponible dans le monde des extensions de \LaTeX{} pour imiter ---~ne serait-ce qu'un peu~--- le calcul de formules dans des tableaux, comme cela se fait couramment avec des tableurs. J'ai trouvé le défi intéressant et je me suis lancé dans l'écriture de ce package qui en fait, n'est qu'un exercice de programmation. @@ -256,7 +255,7 @@ a2 & a4+b4 & b4+c4 & c4+d4 & d4 \subsection{Références relatives} Pour faire référence à une cellule, il peut être commode de spécifier sa position par rapport à la cellule où se trouve la formule. Ainsi, les coordonnées «relatives» d'une cellule sont 2 nombres relatifs écrits selon cette syntaxe : \falseverb{[x,y]}, où \falseverb x est le décalage horizontal par rapport à la cellule contenant la formule et \falseverb y est le décalage vertical. Ainsi, \falseverb{[-2,3]} fait référence à la cellule se trouvant 2 colonnes avant (à gauche) et 3 lignes après (plus bas) la cellule où se trouve la formule. -Voici à nouveau le triangle de Pascal vu ci-dessus, mais les références sont relatives et l'environnement «\verbinline-matrix-» du package \href{http://www.ctan.org/tex-archive/macros/latex/required/amslatex/math/}{\texttt{\textbf{amsmath}}} est utilisé :\par\nobreak +Voici à nouveau le triangle de Pascal vu ci-dessus, mais les références sont relatives et l'environnement «\verbinline-matrix-» du package \href{https://ctan.org/pkg/amsmath}{\texttt{\textbf{amsmath}}} est utilisé :\par\nobreak \begin{minipage}{0.82\linewidth} \begin{lstlisting} $ @@ -508,11 +507,11 @@ Lorsque des cellules sont en mode math, on peut\footnote{Il est cependant préfà \end{minipage} \subsection{Mise en forme des nombres avec le moteur \fp} -Comme cela a été précisé avec l'option \fp, tous les calculs sont faits par le package \href{http://www.ctan.org/tex-archive/macros/latex/contrib/fp/}{\texttt{\textbf{fp}}} et sa macro \falseverb{\FPeval}\footnote{À ce propos, les notations infixe ou postfixe sont acceptées par {\ttfamily\string\FPeval} ce qui signifie que les formules dans \ST peuvent être indifféremment sous forme infixe ou postfixe. Par exemple, la formule infixe «\falseverb{a1+b1}» est équivalente aux formules postfixes «\falseverb{a1 b1 add}» ou «\falseverb{a1 b1 +}».}. Ce package fournit d'extraordinaires possibilités de calcul pour \TeX{} et dispose de toutes les fonctions arithmétiques, scientifiques et trigonométriques usuelles. Les calculs sont faits avec une précision de $10^{-18}$, et les 18 décimales sont affichées lorsqu'un calcul ne tombe pas juste ! Sans prendre des précautions, on peut se retrouver avec beaucoup de chiffres dans les parties décimales de certains résultats. Toute cette section est compilée avec \verbinline|\STusefp|.\STusefp +Comme cela a été précisé avec l'option \fp, tous les calculs sont faits par le package \href{https://ctan.org/pkg/fp}{\texttt{\textbf{fp}}} et sa macro \falseverb{\FPeval}\footnote{À ce propos, les notations infixe ou postfixe sont acceptées par {\ttfamily\string\FPeval} ce qui signifie que les formules dans \ST peuvent être indifféremment sous forme infixe ou postfixe. Par exemple, la formule infixe «\falseverb{a1+b1}» est équivalente aux formules postfixes «\falseverb{a1 b1 add}» ou «\falseverb{a1 b1 +}».}. Ce package fournit d'extraordinaires possibilités de calcul pour \TeX{} et dispose de toutes les fonctions arithmétiques, scientifiques et trigonométriques usuelles. Les calculs sont faits avec une précision de $10^{-18}$, et les 18 décimales sont affichées lorsqu'un calcul ne tombe pas juste ! Sans prendre des précautions, on peut se retrouver avec beaucoup de chiffres dans les parties décimales de certains résultats. Toute cette section est compilée avec \verbinline|\STusefp|.\STusefp Pour se prémunir de ce problème, plusieurs solutions existent : \begin{itemize} - \item on peut utiliser le package \href{http://www.ctan.org/tex-archive/macros/latex/contrib/numprint/}{\texttt{\textbf{numprint}}} qui est ce qui se fait de mieux dans l'affichage des nombres; + \item on peut utiliser le package \href{https://ctan.org/pkg/numprint}{\texttt{\textbf{numprint}}} qui est ce qui se fait de mieux dans l'affichage des nombres; \item on peut demander à \fp d'arrondir un résultat avec sa fonction \verb-round(nombre,entier)- qui arrondit \verb=nombre= avec \verb=entier= chiffres après la virgule; \item on peut également demander à \ST d'arrondir \emph{tous} les nombres placés dans le tableau à une certaine précision avec la macro \verbinline-\STautoround- dont l'argument est le nombre de chiffres demandés après la virgule. Si l'argument est vide, aucun arrondi n'est fait. Si on utilise la macro étoilée \verbinline-\STautoround*-, la partie décimale est remplie si besoin avec des 0 inutiles (uniquement avec \fp). \end{itemize} @@ -573,7 +572,7 @@ Il est possible d'arrondir tous les nombres via la commande \verbinline-\numprin Voici un autre exemple similaire où l'on teste si le nombre à afficher est négatif avec la commande \verbinline-\FPifneg- du package \fp. Si tel est le cas, le nombre est affiché en rouge. La commande \verbinline-\STautoround- a été préférée à \verbinline-\nprounddigits- du package \verb-numprint- puisque cette dernière ajoute des 0 inutiles. On a également remis le point décimal par défaut puisque \verbinline-\numprint- est en charge de l'affichage des nombres. \begin{lstlisting} \STsetdecimalsep{.} -\renewcommand\STprintnum[1]{\FPifneg{#1}\color{red}\fi\numprint{#1}} +\renewcommand\STprintnum[1]{\STifneg{#1}{\color{red}}{}\numprint{#1}} \STautoround{6} \begin{spreadtab}{{tabular}{cccccccc}} @$x$ & -1 & 2 & -3 & 4 & -5 & 6 & -7 \\\hline @@ -582,7 +581,7 @@ Voici un autre exemple similaire où l'on teste si le nombre à afficher est né \end{lstlisting} \begin{center} \STsetdecimalsep{.} -\renewcommand\STprintnum[1]{\STifneg{#1}\color{red}\fi\numprint{#1}} +\renewcommand\STprintnum[1]{\STifneg{#1}{\color{red}}{}\numprint{#1}} \STautoround{6} \begin{spreadtab}{{tabular}{cccccccc}} @$x$ & -1 & 2 & -3 & 4 & -5 & 6 & -7 \\\hline @@ -597,8 +596,8 @@ Pour les filets horizontaux, on peut utiliser autant de fois que l'on veut: \begin{itemize} \item \verb-\hline-; \item \verb=\cline{x-y}= où \falseverb x et \falseverb y sont les numéro des colonnes de départ et d'arrivée du filet; - \item \verb=\hhline{<type>}= où \verb=<type>= est le type de ligne désirée (voir la documentation du package \href{http://www.ctan.org/tex-archive/macros/latex/required/tools/}{\texttt{\textbf{hhline}}}). - \item n'importe quelle commande du package \href{http://www.ctan.org/tex-archive/macros/latex/contrib/booktabs/}{\texttt{\textbf{booktabs}}}, à savoir \verb-\toprule-, \verb-\midrule-, \verb-\bottomrule-, \verb-\cmidrule-, \verb-\addlinespace-, \verb-\morecmidrule- et \verb-\specialrule-. Tous les arguments de ces macros, optionnels ou pas sont gérés; + \item \verb=\hhline{<type>}= où \verb=<type>= est le type de ligne désirée (voir la documentation du package \href{https://ctan.org/pkg/hhline}{\texttt{\textbf{hhline}}}). + \item n'importe quelle commande du package \href{https://ctan.org/pkg/booktabs}{\texttt{\textbf{booktabs}}}, à savoir \verb-\toprule-, \verb-\midrule-, \verb-\bottomrule-, \verb-\cmidrule-, \verb-\addlinespace-, \verb-\morecmidrule- et \verb-\specialrule-. Tous les arguments de ces macros, optionnels ou pas sont gérés; \item \verbinline-\noalign- et son argument peuvent être placés après \verb-\\- et pris en compte. \end{itemize} Voici le triangle de Pascal inversé, et massacré pour l'exemple :\par\nobreak @@ -813,7 +812,7 @@ Les références relatives et absolues peuvent être utilisées conjointement, c \end{minipage}% \subsubsection{Macro-fonction \ttfamily fact} -La macro-fonction \verbinline=fact(<nombre>)= permet de calculer la factorielle de son argument. Avec le moteur de calcul \href{https://www.ctan.org/pkg/fp}{\fp} le nombre doit être un entier compris entre 0 et 18 inclus pour éviter des débordements. Le \falseverb{<nombre>} peut aussi être une référence vers une cellule contenant un nombre entier. +La macro-fonction \verbinline=fact(<nombre>)= permet de calculer la factorielle de son argument. Avec le moteur de calcul \href{https://ctan.org/pkg/fp}{\fp} le nombre doit être un entier compris entre 0 et 18 inclus pour éviter des débordements. Le \falseverb{<nombre>} peut aussi être une référence vers une cellule contenant un nombre entier. Voici les factorielles de 0 à 8 :\par\nobreak \begin{lstlisting} @@ -1449,7 +1448,7 @@ $Sx=:={a2+a3+a4}$ & $Sy=:={b2+b3+b4}$ & $Sx+Sy=:={}$\\\hline \end{center} Ces 3 tableaux de débogage peuvent aider à comprendre un peu mieux le fonctionnement interne de \ST. On peut observer dans le tableau 2 que toutes les cellules ayant un champ numérique ont un code interne de 1 ou 2 (voir tableau 3) et ont un marqueur de champ numérique "\verb-:=-" qui leur est associé (voir tableau 1). Ce marqueur représente l'endroit où sera inséré ---~par substitution~--- le résultat du calcul du champ numérique. C'est donc à partir des contenus des champs textuels du tableau 1 et par simple substitution, qu'une fois les champs numériques calculés, les cellules sont reconstituées pour donner celles du tableau final. -Dans les tableaux ci-dessus, les cellules contenant les coordonnées ne sont grisées que si le package \href{http://www.ctan.org/tex-archive/macros/latex/contrib/colortbl/}{\texttt{\textbf{colortbl}}} a été chargé. +Dans les tableaux ci-dessus, les cellules contenant les coordonnées ne sont grisées que si le package \href{https://ctan.org/pkg/colortbl}{\texttt{\textbf{colortbl}}} a été chargé. \section{Exemples} Voici quelques tableaux pour finir ! diff --git a/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty b/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty index 3ae130e9fac..acdac587e73 100644 --- a/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty +++ b/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty @@ -1,12 +1,11 @@ -% !TeX encoding = ISO-8859-1 % Ce fichier contient le code de l'extension "spreadtab" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \def\STname {spreadtab} % -\def\STver {0.5} % +\def\STver {0.52} % % % -\def\STdate {2019/02/27} % +\def\STdate {2023/09/11} % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % @@ -17,7 +16,7 @@ % Package URL: https://www.ctan.org/pkg/spreadtab % % Bug tracker: https://framagit.org/unbonpetit/spreadtab/issues % % Repository : https://framagit.org/unbonpetit/spreadtab/tree/master % -% Copyright : Christian Tellechea 2009-2019 % +% Copyright : Christian Tellechea 2009-2023 % % Licence : Released under the LaTeX Project Public License v1.3c % % or later, see http://www.latex-project.org/lppl.txt % % Files : 1) spreadtab.sty % @@ -30,9 +29,9 @@ \ProvidesPackage{spreadtab}[\STdate\space v\STver\space Spreadsheet features for table environments (CT)] \NeedsTeXFormat{LaTeX2e} \def\ST@cslet#1#2{\expandafter\let\expandafter#1\csname#2\endcsname} -\RequirePackage{xstring}[2013/07/29]% version nécessaire +\RequirePackage{xstring}[2013/07/29]% version nécessaire -% liste des fonctions dont l'argument est numérique +% liste des fonctions dont l'argument est numérique \def\ST@functions@with@num@arg{% id,fact,ifeq,ifgt,iflt,numtofrshortdate,numtoengshortdate,numtofrlongdate,gcd,lcm,% numtoenglongdate,numtofrmonth,numtoengmonth,numtofrday,numtoengday} @@ -40,20 +39,17 @@ % liste des fonctions dont l'argument est un texte \def\ST@functions@with@text@arg{frshortdatetonum,engshortdatetonum,englongdatetonum,frlongdatetonum,scitodec,tag,row,col,cell,value} -% liste des fonctions dont l'argument ne doit pas être calculé +% liste des fonctions dont l'argument ne doit pas être calculé \def\ST@functions@no@calc@arg{ifeq,ifgt,iflt,gcd,lcm,value} -% liste des fonctions dont l'argument est une variable -> il ne faut donc pas aller chercher des références dans l'argument +% liste des fonctions dont l'argument est une variable -> il ne faut donc pas aller chercher des références dans l'argument \def\ST@functions@with@assign@argument{tag,row,col,cell,value} -% liste des fonctions dont le résultat est un texte +% liste des fonctions dont le résultat est un texte \def\ST@functions@with@textresult{% numtofrshortdate,numtoengshortdate,numtofrlongdate,numtoenglongdate,% numtofrmonth,numtoengmonth,numtofrday,numtoengday} -% liste totale des fonctions -%\edef\ST@functions@list{\ST@functions@with@range@arg,\ST@functions@with@num@arg,\ST@functions@with@text@arg} - \newif\if@fp \@fpfalse \newif\if@xfp\@xfpfalse \newif\if@STfpactive @@ -65,7 +61,7 @@ \ProcessOptions\relax \ifnum0\if@fp1\fi\if@xfp1\fi=0 \@fptrue\fi% charger fp si aucune option -\if@fp\expandafter\@firstofone\else\expandafter\@gobble\fi% car les \fi ne sont pas équilibrés +\if@fp\expandafter\@firstofone\else\expandafter\@gobble\fi% car les \fi ne sont pas équilibrés { \RequirePackage{fp}% \def\STusefp{% \let\STeval\FPeval @@ -77,15 +73,15 @@ \let\STdiv\FPdiv \def\STseed{\FPseed\number\time\number\day\number\month}% \let\STrandom\FPrandom - \let\STifzero\FPifzero - \let\STifgt\FPifgt - \let\STiflt\FPiflt - \let\STifeq\FPifeq - \let\STifint\FPifint + \def\STifzero##1{\FPifzero{##1}\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}% + \def\STifgt##1##2{\FPifgt{##1}{##2}\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}% + \def\STiflt##1##2{\FPiflt{##1}{##2}\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}% + \def\STifeq##1##2{\FPifeq{##1}{##2}\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}% + \def\STifint##1{\FPifint{##1}\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}% \def\STifneg##1{\STiflt{##1}{0}}% \def\ST@functions@with@range@arg{sum,randint,rand,sumprod}% liste des fonctions dont l'argument est une plage ou est vide \edef\ST@functions@list{\ST@functions@with@range@arg,\ST@functions@with@num@arg,\ST@functions@with@text@arg}% liste totale des fonctions - % Calcule la factorielle du nombre ##1 et met le résultat dans la sc ##2 + % Calcule la factorielle du nombre ##1 et met le résultat dans la sc ##2 \def\ST@func@fact##1##2{% \edef##2{% \ifcase##1 1\or1\or2\or6\or24\or120\or720\or5040\or40320\or362880\or3628800\or39916800\or479001600\or @@ -112,10 +108,10 @@ \let\STseed\relax \def\STrandom##1{\edef##1{\fpeval{rand()}}} \ST@cslet\ST@iftrue{iftrue}\ST@cslet\ST@iffalse{iffalse} - \def\STifgt##1##2{\fp_compare:nNnTF{##1}>{##2}\ST@iftrue\ST@iffalse} - \def\STiflt##1##2{\fp_compare:nNnTF{##1}<{##2}\ST@iftrue\ST@iffalse} - \def\STifeq##1##2{\fp_compare:nNnTF{##1}={##2}\ST@iftrue\ST@iffalse} - \def\STifint ##1{\fp_compare:nNnTF{##1-trunc(##1,0)}={0}\ST@iftrue\ST@iffalse} + \def\STifgt##1##2{\fp_compare:nNnTF{##1}>{##2}} + \def\STiflt##1##2{\fp_compare:nNnTF{##1}<{##2}} + \def\STifeq##1##2{\fp_compare:nNnTF{##1}={##2}} + \def\STifint##1{\fp_compare:nNnTF{##1-trunc(##1,0)}={0}} \def\STifzero##1{\STifeq{##1}{0}} \def\STifneg##1{\STiflt{##1}{0}} \ifdefined\XeTeXrevision% si on compile avec XeLaTeX @@ -148,30 +144,111 @@ \newcount\ST@colcount@i \newcount\ST@rowcount \newcount\ST@rowcount@i -\newcount\ST@intpart +\newcount\ST@integerpart +\newcount\ST@decimalpart \newif\ifST@hiddencol \newif\ifST@debugmode \newif\ifST@colortblloaded \AtBeginDocument{\@ifpackageloaded{colortbl}\ST@colortblloadedtrue\ST@colortblloadedfalse} -% Définit le marqueur qui signale le commencement du champ numérique +% Définit le marqueur qui signale le commencement du champ numérique \def\STnumericfieldmarker{:=} -% Définit la macro qui va afficher les valeurs numériques dans le tableau +% Définit la macro qui va afficher les valeurs numériques dans le tableau \def\STprintnum#1{#1} -% Définit les caractères entre lesquels doivent entre enveloppées les références des cellules +% Définit les caractères entre lesquels doivent entre enveloppées les références des cellules % que l'on veut afficher dans les champs textuels \def\STsetdisplaymarks#1#2{\def\ST@startdisplay{#1}\def\ST@enddisplay{#2}} -\STsetdisplaymarks{<<}{>>}% délimiteurs par défaut +\STsetdisplaymarks{<<}{>>}% délimiteurs par défaut -% définit le marqueur qui signale une cellule de texte +% définit le marqueur qui signale une cellule de texte \edef\STtextcell{\string @} -% Commande qui permet à l'utilisateur de définir le caractère qui conserve une référence lors de la copie d'une formule +% Commande qui permet à l'utilisateur de définir le caractère qui conserve une référence lors de la copie d'une formule \AtBeginDocument{\def\STtransposecar{!}} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Anciennes macros de xstring sinon spreadtab est cassé +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\edef\restoreunderscorecatcode{\catcode\number`\_ =\number\catcode`\_\relax} +\catcode`\_=11 +\long\def\ST@formatnumber#1#2{% + \xs_ifempty{#1}% + {\def#2{0X}% si vide, renvoie 0X + } + {\xs_returnfirstsyntaxunit{#1}\xs_reserved_A + \def\xs_reserved_B{+}% + \xs_ifx{\xs_reserved_A\xs_reserved_B} + {\xs_removefirstsyntaxunit{#1}\xs_reserved_C + \xs_exparg\xs_ifempty{\xs_reserved_C}% + {\def#2{+0X}} + {\xs_exparg{\def#2}{\expandafter+\expandafter0\xs_reserved_C}}% + } + {\def\xs_reserved_B{-}% + \xs_ifx{\xs_reserved_A\xs_reserved_B} + {\xs_removefirstsyntaxunit{#1}\xs_reserved_A + \xs_exparg\xs_ifempty{\xs_reserved_A}% + {\def#2{-0X}}% + {\xs_exparg{\def#2}{\expandafter-\expandafter0\xs_reserved_A}}% + } + {\def#2{0#1}% + }% + }% + }% +} +\def\ST@IfInteger#1{% + \expandafter\ST@formatnumber\expandafter{\expanded{#1}}\xs_reserved_A + \ST@decimalpart0 + \afterassignment\xs_defafterinteger\ST@integerpart\xs_reserved_A\relax\_nil + \let\xs_after_intpart\afterinteger + \expandafter\ST@testdot\afterinteger\_nil + \xs_ifx{\empty\afterdecimal} + {\xs_ifnum{\ST@decimalpart=0 } + {\xs_execfirst% partie décimale constituée de 0 --> seul cas où on renvoie vrai + } + {\expandafter\xs_defafterinteger\xs_after_intpart\relax\_nil + \xs_execsecond + }% + } + {\expandafter\xs_defafterinteger\xs_after_intpart\relax\_nil + \xs_execsecond + }% +} + +\def\ST@IfDecimal#1{% + \expandafter\ST@formatnumber\expandafter{\expanded{#1}}\xs_reserved_A + \ST@decimalpart0 + \afterassignment\xs_defafterinteger\ST@integerpart\xs_reserved_A\relax\_nil + \expandafter\ST@testdot\afterinteger\_nil + \xs_ifx{\empty\afterdecimal} +} + +\long\def\xs_defafterinteger#1\relax\_nil{\def\@xs@afterinteger{#1}\let\afterinteger\@xs@afterinteger} +\long\def\xs_defafterdecimal#1\_nil{\def\@xs@afterdecimal{#1}\let\afterdecimal\@xs@afterinteger} + +\def\ST@testdot{% + \let\xs_decsep\empty + \xs_ifnxttok. + {\def\xs_decsep{.}\ST@readdecimalpart}% + {\ST@testcomma}% +} + +\def\ST@testcomma{% + \xs_ifnxttok, + {\def\xs_dessep{,}\ST@readdecimalpart}% + {\xs_defafterdecimal}% +} + +\long\def\ST@readdecimalpart#1#2\_nil{% + \xs_ifempty{#2} + {\def\xs_reserved_A{0X}} + {\def\xs_reserved_A{0#2}}% + \afterassignment\xs_defafterinteger\ST@decimalpart\xs_reserved_A\relax\_nil + \expandafter\xs_defafterdecimal\afterinteger\_nil +} +\restoreunderscorecatcode %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Messages d'erreur %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -255,7 +332,7 @@ \def\ST@intarg@required{\PackageError\STname{Macro function randint require integer argument}\STseedoc@i} -% transforme la chaine de cellules "(1,3)(4,5)(3,2)(1,3)" rencontré en référence circulaire en "A3-D5-C2-A3" +% transforme la chaine de cellules "(1,3)(4,5)(3,2)(1,3)" rencontré en référence circulaire en "A3-D5-C2-A3" \def\ST@show@dependance@tree{% \ST@between\ST@dependance@tree()\ST@currentref \ST@right\ST@dependance@tree)\ST@dependance@tree @@ -267,7 +344,7 @@ \fi } -% transforme la séquence de contrôle #1 qui contient par exemple «4,5» en «D5» +% transforme la séquence de contrôle #1 qui contient par exemple «4,5» en «D5» \def\ST@coord@toref#1{% \ST@split#1,\ST@temp@a#1% \edef#1{\ifcase\ST@temp@a\or A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or K\or L\or M\or @@ -297,7 +374,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%% Macros de manipulation de chaines %%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\def\ST@gobble@remain{% mange tous jusqu'à \ST@nil. Méthode LENTE privilégiée car il peut y avoir des ) de catcode 2 isolées +\def\ST@gobble@remain{% mange tous jusqu'à \ST@nil. Méthode LENTE privilégiée car il peut y avoir des ) de catcode 2 isolées \afterassignment\ST@gobble@remain@i \let\ST@toks= } @@ -308,7 +385,7 @@ \expandafter\ST@splitatfirstcar@i#1\@nil } -% dans la sc #1, remplace le . par le séparateur décimal +% dans la sc #1, remplace le . par le séparateur décimal \def\ST@substdecsep#1{% \ST@Ifinstr#1. {\expandafter\ST@substdecsep@i\expandafter#1\expandafter{\ST@decsep}} @@ -319,24 +396,24 @@ \expandafter\ST@substdecsep@ii#1\@nil } -% enlève tous les espaces de la sc #1 et assigne le résultat à #1 +% enlève tous les espaces de la sc #1 et assigne le résultat à #1 \def\ST@remove@firST@spaces#1{% \IfBeginWith#1\space {\StrGobbleLeft#11[#1]\ST@remove@firST@spaces{#1}}% {}% } -\def\ST@keep@firstcar#1{% on ne garde dans la sc #1 que le 1er caractère de la sc #1 ou on enlève les accolades +\def\ST@keep@firstcar#1{% on ne garde dans la sc #1 que le 1er caractère de la sc #1 ou on enlève les accolades \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter#1\expandafter\expandafter\expandafter{\expandafter\@car#1\@nil}% } -\def\ST@firstarg@after#1#2#3{% assigne à la sc #3 l'argument qui suit #2 dans le développement de la sc #1 +\def\ST@firstarg@after#1#2#3{% assigne à la sc #3 l'argument qui suit #2 dans le développement de la sc #1 \def\ST@firstarg@after@i##1#2##2##3\@nil{\def#3{##2}}% \expandafter\ST@firstarg@after@i#1\@nil } -\def\ST@thirdarg@after#1#2#3{% assigne à la sc #3 le 3è argument qui suit #2 dans le développement de la sc #1 +\def\ST@thirdarg@after#1#2#3{% assigne à la sc #3 le 3è argument qui suit #2 dans le développement de la sc #1 \def\ST@thirdarg@after@i##1#2##2##3##4##5\@nil{\def#3{##4}}% \expandafter\ST@thirdarg@after@i#1\@nil } @@ -348,7 +425,7 @@ \ST@Ifinstr@ii#1\@@nil#2\@nil } -% Est ce que la sc #1 commence par les caractères #2 ? +% Est ce que la sc #1 commence par les caractères #2 ? \def\ST@Iffirstis#1#2{% \expandafter\ST@Ifinstr@i\expandafter{#1}{#2}% {\def\ST@Iffirstis@i##1#2##2\@nil{% @@ -359,34 +436,34 @@ \expandafter\ST@Iffirstis@i#1\@@nil#2\@nil } -% Coupe la sc #1 au caractère #2 -% ce qui est avant est assigné à #3 et ce qui est après à #4 +% Coupe la sc #1 au caractère #2 +% ce qui est avant est assigné à #3 et ce qui est après à #4 \def\ST@split#1#2#3#4{% \def\ST@split@i##1#2##2\@nil{\def#3{##1}\def#4{##2}}% \expandafter\ST@split@i#1\@nil } -% Dans la sc #1, assigne ce qui est avant le développement de la sc #2 à la sc #3 +% Dans la sc #1, assigne ce qui est avant le développement de la sc #2 à la sc #3 \def\ST@left#1#2#3{\ST@exp@two@args\ST@left@i{#1}{#2}#3} \def\ST@left@i#1#2#3{% \def\ST@left@ii##1#2##2\@nil{\def#3{##1}}% \ST@left@ii#1\@nil } -% Dans la sc #1, assigne ce qui est après le développement de la sc #2 à la sc #3 +% Dans la sc #1, assigne ce qui est après le développement de la sc #2 à la sc #3 \def\ST@right#1#2#3{\ST@exp@two@args\ST@right@i{#1}{#2}#3} \def\ST@right@i#1#2#3{% \def\ST@right@ii##1#2##2\@nil{\def#3{##2}}% \ST@right@ii#1\@nil } -% Dans la sc #1, assigne à la sc #4 ce qui est entre les caractères #2 et #3 +% Dans la sc #1, assigne à la sc #4 ce qui est entre les caractères #2 et #3 \def\ST@between#1#2#3#4{% \def\ST@between@i##1#2##2#3##3\@nil{\def#4{##2}}% \expandafter\ST@between@i#1\@nil } -% Dans la sc #1, substitue la première occurrence du pattern #2 par le pattern #3 +% Dans la sc #1, substitue la première occurrence du pattern #2 par le pattern #3 \def\ST@subST@once#1#2#3{% \def\ST@subST@once@i##1#2##2\@nil{\def#1{##1#3##2}}% \ST@Ifinstr#1{\@empty#2} @@ -426,11 +503,11 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Lecture du tableau %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% lit le tableau : considère que \\ sépare les lignes +% lit le tableau : considère que \\ sépare les lignes \def\ST@read@tab{% \def\ST@total@colnumber{0}% \ST@rowcount\z@ - \ST@search@hline% on met de côté la (ou les) ligne supérieure du tableau + \ST@search@hline% on met de côté la (ou les) ligne supérieure du tableau \ST@read@tab@i } @@ -439,12 +516,12 @@ \ST@Ifinstr\ST@tab{\ST@eol}% si contient \\, il reste encore des lignes {\expandafter\ST@split\expandafter\ST@tab\expandafter{\ST@eol}\ST@current@row\ST@tab \@namedef{endrow@\number\ST@rowcount\expandafter}\expandafter{\ST@eol}% est la fin de cette ligne, pour l'instant - \ST@Iffirstis\ST@tab[% on prend en compte l'éventuel argument optionnel de \\ + \ST@Iffirstis\ST@tab[% on prend en compte l'éventuel argument optionnel de \\ {\ST@between\ST@tab[]\ST@temp@a% prend ce qui est entre crochet - \ST@Ifinstr\ST@temp@a,% si c'est une référence (on teste juste la présence de la virgule, ça devrait suffire) + \ST@Ifinstr\ST@temp@a,% si c'est une référence (on teste juste la présence de la virgule, ça devrait suffire) {}% on ne fait rien {\ST@split\ST@tab]\ST@temp@a\ST@tab% sinon, coupe au crocher fermant - \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname{\ST@temp@a]}}% ajoute l'argument optionnel à la fin de ligne + \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname{\ST@temp@a]}}% ajoute l'argument optionnel à la fin de ligne }% {}% \ST@search@hline% on va purger les hlines et les mettre dans la fin de ligne @@ -455,11 +532,11 @@ \let\ST@next@readrows\ST@read@tab@i \fi }% - {\let\ST@current@row\ST@tab% plus de ligne ? on prend le tout c-à-d la ligne incomplète qui finit le tableau + {\let\ST@current@row\ST@tab% plus de ligne ? on prend le tout c-à -d la ligne incomplète qui finit le tableau \let\ST@next@readrows\relax \edef\ST@total@rownumber{\number\ST@rowcount}}% - \ST@Ifinstr\ST@current@row{\@empty\SThiderow}% il est demandé de masquer la colonne ? - {\edef\ST@row@skiplist{(\number\ST@rowcount)\ST@row@skiplist}% on ajoute le numéro de ligne à masquer à la skiplist + \ST@Ifinstr\ST@current@row{\@empty\SThiderow}% il est demandé de masquer la colonne ? + {\edef\ST@row@skiplist{(\number\ST@rowcount)\ST@row@skiplist}% on ajoute le numéro de ligne à masquer à la skiplist \StrDel\ST@current@row{\@empty\SThiderow}[\ST@current@row]% }% {}% @@ -481,20 +558,20 @@ \ifnum\ST@colcount>\ST@total@colnumber\edef\ST@total@colnumber{\number\ST@colcount}\fi }% \ST@Ifinstr\ST@current@cell{\@empty\SThidecol}% on doit masquer cette colonnes ? - {\ST@Ifinstr\ST@col@skiplist{\expandafter(\number\ST@colcount)}% ça a déjà été demandé ? + {\ST@Ifinstr\ST@col@skiplist{\expandafter(\number\ST@colcount)}% ça a déjà été demandé ? {}% on fait rien - {\edef\ST@col@skiplist{(\number\ST@colcount)\ST@col@skiplist}% sinon -> ajout à la skiplist + {\edef\ST@col@skiplist{(\number\ST@colcount)\ST@col@skiplist}% sinon -> ajout à la skiplist \ifnum\ST@colcount>\ST@laST@skipcol\edef\ST@laST@skipcol{\number\ST@colcount}\fi }% \StrDel\ST@current@cell{\@empty\SThidecol}[\ST@current@cell]% }% {}% \exploregroups - \ST@Ifinstr\ST@current@cell{\@empty\multicolumn}% tester la présence d'un \multicol + \ST@Ifinstr\ST@current@cell{\@empty\multicolumn}% tester la présence d'un \multicol {\ST@firstarg@after\ST@current@cell\multicolumn\STmulticol@number}% {\let\STmulticol@number\@empty}% - \IfSubStr\ST@current@cell\STnumericfieldmarker% il y a un marqueur de champ numérique ? - {\IfSubStr\ST@current@cell{\@empty\STcopy}\ST@invalidSTcopy{}% s'il y a un \STcopy, erreur (pas de champ numérique et de \STcopy dans une même cellule) + \IfSubStr\ST@current@cell\STnumericfieldmarker% il y a un marqueur de champ numérique ? + {\IfSubStr\ST@current@cell{\@empty\STcopy}\ST@invalidSTcopy{}% s'il y a un \STcopy, erreur (pas de champ numérique et de \STcopy dans une même cellule) \StrBehind\ST@current@cell\STnumericfieldmarker[\ST@current@formula]% \noexploregroups \StrChar\ST@current@formula1[\ST@temp@a]% \ST@temp@a contient {<formule} @@ -503,58 +580,58 @@ \ST@expadd@tomacro\ST@temp@b\ST@temp@a \StrSubstitute[1]\ST@current@cell\ST@temp@b\STnumericfieldmarker[\ST@current@cell]% on remplace :={<formule>} par ":=" \noexploregroups - \ST@keep@firstcar\ST@temp@a% dans la formule, on enlève les accolades + \ST@keep@firstcar\ST@temp@a% dans la formule, on enlève les accolades \ST@removespaces\ST@temp@a% et tous les espaces \ifx\ST@temp@a\@empty% \ST@temp@a contient la formule : si la formule est vide \ifx\ST@copylist\@empty% pas de copylist ? - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% met le code à 0 + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% met le code à 0 \else% si la copylist existe \ST@lookincopylist{\number\ST@colcount}{\number\ST@rowcount}\ST@celltocopy% on cherche si la cellule en cours est dans une plage de copie \ifx\ST@celltocopy\@empty - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% si c'est non, met le code à 0 + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% si c'est non, met le code à 0 \StrDel[1]\ST@current@cell\STnumericfieldmarker[\ST@current@cell]% on supprime aussi ":=" \else - \ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@celltocopy% il y a une cellule à copier : on l'assigne au champ numérique - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{1}% et on met le code à 1 + \ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@celltocopy% il y a une cellule à copier : on l'assigne au champ numérique + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{1}% et on met le code à 1 \fi \fi \else% la formule n'est pas vide - \ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@temp@a% et on assigne à la formule - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{1}% code 1 à priori + \ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@temp@a% et on assigne à la formule + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{1}% code 1 à priori \fi - }% ci dessous, il n'y a pas de marqueur de champ numérique + }% ci dessous, il n'y a pas de marqueur de champ numérique {\IfSubStr\ST@current@cell\STtextcell% si c'est une cellule de texte {\StrDel\ST@current@cell\STtextcell[\ST@current@cell]% on le(s) supprime les flags - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% met le code à 0 - }% ci dessous, ce n'est pas une cellule texte, c'est donc une cellule purement champ numérique sans marqueur + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% met le code à 0 + }% ci dessous, ce n'est pas une cellule texte, c'est donc une cellule purement champ numérique sans marqueur {\StrDel\ST@current@cell\space[\ST@temp@a]% \ifx\@empty\ST@temp@a% il n'y a que des espaces, c'est donc une cellule vide \ifx\ST@copylist\@empty% pas de copylist ? - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% met le code à 0 + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% met le code à 0 \else% si la copylist existe \ST@lookincopylist{\number\ST@colcount}{\number\ST@rowcount}\ST@celltocopy% on cherche si la cellule en cours est dans un oplage de copie \ifx\ST@celltocopy\@empty - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% si c'est non, met le code à 0 + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{0}% si c'est non, met le code à 0 \else - \let\ST@current@cell\STnumericfieldmarker% il y a une cellule à copier ici - \ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@celltocopy% on l'assigne au champ numérique - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{1}% et on met le code à 1 + \let\ST@current@cell\STnumericfieldmarker% il y a une cellule à copier ici + \ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@celltocopy% on l'assigne au champ numérique + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{1}% et on met le code à 1 \fi \fi - \else% ici, la cellule est composée d'une champ numérique sans marqueur - \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{1}% toute la cellule est considérée comme champ numérique + \else% ici, la cellule est composée d'une champ numérique sans marqueur + \@namedef{code@\number\ST@colcount @\number\ST@rowcount}{1}% toute la cellule est considérée comme champ numérique \ST@remove@firST@spaces\ST@current@cell \ST@Ifinstr\ST@current@cell{\@empty\STcopy}% {\ST@findcopyargs\ST@current@cell\ST@copyrange\ST@copyformula% on chope les arguments de \STcopy - \ST@seekcopyoffset\ST@copyrange% cherche les décalages - \edef\ST@copyrange{\ST@hoffest,\ST@voffest}% et affecte sous forme a,b où a et b sont des nombres ou sont vides - \expandafter\def\expandafter\ST@newtocopylist\expandafter{\expandafter|\ST@copyformula|}% \ST@newtocopylist est le nouvel élément à ajouter à la copylist + \ST@seekcopyoffset\ST@copyrange% cherche les décalages + \edef\ST@copyrange{\ST@hoffest,\ST@voffest}% et affecte sous forme a,b où a et b sont des nombres ou sont vides + \expandafter\def\expandafter\ST@newtocopylist\expandafter{\expandafter|\ST@copyformula|}% \ST@newtocopylist est le nouvel élément à ajouter à la copylist \ST@edefadd@tomacro\ST@newtocopylist{[\number\ST@colcount,\number\ST@rowcount]}% \ST@expadd@tomacro\ST@newtocopylist{\expandafter(\ST@copyrange)}% - \ST@expadd@tomacro\ST@newtocopylist\ST@copylist% ajoute la copylist à la fin - \let\ST@copylist\ST@newtocopylist% et l'assigne à copylist - \ST@transposeformula00\ST@copyformula\ST@copyformula% on transpose éventuellement pour gérer les "!" - \ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@copyformula% affecte la formule inchangée au champ numérique courant + \ST@expadd@tomacro\ST@newtocopylist\ST@copylist% ajoute la copylist à la fin + \let\ST@copylist\ST@newtocopylist% et l'assigne à copylist + \ST@transposeformula00\ST@copyformula\ST@copyformula% on transpose éventuellement pour gérer les "!" + \ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@copyformula% affecte la formule inchangée au champ numérique courant }% {\ST@letname{formula@\number\ST@colcount @\number\ST@rowcount}\ST@current@cell% et on assigne toute la cellule \let\ST@current@cell\STnumericfieldmarker% et on met le flag pour la formule @@ -568,7 +645,7 @@ \fi \ST@letname{text@\number\ST@colcount @\number\ST@rowcount}\ST@current@cell \unless\ifx\@empty\STmulticol@number% si c'est une cellule qui contient \multicolumn - \loop% on met tous les codes des cellules fusionées qui suivent la cellule en cours à -1 + \loop% on met tous les codes des cellules fusionées qui suivent la cellule en cours à -1 \ifnum\STmulticol@number>\@ne \edef\STmulticol@number{\number\numexpr\STmulticol@number-1}% \advance\ST@colcount\@ne @@ -579,7 +656,7 @@ } % On va essayer de purger dans #1 toutes les \hline, \clines, \hhline etc, et ajouter tout ce beau monde -% et leur evéntuels arguments dans des sc spéciales (par ex \endrow@3 pour la fin de la 3e ligne.) +% et leur evéntuels arguments dans des sc spéciales (par ex \endrow@3 pour la fin de la 3e ligne.) \def\ST@search@hline{% \ST@ifvalid@csname{endrow@\number\ST@rowcount}% {} @@ -588,39 +665,39 @@ } \def\ST@search@hline@i{% - \ST@remove@firST@spaces\ST@tab% on enlève les espaces au début + \ST@remove@firST@spaces\ST@tab% on enlève les espaces au début \StrChar\ST@tab1[\ST@temp@a]% \ST@temp@a est le 1er car \let\ST@next\ST@search@hline@i - \IfStrEqCase\ST@temp@a{% on envisage tous les cas de tracé de ligne horizontale + \IfStrEqCase\ST@temp@a{% on envisage tous les cas de tracé de ligne horizontale {\@empty\hline}{\StrGobbleLeft\ST@tab1[\ST@tab]\expandafter\STadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\hline}% {\@empty\cline}{\StrSplit\ST@tab2\ST@temp@a\ST@tab\expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a}% {\@empty\hhline}{\StrSplit\ST@tab2\ST@temp@a\ST@tab\expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a}% {\@empty\noalign}{\StrSplit\ST@tab2\ST@temp@a\ST@tab\expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a}% {\@empty\toprule}{% les commandes de booktabs - \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lexème : la commande \toprule + \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lexème : la commande \toprule \IfBeginWith\ST@tab[{\StrBefore\ST@tab][\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b]}\StrBehind\ST@tab][\ST@tab]}{}% \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a }% {\@empty\midrule}{% - \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lexème : la commande \midrule + \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lexème : la commande \midrule \IfBeginWith\ST@tab[{\StrBefore\ST@tab][\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b]}\StrBehind\ST@tab][\ST@tab]}{}% \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a }% {\@empty\bottomrule}{% - \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lexème : la commande \bottomrule + \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lexème : la commande \bottomrule \IfBeginWith\ST@tab[{\StrBefore\ST@tab][\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b]}\StrBehind\ST@tab][\ST@tab]}{}% \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a }% {\@empty\cmidrule}{% - \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lexème : la commande \cmidrule + \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lexème : la commande \cmidrule \IfBeginWith\ST@tab[{\StrBefore\ST@tab][\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b]}\StrBehind\ST@tab][\ST@tab]}{}% \IfBeginWith\ST@tab({\StrBefore\ST@tab)[\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b)}\StrBehind\ST@tab)[\ST@tab]}{}% \StrSplit\ST@tab1\ST@temp@b\ST@tab% chope l'argument obligatoire : {a-b} - \ST@expadd@tomacro\ST@temp@a\ST@temp@b% l'ajoute à \ST@temp@b - \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a% et on ajoute le tout à endrow + \ST@expadd@tomacro\ST@temp@a\ST@temp@b% l'ajoute à \ST@temp@b + \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a% et on ajoute le tout à endrow }% {\@empty\addlinespace}{% - \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lexème : la commande \addlinespace + \StrSplit\ST@tab1\ST@temp@a\ST@tab% chope le 1er lexème : la commande \addlinespace \IfBeginWith\ST@tab[{\StrBefore\ST@tab][\ST@temp@b]\ST@expadd@tomacro\ST@temp@a{\ST@temp@b]}\StrBehind\ST@tab][\ST@tab]}{}% \expandafter\ST@expadd@tomacro\csname endrow@\number\ST@rowcount\endcsname\ST@temp@a }% @@ -630,9 +707,9 @@ \ST@next } -% Cette macro transpose toutes les références (absolues et relatives) de la sc #3. -% Le décalage est de #1 (nombre signé) pour les colonnes et de #2 (nombre signé) pour les lignes. -% La sc #4 recoit la formule transposée. +% Cette macro transpose toutes les références (absolues et relatives) de la sc #3. +% Le décalage est de #1 (nombre signé) pour les colonnes et de #2 (nombre signé) pour les lignes. +% La sc #4 recoit la formule transposée. \def\ST@transposeformula#1#2#3#4{% \def\STaddcol{#1}\def\STaddrow{#2}\let\ST@temp@formula#3% \let\ST@transposed@formula\@empty @@ -643,30 +720,30 @@ \def\ST@transposeformula@i{% \unless\ifx\@empty\ST@temp@formula% tant que l'on n'a pas parcouru \ST@temp@formula \ST@splitatfirstcar\ST@temp@formula\ST@firstcar\ST@temp@formula% prend le 1er car de \ST@temp@formula - \if\expandafter\noexpand\STtransposecar\expandafter\noexpand\ST@firstcar% si ce caractère est un ! + \if\expandafter\noexpand\STtransposecar\expandafter\noexpand\ST@firstcar% si ce caractère est un ! \let\STaddcol@\z@% pas de tranposition sur la colonne - \ST@splitatfirstcar\ST@temp@formula\ST@firstcar\ST@temp@formula% on prend le premier caractère qui suit le ! + \ST@splitatfirstcar\ST@temp@formula\ST@firstcar\ST@temp@formula% on prend le premier caractère qui suit le ! \else \let\STaddcol@\STaddcol% sinon, on copie le vecteur \fi \expandafter\ST@ifcar@isletter\expandafter{\ST@firstcar}% est-ce que le 1er car est une lettre ? - {\if\expandafter\noexpand\STtransposecar\expandafter\expandafter\expandafter\noexpand\expandafter\@car\ST@temp@formula\@nil% le caractère suivant est un "!" ? + {\if\expandafter\noexpand\STtransposecar\expandafter\expandafter\expandafter\noexpand\expandafter\@car\ST@temp@formula\@nil% le caractère suivant est un "!" ? \let\STaddrow@\z@% pas de tranposition sur la ligne - \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST@temp@formula\expandafter\expandafter\expandafter{\expandafter\@cdr\ST@temp@formula\@nil}% on prend ce qui est après le ! + \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST@temp@formula\expandafter\expandafter\expandafter{\expandafter\@cdr\ST@temp@formula\@nil}% on prend ce qui est après le ! \else \let\STaddrow@\STaddrow% sinon, on copie le vecteur \fi - \IfInteger\ST@temp@formula{}{}% on prend le nombre qui suit - \ifnum\integerpart>\z@% si ce nombre est plus grand que 0 -> référence valide - \let\ST@temp@formula\@xs@afterinteger% on prend ce qui est après le nombre + \ST@IfInteger\ST@temp@formula{}{}% on prend le nombre qui suit + \ifnum\ST@integerpart>\z@% si ce nombre est plus grand que 0 -> référence valide + \let\ST@temp@formula\@xs@afterinteger% on prend ce qui est après le nombre \expandafter\lowercase\expandafter{\expandafter\def\expandafter\ST@firstcar\expandafter{\ST@firstcar}}% met en minuscules - \edef\ST@firstcar{\number\numexpr\expandafter`\ST@firstcar-`a+1+\STaddcol@}% est le numéro de la colonne + \edef\ST@firstcar{\number\numexpr\expandafter`\ST@firstcar-`a+1+\STaddcol@}% est le numéro de la colonne \ifnum\ST@firstcar<\@ne\ST@illegal@copy\fi% erreur de copie ? \ST@edefadd@tomacro\ST@transposed@formula{% \ifcase\ST@firstcar \or a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m\or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\fi - \number\numexpr\integerpart+\STaddrow@}% - \ifnum\numexpr\integerpart+\STaddrow@<\@ne\ST@illegal@copy\fi% erreur de copie ? + \number\numexpr\ST@integerpart+\STaddrow@}% + \ifnum\numexpr\ST@integerpart+\STaddrow@<\@ne\ST@illegal@copy\fi% erreur de copie ? \else \let\ST@temp@formula\@xs@afterinteger \ST@expadd@tomacro\ST@transposed@formula\ST@firstcar @@ -674,24 +751,24 @@ }% {\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ès le crochet + \ST@right\ST@temp@formula]\ST@temp@formula% pour la suite, on prend ce qui après le crochet \ST@left\ST@temp@ref,\ST@rel@num% ce qui est avant la virgule \if\expandafter\noexpand\STtransposecar\expandafter\expandafter\expandafter\noexpand\expandafter\@car\ST@rel@num\@nil% commence par un "!" ? \let\STaddcol@\STaddcol% compensation pour conserver la cellule initiale - \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST@rel@num\expandafter\expandafter\expandafter{\expandafter\@cdr\ST@rel@num\@nil}% on prend ce qui est après le ! + \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST@rel@num\expandafter\expandafter\expandafter{\expandafter\@cdr\ST@rel@num\@nil}% on prend ce qui est après le ! \else \let\STaddcol@\z@% sinon, on n'ajoute rien \fi - \IfInteger\ST@rel@num + \ST@IfInteger\ST@rel@num {\edef\STaddcol@{\number\numexpr\ST@rel@num-\STaddcol@}% - \ST@right\ST@temp@ref,\ST@rel@num% ce qui est après la virgule + \ST@right\ST@temp@ref,\ST@rel@num% ce qui est après la virgule \if\expandafter\noexpand\STtransposecar\expandafter\expandafter\expandafter\noexpand\expandafter\@car\ST@rel@num\@nil% commence par un "!"? \let\STaddrow@\STaddrow% on compense pour conserver la cellule initiale - \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST@rel@num\expandafter\expandafter\expandafter{\expandafter\@cdr\ST@rel@num\@nil}% on prend ce qui est après le ! + \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST@rel@num\expandafter\expandafter\expandafter{\expandafter\@cdr\ST@rel@num\@nil}% on prend ce qui est après le ! \else \let\STaddrow@\z@% sinon, on n'ajoute rien \fi - \IfInteger\ST@rel@num + \ST@IfInteger\ST@rel@num {\ST@edefadd@tomacro\ST@transposed@formula{[\STaddcol@,\number\numexpr\ST@rel@num-\STaddrow@]}% }% \ST@illegal@relativeref @@ -705,8 +782,8 @@ \fi } -% Cherche dans la sc #1 les 3 arguments qui se trouvent après \STcopy -% Affecte le 1er à #2, le 2è à #3 et le 3è à #4 +% Cherche dans la sc #1 les 3 arguments qui se trouvent après \STcopy +% Affecte le 1er à #2, le 2è à #3 et le 3è à #4 \def\ST@findcopyargs#1#2#3{% \def\ST@argaftercopy##1\STcopy##2##3##4\@nil{% \def#1{##1}\ST@expadd@tomacro#1{\STnumericfieldmarker##4}% dans #1,supprime \STcopy{<arg1>}{<arg2>} et le remplace par := @@ -755,9 +832,9 @@ \ST@next } -% Regarde dans la liste de copie si la cellule de coodonnées #1 #2 est dans une plage de copie -% si oui, affecte à #3 la formule transposée -% La liste de copy est parcourue de gauche à droite avec sortie dès qu'une plage qui convient est rencontrée +% Regarde dans la liste de copie si la cellule de coodonnées #1 #2 est dans une plage de copie +% si oui, affecte à #3 la formule transposée +% La liste de copy est parcourue de gauche à droite avec sortie dès qu'une plage qui convient est rencontrée \def\ST@lookincopylist#1#2#3{% \let\ST@alias@copylist\ST@copylist \let\ST@returnedformula\@empty @@ -780,26 +857,26 @@ \ST@next } -% Teste si un élément de la copylist contient une plage qui inclus la cellule en cours. +% Teste si un élément de la copylist contient une plage qui inclus la cellule en cours. \def\ST@testfirstincopylist|#1|[#2,#3](#4,#5)#6\@nil{% - \def\ST@alias@copylist{#6}% on enlève le premier élément de la copylist - \ST@Ifin\ST@copycol\ST@copyrow[#2,#3](#4,#5)% si ça correspond + \def\ST@alias@copylist{#6}% on enlève le premier élément de la copylist + \ST@Ifin\ST@copycol\ST@copyrow[#2,#3](#4,#5)% si ça correspond {\def\ST@returnedformula{#1}% \ST@transposeformula{\numexpr\ST@copycol-#2}{\numexpr\ST@copyrow-#3}\ST@returnedformula\ST@returnedformula }% {\ifx\@empty#5\@empty\else \ifnum\ST@copyrow>\numexpr#3+#5\relax - \ST@subst\ST@copylist{|#1|[#2,#3](#4,#5)}{}% si on a dépassé la ligne, on retire ce premier élément de la copylist + \ST@subst\ST@copylist{|#1|[#2,#3](#4,#5)}{}% si on a dépassé la ligne, on retire ce premier élément de la copylist \fi \fi }% } -% Cherche dans la sc#1 du type ">4,v9" les décalages horizontaux et verticaux -% spécifiés avec > et v -% S'il trouve > ou v sans nombre derrière, le décalage correspondant est vide -% S'il ne trouve pas > ou v, le décalage correspond est égal à 0 -% Assigne les décalages trouvés dans \ST@hoffest et \ST@voffest +% Cherche dans la sc#1 du type ">4,v9" les décalages horizontaux et verticaux +% spécifiés avec > et v +% S'il trouve > ou v sans nombre derrière, le décalage correspondant est vide +% S'il ne trouve pas > ou v, le décalage correspond est égal à 0 +% Assigne les décalages trouvés dans \ST@hoffest et \ST@voffest \def\ST@seekcopyoffset#1{% \ST@Ifinstr#1>% {\ST@findcopyoffest#1>\ST@hoffest}% @@ -816,7 +893,7 @@ } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%% Recherche d'une référence %%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%% Recherche d'une référence %%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % teste si le token #1 est une lettre (majuscule ou minuscule) \def\ST@ifcar@isletter#1{% @@ -828,8 +905,8 @@ \ifnum\numexpr(`#1-`a)*(`#1-`z)\relax>\z@\expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi } -% cherche une référence du type lettre+nombre dans la sc #1 -% si on trouve, renvoie les coordonnées dans #2 sous la forme x@y +% cherche une référence du type lettre+nombre dans la sc #1 +% si on trouve, renvoie les coordonnées dans #2 sous la forme x@y % si on ne trouve pas, #2 est vide. \def\ST@findref@informula#1#2{% \let\ST@temp@formula#1% @@ -849,14 +926,14 @@ \else \StrSplit\ST@temp@formula1\ST@firstcar\ST@temp@formula% prend le 1er car de ce qui reste \expandafter\ST@ifcar@isletter\expandafter{\ST@firstcar}% est-ce que le 1er car est une lettre ? - {\IfInteger\ST@temp@formula{}{}% on prend le nombre qui suit - \ifnum\integerpart>\z@% si ce nombre est plus grand que 0 -> référence valide + {\ST@IfInteger\ST@temp@formula{}{}% on prend le nombre qui suit + \ifnum\ST@integerpart>\z@% si ce nombre est plus grand que 0 -> référence valide \let\ST@after@ref@found\@xs@afterinteger - \edef\ST@ref@found{\ST@firstcar\number\integerpart}% est la référence trouvée - \edef\ST@distant@rownumber{\number\integerpart}% on chope ce nombre pour le numéro de colonne + \edef\ST@ref@found{\ST@firstcar\number\ST@integerpart}% est la référence trouvée + \edef\ST@distant@rownumber{\number\ST@integerpart}% on chope ce nombre pour le numéro de colonne \edef\ST@distant@colnumber{\number\numexpr\expandafter`\ST@firstcar-`a+1}% traduction lettre->chiffre \ifnum\ST@distant@colnumber<\z@\edef\ST@distant@colnumber{\number\numexpr\ST@distant@colnumber+32}\fi% met les majuscules en minuscules - \edef\ST@temp@formula{\ST@distant@colnumber @\ST@distant@rownumber}% les coordonnées de la référence + \edef\ST@temp@formula{\ST@distant@colnumber @\ST@distant@rownumber}% les coordonnées de la référence \let\ST@next@search\relax \fi }% @@ -865,12 +942,12 @@ \ST@left\ST@temp@formula]\ST@temp@formula% on prend ce qui est entre crochet \expandafter\def\expandafter\ST@ref@found\expandafter{\expandafter[\ST@temp@formula]}% \ST@left\ST@temp@formula,\ST@rel@num - \IfInteger\ST@rel@num + \ST@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 + \ST@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ées de la référence + \edef\ST@temp@formula{\ST@distant@colnumber @\ST@distant@rownumber}% les coordonnées de la référence \let\ST@next@search\relax }% \ST@illegal@relativeref @@ -882,7 +959,7 @@ \ST@next@search } -% cette commande teste si la sc #1 est syntaxiquement une référence +% cette commande teste si la sc #1 est syntaxiquement une référence \def\ST@ifref#1{% \let\ST@temp@formula#1% \let\ST@ref@found\@empty @@ -900,19 +977,19 @@ } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%% Le noyau : évaluation de toutes les cellules %%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%% Le noyau : évaluation de toutes les cellules %%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Essaie de calculer la cellule (#1,#2) \def\ST@try@calc@cell(#1,#2){% - \ST@ifvalid@csname{formula@#1@#2}% on vérifie que la formule existe + \ST@ifvalid@csname{formula@#1@#2}% on vérifie que la formule existe {\expandafter\ifx\csname formula@#1@#2\endcsname\@empty - \@namedef{code@#1@#2}{0}% si vide, code à 0 + \@namedef{code@#1@#2}{0}% si vide, code à 0 \else% et qu'elle est non vide \def\ST@current@colnumber{#1}\def\ST@current@rownumber{#2}% \expandafter\ST@find@firST@func\csname formula@#1@#2\endcsname% cherche une fonction dans la formule \ifx\@empty\ST@function@namefound% s'il n'y a pas de fonction \expandafter\ST@findref@informula\csname formula@#1@#2\endcsname\ST@coord - \ifx\@empty\ST@coord% ni de référence + \ifx\@empty\ST@coord% ni de référence \ST@calc@cell(#1,#2)% on va la calculer la cellule \fi \fi @@ -921,7 +998,7 @@ {}% } -\def\ST@calc@cell(#1,#2){% calcule la formule numérique de la cellule (#1,#2) +\def\ST@calc@cell(#1,#2){% calcule la formule numérique de la cellule (#1,#2) \unless\ifnum\csname code@#1@#2\endcsname<\@ne% si le code est >= 1 \ST@cslet\ST@temp@a{formula@#1@#2}% \ST@temp@a est le contenu de la formule \ST@Iffirstis\ST@temp@a-{\expandafter\def\expandafter\ST@temp@a\expandafter{\expandafter0\ST@temp@a}}{}% @@ -934,8 +1011,8 @@ \STtrunc\ST@temp@a\ST@temp@a\STrounddigit \fi \fi - \ST@letname{formula@#1@#2}\ST@temp@a% assigne le résultat à la formule - \@namedef{code@#1@#2}{2}% et met le code à 2 (cellule calculée) + \ST@letname{formula@#1@#2}\ST@temp@a% assigne le résultat à la formule + \@namedef{code@#1@#2}{2}% et met le code à 2 (cellule calculée) \fi } @@ -963,7 +1040,7 @@ } % la sc #1 est le nom d'une fonction. -% La macro renvoie dans la sc #2 : 1, 2 ou 2 selon que #1 est le nom d'une macro à argument numérique, à argument plage ou à argument texte. +% La macro renvoie dans la sc #2 : 1, 2 ou 2 selon que #1 est le nom d'une macro à argument numérique, à argument plage ou à argument texte. % #2 est vaut 0 si #1 n'est pas le nom d'une fonction \def\ST@determine@function@code#1#2{% \ST@Ifinstr{\ST@functions@with@num@arg,}{#1,}% @@ -977,12 +1054,12 @@ }% } -% évalue la cellule (#1#2) par ses coordonnées numériques (col,row) +% évalue la cellule (#1#2) par ses coordonnées numériques (col,row) \def\STeval@cell(#1,#2){% \edef\ST@dependance@tree{(#1,#2)}% FIXME : mettre \edef \let\ST@stackcall\@empty \let\ST@function@namesaved\@empty - \STeval@cell@i(#1,#2)% on appelle la macro récursive + \STeval@cell@i(#1,#2)% on appelle la macro récursive \ifST@message \let\ST@deptree\@empty \ST@show@dependance@tree @@ -991,87 +1068,87 @@ \fi } -% Ceci est la macro principale : elle évalue la cellule (#1,#2) +% Ceci est la macro principale : elle évalue la cellule (#1,#2) \def\STeval@cell@i(#1,#2){% #1 = no colonne #2 = no ligne - \ifnum\csname code@#1@#2\endcsname=\@ne% on ne fait quelque chose que si le code est 1 : cellule non calculée + \ifnum\csname code@#1@#2\endcsname=\@ne% on ne fait quelque chose que si le code est 1 : cellule non calculée \def\ST@current@colnumber{#1}\def\ST@current@rownumber{#2}% \expandafter\ST@find@firST@func\csname formula@#1@#2\endcsname% cherche une fonction dans la formule \ifx\@empty\ST@function@namefound% il n'y a pas de fonction \IfSubStr[2]\ST@dependance@tree{(#1,#2)}% - {\edef\ST@coord{#1,#2}\ST@circular@reference}% message et on s'arrête si référence circulaire + {\edef\ST@coord{#1,#2}\ST@circular@reference}% message et on s'arrête si référence circulaire {}% - \expandafter\ST@findref@informula\csname formula@#1@#2\endcsname\ST@coord% y a t-il une référence dans l'argument ? - \ifx\ST@coord\@empty% pas de référence dans l'argument - \ifx\ST@function@namesaved\@empty% si aucune fonction n'a été décelée + \expandafter\ST@findref@informula\csname formula@#1@#2\endcsname\ST@coord% y a t-il une référence dans l'argument ? + \ifx\ST@coord\@empty% pas de référence dans l'argument + \ifx\ST@function@namesaved\@empty% si aucune fonction n'a été décelée \ST@calc@cell(#1,#2)% on calcule la cellule en cours \else - \ST@Ifinstr{\ST@functions@with@textresult,}{\ST@function@namesaved,}% si la dernière fonction rend du texte + \ST@Ifinstr{\ST@functions@with@textresult,}{\ST@function@namesaved,}% si la dernière fonction rend du texte {\ifx\ST@stackcall\@empty% et si on est dans la cellule source - \@namedef{code@#1@#2}{0}% on met le code à 0, la cellule devient textuelle + \@namedef{code@#1@#2}{0}% on met le code à 0, la cellule devient textuelle \exploregroups \expandafter\StrSubstitute\expandafter[\expandafter\@ne\expandafter]\csname text@#1@#2\expandafter\endcsname\expandafter\STnumericfieldmarker\csname formula@#1@#2\expandafter\endcsname\expandafter[\csname text@#1@#2\endcsname]% copie de la formule vers la zone texte \noexploregroups \ST@letname{formula@#1@#2}\@empty% et plus rien dans la formule \else - \ST@calc@cell(#1,#2)% sinon, on se trouve dans une cellule appelée par une macrofonction et donc, on la calcule + \ST@calc@cell(#1,#2)% sinon, on se trouve dans une cellule appelée par une macrofonction et donc, on la calcule \fi }% - {\ST@calc@cell(#1,#2)}% c'est une fonction qui donne un arg numérique : on calcule la cellule en cours + {\ST@calc@cell(#1,#2)}% c'est une fonction qui donne un arg numérique : on calcule la cellule en cours \fi \else \ST@ifvalid@csname{code@\ST@coord}% le code distant exite ? {\ifcase\csname code@\ST@coord\endcsname% code distant = 0 ==> cellule vide ou textuelle, pas bon du tout ! - \edef\ST@temp@callcell{#1,#2}% coordonnées de la cellule appelante - \edef\ST@coord{\ST@distant@colnumber,\ST@distant@rownumber}% coordonnées appelées - \ST@zerocodecell@cell% erreur : référence à une cellule de code 0 + \edef\ST@temp@callcell{#1,#2}% coordonnées de la cellule appelante + \edef\ST@coord{\ST@distant@colnumber,\ST@distant@rownumber}% coordonnées appelées + \ST@zerocodecell@cell% erreur : référence à une cellule de code 0 \or% code distant = 1 - \edef\ST@dependance@tree{\ST@dependance@tree(\ST@distant@colnumber,\ST@distant@rownumber)}% on l'ajoute à l'arbre des dépendances - % on doit évaluer cette formule distante et ensuite, on doit encore recommence avec la formule en cours : on les ajoute sur la pile lifo + \edef\ST@dependance@tree{\ST@dependance@tree(\ST@distant@colnumber,\ST@distant@rownumber)}% on l'ajoute à l'arbre des dépendances + % on doit évaluer cette formule distante et ensuite, on doit encore recommence avec la formule en cours : on les ajoute sur la pile lifo \edef\ST@stackcall{(\ST@distant@colnumber,\ST@distant@rownumber)(#1,#2)\ST@stackcall}% - \or% code distant = 2, la cellule distante est calculée, on créé un alias pour le contenu de la formule distante + \or% code distant = 2, la cellule distante est calculée, on créé un alias pour le contenu de la formule distante \ST@cslet\ST@distant@formula{formula@\ST@coord}% - % si la valeur distante est <0, on la met entre parenthèses + % si la valeur distante est <0, on la met entre parenthèses \ST@Iffirstis\ST@distant@formula-% {\expandafter\def\expandafter\ST@distant@formula\expandafter{\expandafter(\ST@distant@formula)}}% {}% - % on remplace toutes les références par la valeur distante + % on remplace toutes les références par la valeur distante \expandafter\ST@expsubst\csname formula@#1@#2\endcsname{\ST@ref@found|}\ST@distant@formula - \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule + \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule \else% code distant n'est pas {0,1,2} donc est -1, pas bon du tout ! - \edef\ST@temp@callcell{#1,#2}% coordonnées de la cellule appelante - \ST@subst\ST@coord @,% coordonnées appelées + \edef\ST@temp@callcell{#1,#2}% coordonnées de la cellule appelante + \ST@subst\ST@coord @,% coordonnées appelées \STmulticol@cell \fi}% - {\edef\ST@temp@callcell{#1,#2}% coordonnées de la cellule appelante - \ST@subst\ST@coord @,% coordonnées appelées + {\edef\ST@temp@callcell{#1,#2}% coordonnées de la cellule appelante + \ST@subst\ST@coord @,% coordonnées appelées \ST@undefined@cell% code distant inexistant -> cellule hors limite du tableau }% \fi \else% il y a une fonction dans la formule \let\ST@function@namesaved\ST@function@namefound - \ST@determine@function@code\ST@function@namefound\ST@codefunc% détermine le code de la fonction + \ST@determine@function@code\ST@function@namefound\ST@codefunc% détermine le code de la fonction \ifcase\ST@codefunc\relax \PackageError\STname{This error should not occur! Please email the author. Thanks.}{}% - \or% le code vaut 1, c'est une fonction à argument numérique - \ST@findref@informula\ST@function@argfound\ST@temp@formula% y a t-il une référence dans l'argument de la formule ? - \ifx\ST@temp@formula\@empty% pas de référence dans l'argument de la fonction + \or% le code vaut 1, c'est une fonction à argument numérique + \ST@findref@informula\ST@function@argfound\ST@temp@formula% y a t-il une référence dans l'argument de la formule ? + \ifx\ST@temp@formula\@empty% pas de référence dans l'argument de la fonction \ST@cslet\ST@current@formula{formula@#1@#2}% alias pour la formule \let\ST@tobereplaced\ST@function@namefound - \ST@expadd@tomacro\ST@tobereplaced{\expandafter(\ST@function@argfound)}% ce qui va être replacé : fonction(argument) + \ST@expadd@tomacro\ST@tobereplaced{\expandafter(\ST@function@argfound)}% ce qui va être replacé : fonction(argument) \ST@Ifinstr{\ST@functions@no@calc@arg,}{\ST@function@namefound,}% doit-on calculer l'argument de cette fonction ? {}% {\STeval\ST@function@argfound\ST@function@argfound\STclip\ST@function@argfound\ST@function@argfound}% - \csname ST@func@\ST@function@namefound\endcsname\ST@function@argfound\ST@result@func% puis on évalue la fonctionfound + \csname ST@func@\ST@function@namefound\endcsname\ST@function@argfound\ST@result@func% puis on évalue la fonctionfound \ST@Iffirstis\ST@result@func-{\expandafter\def\expandafter\ST@result@func\expandafter{\expandafter(\ST@result@func)}}{}% \ST@expsubst\ST@current@formula\ST@tobereplaced\ST@result@func% on replace dans l'alias \ST@letname{formula@#1@#2}\ST@current@formula% on l'assigne dans la formule - \ifx\@empty\ST@current@formula% pour cause de macro fonction "tag" qui est seule et qui a disparue après substitution + \ifx\@empty\ST@current@formula% pour cause de macro fonction "tag" qui est seule et qui a disparue après substitution \@namedef{code@#1@#2}{0}% \else - \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule + \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule \fi \else - \ifnum\csname code@\ST@temp@formula\endcsname=\tw@% si la référence est calculée, on la replace par sa valeur + \ifnum\csname code@\ST@temp@formula\endcsname=\tw@% si la référence est calculée, on la replace par sa valeur \ST@cslet\ST@current@formula{formula@\ST@temp@formula}% alias pour la formule distante \ST@Iffirstis\ST@current@formula-% {\expandafter\def\expandafter\ST@current@formula\expandafter{\expandafter(\ST@current@formula)}}% @@ -1083,45 +1160,45 @@ \ST@subst\ST@tobereplaced|{}% \expandafter\ST@expsubst\csname formula@#1@#2\endcsname\ST@tobereplaced\ST@replaced \edef\ST@stackcall{(#1,#2)\ST@stackcall}% - \else% la référence n'est pas calculée, donc d'abord il faut - \edef\ST@stackcall{(\ST@distant@colnumber,\ST@distant@rownumber)(#1,#2)\ST@stackcall}% l'évaluer, et ensuite ré-evaluer la cellule courante - \edef\ST@dependance@tree{\ST@dependance@tree(\ST@distant@colnumber,\ST@distant@rownumber)}% mise à jour de l'arbre des dépendances + \else% la référence n'est pas calculée, donc d'abord il faut + \edef\ST@stackcall{(\ST@distant@colnumber,\ST@distant@rownumber)(#1,#2)\ST@stackcall}% l'évaluer, et ensuite ré-evaluer la cellule courante + \edef\ST@dependance@tree{\ST@dependance@tree(\ST@distant@colnumber,\ST@distant@rownumber)}% mise à jour de l'arbre des dépendances \fi \fi - \or% le code vaut 2, c'est une fonction à argument «plage de cellules» + \or% le code vaut 2, c'est une fonction à argument «plage de cellules» \let\ST@tobereplaced\ST@function@namefound\ST@expadd@tomacro\ST@tobereplaced{\expandafter(\ST@function@argfound)}% - \csname ST@func@\ST@function@namefound\endcsname\ST@function@argfound\ST@result@func% puis on essaie d'évaluer la fonction + \csname ST@func@\ST@function@namefound\endcsname\ST@function@argfound\ST@result@func% puis on essaie d'évaluer la fonction \unless\ifx\ST@result@func\@empty% si le calcul a abouti \ST@Iffirstis\ST@result@func-{\expandafter\def\expandafter\ST@result@func\expandafter{\expandafter(\ST@result@func)}}{}% \expandafter\ST@expsubst\csname formula@#1@#2\endcsname\ST@tobereplaced\ST@result@func% on replace dans la formule - \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule + \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule \fi \or% le code vaut 3, c'est un fonction dont l'argument est textuel \let\ST@function@argfound@edefed\ST@function@argfound \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éférence dans l'argument de la fonction ? - \ifx\ST@temp@formula\@empty% pas de référence dans l'argument de la fonction + {\ST@findref@informula\ST@function@argfound\ST@temp@formula}% y a t-il une référence dans l'argument de la fonction ? + \ifx\ST@temp@formula\@empty% pas de référence dans l'argument de la fonction \ST@cslet\ST@current@formula{formula@#1@#2}% alias pour la formule \let\ST@tobereplaced\ST@function@namefound - \ST@expadd@tomacro\ST@tobereplaced{\expandafter(\ST@function@argfound)}% ce qui va être remplacé : fonction(argument) - \csname ST@func@\ST@function@namefound\endcsname\ST@function@argfound@edefed\ST@result@func% puis on évalue la fonction + \ST@expadd@tomacro\ST@tobereplaced{\expandafter(\ST@function@argfound)}% ce qui va être remplacé : fonction(argument) + \csname ST@func@\ST@function@namefound\endcsname\ST@function@argfound@edefed\ST@result@func% puis on évalue la fonction \ST@expsubst\ST@current@formula\ST@tobereplaced\ST@result@func% on replace dans l'alias \ST@letname{formula@#1@#2}\ST@current@formula% on l'assigne dans la formule - \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule - \else% il y a une référence dans l'argument de la fontion - \ifnum\csname code@\ST@temp@formula\endcsname=\z@% si la référence est une cellule texte + \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule + \else% il y a une référence dans l'argument de la fontion + \ifnum\csname code@\ST@temp@formula\endcsname=\z@% si la référence est une cellule texte \ST@cslet\ST@current@formula{text@\ST@temp@formula}% alias pour la zone texte distante - \StrDel[1]\ST@current@formula\STnumericfieldmarker[\ST@current@formula]% on enlève le := si besoin + \StrDel[1]\ST@current@formula\STnumericfieldmarker[\ST@current@formula]% on enlève le := si besoin \ST@Ifinstr\ST@current@formula{\@empty\multicolumn}% on ne prend que le texte s'il y a un \multicolumn qui traine {\ST@thirdarg@after\ST@current@formula\multicolumn\ST@current@formula} {}% \let\ST@tobereplaced\ST@function@namefound \ST@expadd@tomacro\ST@tobereplaced{\expandafter(\ST@function@argfound)}% \ST@subst\ST@tobereplaced|{}% - \csname ST@func@\ST@function@namefound\endcsname\ST@current@formula\ST@result@func% puis on évalue la fonction + \csname ST@func@\ST@function@namefound\endcsname\ST@current@formula\ST@result@func% puis on évalue la fonction \expandafter\ST@expsubst\csname formula@#1@#2\endcsname\ST@tobereplaced\ST@result@func - \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule + \edef\ST@stackcall{(#1,#2)\ST@stackcall}% puis, on évalue à nouveau cette cellule \else \PackageError\STname{Macro function \ST@function@namefound\space requires a reference to a text cell!}\STseedoc@i \fi @@ -1133,7 +1210,7 @@ } % On regarde s'il y a des appels de calcul de cellules en attente -% Si oui, on enlève le 1er appel de la pile lifo et on l'exécute +% Si oui, on enlève le 1er appel de la pile lifo et on l'exécute \def\ST@next@onstack{% \unless\ifx\ST@stackcall\@empty \ST@split\ST@stackcall)\ST@temp@a\ST@stackcall @@ -1144,7 +1221,7 @@ \fi } -\def\ST@sanitize@stack{% enlève de \ST@stackcall toutes les occurrences de \ST@temp@a +\def\ST@sanitize@stack{% enlève de \ST@stackcall toutes les occurrences de \ST@temp@a \ST@Ifinstr\ST@stackcall\ST@temp@a {\expandafter\ST@subst\expandafter\ST@stackcall\expandafter{\ST@temp@a}{}% \ST@sanitize@stack @@ -1156,14 +1233,14 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Macro-fonctions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\def\ST@for#1#2{% \ST@for{#1}{code} -> exécute le code pour toutes les cellules des plages passées en argument #1 +\def\ST@for#1#2{% \ST@for{#1}{code} -> exécute le code pour toutes les cellules des plages passées en argument #1 \def\ST@forcode{#2}% \expandafter\def\expandafter\ST@for@rangelist\expandafter{#1;}% \ST@for@i } -\def\ST@for@loopcode{% #2 est le code à exécuter dans la boucle for - \ST@forcode% on exécute le code +\def\ST@for@loopcode{% #2 est le code à exécuter dans la boucle for + \ST@forcode% on exécute le code \let\ST@nextfor\ST@for@loopcode \advance\ST@colcount@i\@ne \ifnum\ST@colcount@i>\ST@for@col@end @@ -1205,9 +1282,9 @@ \ST@nextfor } -% Cette macro cherche dans la sc #1 la première fonction qu'elle trouve ne contenant pas d'autre fonction dans son argument -% En sortie, \ST@function@namefound contient le nom de la fonction trouvée et \ST@function@argfound son argument. -% Si aucune fonction mot-clé n'est trouvé, ces 2 dernières séquences de contrôles sont vides. +% Cette macro cherche dans la sc #1 la première fonction qu'elle trouve ne contenant pas d'autre fonction dans son argument +% En sortie, \ST@function@namefound contient le nom de la fonction trouvée et \ST@function@argfound son argument. +% Si aucune fonction mot-clé n'est trouvé, ces 2 dernières séquences de contrôles sont vides. \def\ST@find@firST@func#1{% \let\ST@function@namefound\@empty\let\ST@function@argfound\@empty \let\ST@function@namefound@\@empty\let\ST@function@argfound@\@empty @@ -1216,17 +1293,17 @@ } \def\ST@find@firST@func@i{% - \edef\ST@tempfunctions@list{\ST@functions@list,}% réinitialise la liste - \let\ST@tempfunc@\ST@tempfunc% sauveagrde pour restauration ultérieure - \let\ST@function@namefound\@empty% initialise avant appel à la macro - \ST@Ifinstr\ST@tempfunc(% s'il y a une parenthèse + \edef\ST@tempfunctions@list{\ST@functions@list,}% réinitialise la liste + \let\ST@tempfunc@\ST@tempfunc% sauveagrde pour restauration ultérieure + \let\ST@function@namefound\@empty% initialise avant appel à la macro + \ST@Ifinstr\ST@tempfunc(% s'il y a une parenthèse {\ST@find@firST@func@ii% cherche la 1ere fonction dans l'argument \ifx\ST@function@namefound\@empty% elle n'existe pas ? - \let\ST@function@namefound\ST@function@namefound@\let\ST@function@argfound\ST@function@argfound@% on restaure les valeurs précédentes + \let\ST@function@namefound\ST@function@namefound@\let\ST@function@argfound\ST@function@argfound@% on restaure les valeurs précédentes \else% si il y a une fonction dans l'argument - \ST@right\ST@tempfunc@\ST@function@namefound\ST@tempfunc% prend ce qui est après le nom de la fonction - \ST@seekfunc@arg\ST@tempfunc\ST@function@argfound% isole l'argument entre parenthèses - \let\ST@function@namefound@\ST@function@namefound\let\ST@function@argfound@\ST@function@argfound% met à jour les valeurs précédentes + \ST@right\ST@tempfunc@\ST@function@namefound\ST@tempfunc% prend ce qui est après le nom de la fonction + \ST@seekfunc@arg\ST@tempfunc\ST@function@argfound% isole l'argument entre parenthèses + \let\ST@function@namefound@\ST@function@namefound\let\ST@function@argfound@\ST@function@argfound% met à jour les valeurs précédentes \let\ST@tempfunc\ST@function@argfound% recommence avec l'argument \expandafter\ST@find@firST@func@i \fi}% @@ -1235,11 +1312,11 @@ \def\ST@find@firST@func@ii{% \unless\ifx\ST@tempfunc\@empty% tant que le contenu n'est pas vide - \unless\ifx\ST@tempfunctions@list\@empty% et tant que tous les noms de fonctions n'ont pas été explorés + \unless\ifx\ST@tempfunctions@list\@empty% et tant que tous les noms de fonctions n'ont pas été explorés \ST@split\ST@tempfunctions@list,\ST@current@funcname\ST@tempfunctions@list \ST@Ifinstr\ST@tempfunc{\ST@current@funcname(}% si l'argument contient le nom de fonction courant {\let\ST@function@namefound\ST@current@funcname - \ST@left\ST@tempfunc{\ST@current@funcname(}\ST@tempfunc% on réduit l'argument à ce qui est avant ce nom + \ST@left\ST@tempfunc{\ST@current@funcname(}\ST@tempfunc% on réduit l'argument à ce qui est avant ce nom }% {}% \expandafter\expandafter\expandafter\ST@find@firST@func@ii @@ -1247,25 +1324,25 @@ \fi } -% la sc #1 commence normalement (sinon, ça va gueuler) par une parenthèse -% La macro trouve l'argument se trouvant entre les parenthèses les plus extérieures -% et l'assigne à la sc #2 +% la sc #1 commence normalement (sinon, ça va gueuler) par une parenthèse +% La macro trouve l'argument se trouvant entre les parenthèses les plus extérieures +% et l'assigne à la sc #2 \def\ST@seekfunc@arg#1#2{% \begingroup - \everyeof{\ST@nil}% met un \@nil à la fin du fichier virtuel + \everyeof{\ST@nil}% met un \@nil à la fin du fichier virtuel \endlinechar\m@ne \catcode\z@12 \catcode`(=1 \catcode`)=2 \afterassignment\ST@gobble@remain - \expandafter\def\expandafter\ST@temp@a\scantokens\expandafter{#1}% Attentionn !!! Il peut rester des ) non équilibrées + \expandafter\def\expandafter\ST@temp@a\scantokens\expandafter{#1}% Attentionn !!! Il peut rester des ) non équilibrées \catcode`(=12 \catcode`)=12 \def\ST@assign@result##1\ST@nil{\endgroup\def#2{##1}}% \expandafter\ST@assign@result\scantokens\expandafter{\ST@temp@a}% on fait l'assignation } -\def\ST@func@sum#1#2{% #1 est la sc contenant la plage de valeurs, #2 est la sc recevant le résultat - \def#2{0}% résultat nul pour l'instant - \let\ST@temp@stack\@empty% pile d'appel temporaire vide aussi au début +\def\ST@func@sum#1#2{% #1 est la sc contenant la plage de valeurs, #2 est la sc recevant le résultat + \def#2{0}% résultat nul pour l'instant + \let\ST@temp@stack\@empty% pile d'appel temporaire vide aussi au début \ST@for{#1}% on parcourt la <plage de cellules> {\ifnum\numexpr10000*(\ST@colcount@i-\ST@current@colnumber)+\ST@rowcount@i-\ST@current@rownumber=\z@ \ST@invalid@range% si la cellule courante est dans la plage, erreur @@ -1274,21 +1351,21 @@ \or% code=1 \edef\ST@temp@stack{\ST@temp@stack(\number\ST@colcount@i,\number\ST@rowcount@i)}% \or% code=2 - \ifx\ST@temp@stack\@empty% on ne prend la peine d'additionner que si toutes les cellules sont calculées + \ifx\ST@temp@stack\@empty% on ne prend la peine d'additionner que si toutes les cellules sont calculées \expandafter\STadd\expandafter#2\expandafter#2\csname formula@\number\ST@colcount@i @\number\ST@rowcount@i\endcsname - \edef\ST@dependance@tree{\ST@dependance@tree(\number\ST@colcount@i,\number\ST@rowcount@i)}% mise à jour de l'arbre des dépendances + \edef\ST@dependance@tree{\ST@dependance@tree(\number\ST@colcount@i,\number\ST@rowcount@i)}% mise à jour de l'arbre des dépendances \fi \fi }% - \ifx\ST@temp@stack\@empty% toutes les cellules dans la plage étaient calculées ? - \STclip#2#2% on ôte les 0 inutiles si le calcul a été mené au bout + \ifx\ST@temp@stack\@empty% toutes les cellules dans la plage étaient calculées ? + \STclip#2#2% on ôte les 0 inutiles si le calcul a été mené au bout \else \let#2\@empty - \edef\ST@stackcall{\ST@temp@stack(\ST@current@colnumber,\ST@current@rownumber)\ST@stackcall}% on met à jour la pile d'appel + \edef\ST@stackcall{\ST@temp@stack(\ST@current@colnumber,\ST@current@rownumber)\ST@stackcall}% on met à jour la pile d'appel \fi } -\def\ST@func@sumprod#1#2{% #1 est la sc contenant la plage de valeurs, #2 est la sc recevant le résultat +\def\ST@func@sumprod#1#2{% #1 est la sc contenant la plage de valeurs, #2 est la sc recevant le résultat \ST@left{#1;};\ST@firstmat \ST@right#1;\ST@othermat \ST@left\ST@firstmat{\@empty:}\ST@temp@a @@ -1300,7 +1377,7 @@ \edef\ST@matcol{\number\numexpr\ST@distant@colnumber-\ST@mat@firstcol}% \edef\ST@matrow{\number\numexpr\ST@distant@rownumber-\ST@mat@firstrow}% \ST@count\@ne - \loop% regarde si toutes les matrices ont la même dimension que la 1ere et pour chacune, calcule les vecteurs de décalage par rapport à la première + \loop% regarde si toutes les matrices ont la même dimension que la 1ere et pour chacune, calcule les vecteurs de décalage par rapport à la première \unless\ifx\ST@othermat\@empty \ST@left{\ST@othermat;};\ST@currentmat \ST@right{\ST@othermat;};\ST@othermat @@ -1318,15 +1395,15 @@ \unless\ifnum\ST@matrow=\ST@currentmatrow\ST@unmatch@matrixdim\fi% la dimension verticale ne correspond pas \advance\ST@count\@ne \repeat - \let\ST@temp@stack\@empty% pile d'appel temporaire vide au début - \edef\ST@numbermat{\number\ST@count}% c'est le nombre de matrices à multiplier - \def#2{0}% résultat nul pour l'instant + \let\ST@temp@stack\@empty% pile d'appel temporaire vide au début + \edef\ST@numbermat{\number\ST@count}% c'est le nombre de matrices à multiplier + \def#2{0}% résultat nul pour l'instant \ST@for{\ST@firstmat}% pour chaque cellule de la 1ere matrice - {\def\ST@inter@result{0}% résultat partiel nul pour l'instant + {\def\ST@inter@result{0}% résultat partiel nul pour l'instant \ifcase\csname code@\number\ST@colcount@i @\number\ST@rowcount@i\endcsname \or% code =1 \edef\ST@temp@stack{\ST@temp@stack(\number\ST@colcount@i,\number\ST@rowcount@i)}% - \edef\ST@dependance@tree{\ST@dependance@tree(\number\ST@colcount@i,\number\ST@rowcount@i)}% mise à jour de l'arbre des dépendances + \edef\ST@dependance@tree{\ST@dependance@tree(\number\ST@colcount@i,\number\ST@rowcount@i)}% mise à jour de l'arbre des dépendances \or% code=2 \ST@cslet\ST@inter@result{formula@\number\ST@colcount@i @\number\ST@rowcount@i}% \fi @@ -1334,95 +1411,96 @@ \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ésultat partiel à 0 + \def\ST@inter@result{0}% code =0 -> on met le résultat partiel à 0 \or% code =1 \ST@subst\ST@tempcoord @,% \edef\ST@temp@stack{\ST@temp@stack(\ST@tempcoord)}% - \edef\ST@dependance@tree{\ST@dependance@tree(\ST@tempcoord)}% mise à jour de l'arbre des dépendances + \edef\ST@dependance@tree{\ST@dependance@tree(\ST@tempcoord)}% mise à jour de l'arbre des dépendances \or% code=2 \expandafter\STmul\expandafter\ST@inter@result\expandafter\ST@inter@result\csname formula@\ST@tempcoord\endcsname \else - \def\ST@inter@result{0}% code = autre -> on met le résultat partiel à 0 + \def\ST@inter@result{0}% code = autre -> on met le résultat partiel à 0 \fi \advance\ST@count\@ne \ifnum\ST@count<\ST@numbermat \repeat \STadd#2#2\ST@inter@result }% - \ifx\ST@temp@stack\@empty% toutes les cellules dans la plage étaient calculées ? - \STclip#2#2% on ôte les 0 inutiles si le calcul a été mené au bout + \ifx\ST@temp@stack\@empty% toutes les cellules dans la plage étaient calculées ? + \STclip#2#2% on ôte les 0 inutiles si le calcul a été mené au bout \else \let#2\@empty - \edef\ST@stackcall{\ST@temp@stack(\ST@current@colnumber,\ST@current@rownumber)\ST@stackcall}% on met à jour la pile d'appel + \edef\ST@stackcall{\ST@temp@stack(\ST@current@colnumber,\ST@current@rownumber)\ST@stackcall}% on met à jour la pile d'appel \fi } \def\ST@func@id#1#2{\expandafter\def\expandafter#2\expandafter{#1}} \newif\ifST@gcd -\def\ST@arithmetic#1#2{% #1 est une liste de nombres séparés par des virgules, #2 la sc qui reçoit leur pgcd ou ppcm selon \ifST@gcd +\def\ST@arithmetic#1#2{% #1 est une liste de nombres séparés par des virgules, #2 la sc qui reçoit leur pgcd ou ppcm selon \ifST@gcd \ST@split{#1},#2\ST@argB - \ST@Ifinstr\ST@argB,{\ST@split\ST@argB,\ST@argB\ST@remain\let\ST@next\ST@arithmetic}{\let\ST@remain\@empty\let\ST@next\@gobbletwo}% + \ST@Ifinstr\ST@argB, + {\ST@split\ST@argB,\ST@argB\ST@remain\let\ST@next\ST@arithmetic} + {\let\ST@remain\@empty\let\ST@next\@gobbletwo}% \let\ST@argA#2% - \STeval\ST@argA\ST@argA\STeval\ST@argB\ST@argB% évalue les 2 nombres au cas où il y ait des opérations + \STeval\ST@argA\ST@argA\STeval\ST@argB\ST@argB% évalue les 2 nombres au cas où il y ait des opérations \STeval#2{trunc(abs(max(\ST@argB,\ST@argA)),0)}% \STeval\ST@argB{trunc(abs(min(\ST@argB,\ST@argA)),0)}% - \STifzero\ST@argB\else% si 0, on ignore puisque tous les nombres divisent 0 ou en sont leur multiple - \ifST@gcd\else\STmul\ST@argC#2\ST@argB\fi - \loop - \let\ST@argA\ST@argB - \STeval\ST@argB{trunc(#2-trunc(#2/\ST@argB,0)*\ST@argB,0)}% reste de la division #2/\ST@argB - \let#2\ST@argA - \STifzero\ST@argB\else - \repeat + \STifzero\ST@argB + {}% si 0, on ignore puisque tous les nombres divisent 0 ou en sont leur multiple + {\ifST@gcd\else\STmul\ST@argC#2\ST@argB\fi + \ST@arithmetic@i#2% \ifST@gcd\else\STeval#2{trunc(\ST@argC/#2,0)}\fi + }% + \ifST@gcd + \STifeq#21{\let\ST@next\@gobbletwo}{}% pour le pgcd, inutile de continuer si le pgcd est 1 \fi - \csname @\ifST@gcd firstofone\else gobble\fi\endcsname{\STifeq#21\let\ST@next\@gobbletwo\fi}% pour le pgcd, inutile de continuer si le pgcd est 1 \expandafter\expandafter\expandafter\ST@next\expandafter\expandafter\expandafter{\expandafter#2\expandafter,\ST@remain}#2% } - -\def\ST@func@gcd#1#2{% #1 est une liste de nombres séparés par des virgules, #2 la sc qui reçoit leur pgcd - \ST@gcdtrue\ST@arithmetic{#1}#2% +\def\ST@arithmetic@i#1{% + \let\ST@argA\ST@argB + \STeval\ST@argB{trunc(#1-trunc(#1/\ST@argB,0)*\ST@argB,0)}% reste de la division #2/\ST@argB + \let#1\ST@argA + \STifzero\ST@argB{}{\ST@arithmetic@i#1}% } -\def\ST@func@lcm#1#2{% #1 est une liste de nombres séparés par des virgules, #2 la sc qui reçoit leur ppcm - \ST@gcdfalse\ST@arithmetic{#1}#2% -} +\def\ST@func@gcd{\ST@gcdtrue\ST@arithmetic} +\def\ST@func@lcm{\ST@gcdfalse\ST@arithmetic} % la fonction randint -\def\ST@func@randint#1#2{% #1=sc contenant l'argument #2: sc recevant le résultat +\def\ST@func@randint#1#2{% #1=sc contenant l'argument #2: sc recevant le résultat \ST@Ifinstr#1,% s'il y a 2 nombres -> intervalle [nb1;nb2] {\ST@split#1,\ST@limita\ST@limitb - \STifeq\ST@limita\ST@limitb\PackageError\STname{Macro function randint require two different numbers}\STseedoc@i\fi + \STifeq\ST@limita\ST@limitb{\PackageError\STname{Macro function randint require two different numbers}\STseedoc@i}% \STifgt\ST@limita\ST@limitb - \let\ST@temp@a\ST@limitb\let\ST@limitb\ST@limita\let\ST@limita\ST@temp@a - \fi - \STifint\ST@limita\else\ST@intarg@required\fi - \STifint\ST@limitb\else\ST@intarg@required\fi + {\let\ST@temp@a\ST@limitb\let\ST@limitb\ST@limita\let\ST@limita\ST@temp@a} + {}% + \STifint\ST@limita{}\ST@intarg@required + \STifint\ST@limitb{}\ST@intarg@required \STrandom#2% \STeval#2{trunc(trunc(#2*(\ST@limitb-\ST@limita+1),0)+\ST@limita,0)}% }% - {\STifint#1\else\ST@intarg@required\fi + {\STifint#1{}\ST@intarg@required \STrandom#2% s'il n'y a qu'un nombre -> intervalle [0;nb2] \STeval#2{trunc(#2*(#1+1),0)}% }% } -\def\ST@func@rand#1#2{\STrandom#2}% #1=sc contenant l'argument (ignoré) #2: sc recevant le résultat +\def\ST@func@rand#1#2{\STrandom#2}% #1=sc contenant l'argument (ignoré) #2: sc recevant le résultat \def\ST@genzeros#1{\if#1m0\expandafter\ST@genzeros\fi} -\def\ST@powerten#1#2{% génère 10^abs(#1) dans la sc #2 +\def\ST@powerten#1#2{% génère 10^abs(#1) dans la sc #2 \edef#2{1\expandafter\ST@genzeros\romannumeral\number\ifnum#1<\z@-\fi#1000\relax}% } -\def\ST@func@scitodec#1#2{% #1=sc contenant l'argument #2: sc recevant le résultat +\def\ST@func@scitodec#1#2{% #1=sc contenant l'argument #2: sc recevant le résultat \expandafter\lowercase\expandafter{\expandafter\def\expandafter#1\expandafter{#1}}% \ST@Ifinstr#1{ee}% on regarde s'il y a "ee" {\ST@split#1{ee}\ST@mantissa\ST@exposant \ST@powerten\ST@exposant\ST@tenpow \csname ST\ifnum\ST@exposant<\z@ div\else mul\fi\endcsname#2\ST@mantissa\ST@tenpow}% - {\IfDecimal#1% + {\ST@IfDecimal#1% {\let#2#1}% {\PackageError\STname{Illegal number in scitodec argument}\STseedoc@i}}% } @@ -1435,10 +1513,8 @@ \expandafter\ST@liST@offour#1\@nil \STeval\ST@argA\ST@argA\STeval\ST@argB\ST@argB \csname STif#3\endcsname\ST@argA\ST@argB - \let#2\ST@argC - \else - \let#2\ST@argD - \fi + {\let#2\ST@argC} + {\let#2\ST@argD}% } \def\ST@func@ifeq#1#2{\ST@def@funcif#1#2{eq}} @@ -1446,7 +1522,7 @@ \def\ST@func@iflt#1#2{\ST@def@funcif#1#2{lt}} % Transforme une date en nombre -\def\STdatetonum#1#2#3#4{% #1=sc recevant le résultat #2=jj #3=mm #4=aa +\def\STdatetonum#1#2#3#4{% #1=sc recevant le résultat #2=jj #3=mm #4=aa \STeval#1{#3+9-12*trunc((#3+9)/12,0)}% \STeval\ST@@@year{#4-trunc(#1/10,0)}% \STeval#1{365*\ST@@@year+trunc(\ST@@@year/4,0)-trunc(\ST@@@year/100,0)+trunc(\ST@@@year/400,0)+trunc((#1*306+5)/10,0)+#2-1}% @@ -1454,13 +1530,14 @@ } % Transforme un nombre en une date -\def\ST@numtodate#1#2#3#4{% #1=nombre représentant la date #2=jour #3=mois #4=année +\def\ST@numtodate#1#2#3#4{% #1=nombre représentant la date #2=jour #3=mois #4=année \STeval#4{trunc((10000*#1+14780)/3652425,0)}% \STeval#2{#1-(365*#4+trunc(#4/4,0)-trunc(#4/100,0)+trunc(#4/400,0))}% \STiflt{#2}0% - \STadd#4#4{-1}% - \STeval#2{#1-(365*#4+trunc(#4/4,0)-trunc(#4/100,0)+trunc(#4/400,0))}% - \fi + {\STadd#4#4{-1}% + \STeval#2{#1-(365*#4+trunc(#4/4,0)-trunc(#4/100,0)+trunc(#4/400,0))} + } + {}% \STeval#3{trunc((100*#2+52)/3060,0)}% \STeval#4{#4+trunc((#3+2)/12,0)}\STclip#4#4% \STeval#2{#2-trunc((#3*306+5)/10,0)+1}\STclip#2#2% @@ -1471,89 +1548,89 @@ \def\ST@parse@dateeng#1/#2/#3\@nil{\def\ST@@@day{#3}\def\ST@@@month{#2}\def\ST@@@year{#1}} -% transforme une date française courte du type jj/mm/aaaa en nombre -\def\ST@func@frshortdatetonum#1#2{% #1=sc étant l'argument jj/mm/aaaa #2=sc recevant le résultat +% transforme une date française courte du type jj/mm/aaaa en nombre +\def\ST@func@frshortdatetonum#1#2{% #1=sc étant l'argument jj/mm/aaaa #2=sc recevant le résultat \expandafter\ST@parse@datefr#1\@nil \STdatetonum#2\ST@@@day\ST@@@month\ST@@@year } -% Transforme un nombre en une date française de type jj/mm/aaaa -\def\ST@func@numtofrshortdate#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat +% Transforme un nombre en une date française de type jj/mm/aaaa +\def\ST@func@numtofrshortdate#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat \ST@numtodate#1\ST@@@day\ST@@@month\ST@@@year \edef#2{\ST@@@day/\ST@@@month/\ST@@@year}% } -% Transforme un nombre en une date longue française du type «14 juillet 1789» -\def\ST@func@numtofrlongdate#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat +% Transforme un nombre en une date longue française du type «14 juillet 1789» +\def\ST@func@numtofrlongdate#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat \ST@numtodate#1\ST@@@day\ST@@@month\ST@@@year \edef#2{\ST@@@day\space\ifcase\ST@@@month\or janvier\or f\'evrier\or mars\or avril\or mai\or juin\or juillet\or ao\^ut\or septembre\or octobre \or novembre\or d\'ecembre\fi\space\ST@@@year}% } -% Extrait d'un nombre représentant une date le mois en toutes lettres en français -\def\ST@func@numtofrmonth#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat +% Extrait d'un nombre représentant une date le mois en toutes lettres en français +\def\ST@func@numtofrmonth#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat \ST@numtodate#1\ST@@@day\ST@@@month\ST@@@year \edef#2{\ifcase\ST@@@month\or janvier\or f\'evrier\or mars\or avril\or mai\or juin\or juillet\or ao\^ut\or septembre\or octobre \or novembre\or d\'ecembre\fi}% } -% Extrait d'un nombre repésentant une date le nom du jour en français -\def\ST@func@numtofrday#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat +% Extrait d'un nombre repésentant une date le nom du jour en français +\def\ST@func@numtofrday#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat \STeval\ST@@@day{#1-7*trunc(#1/7,0)}\STclip\ST@@@day\ST@@@day \edef#2{\ifcase\ST@@@day mercredi\or jeudi\or vendredi\or samedi\or dimanche\or lundi\or mardi\fi} } % transforme une date anglaise courte du type aaaa/mm/jj en nombre -\def\ST@func@engshortdatetonum#1#2{% #1=sc étant l'argument aaaa/mm/jj #2=sc recevant le résultat +\def\ST@func@engshortdatetonum#1#2{% #1=sc étant l'argument aaaa/mm/jj #2=sc recevant le résultat \expandafter\ST@parse@dateeng#1\@nil \STdatetonum#2\ST@@@day\ST@@@month\ST@@@year } % Transforme un nombre en une date anglaise de type aaaa/mm/jj -\def\ST@func@numtoengshortdate#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat +\def\ST@func@numtoengshortdate#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat \ST@numtodate#1\ST@@@day\ST@@@month\ST@@@year \edef#2{\ST@@@year/\ST@@@month/\ST@@@day} } -% Transforme un nombre en une date longue anglaise du type «July 14, 1789» -\def\ST@func@numtoenglongdate#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat +% Transforme un nombre en une date longue anglaise du type «July 14, 1789» +\def\ST@func@numtoenglongdate#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat \ST@numtodate#1\ST@@@day\ST@@@month\ST@@@year \edef#2{\ifcase\ST@@@month\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi\space\ST@@@day,\space\ST@@@year}% } -% Extrait d'un nombre représentant une date le mois en toutes lettres en anglais -\def\ST@func@numtoengmonth#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat +% Extrait d'un nombre représentant une date le mois en toutes lettres en anglais +\def\ST@func@numtoengmonth#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat \ST@numtodate#1\ST@@@day\ST@@@month\ST@@@year \edef#2{\ifcase\ST@@@month\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi}% } -% Extrait d'un nombre repésentant une date le nom du jour en anglais -\def\ST@func@numtoengday#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat +% Extrait d'un nombre repésentant une date le nom du jour en anglais +\def\ST@func@numtoengday#1#2{% % #1=nombre représentant la date #2=sc recevant le résultat \STeval\ST@@@day{#1-7*trunc(#1/7,0)}\STclip\ST@@@day\ST@@@day \edef#2{\ifcase\ST@@@day wednesday\or thursday\or friday\or saturday\or sunday\or monday\or tuesday\fi} } -% Teste si la date contenue dans les 3 sc #1 (jour) #2(mois) #3(année) est valide. Sinon, envoie un message d'erreur +% Teste si la date contenue dans les 3 sc #1 (jour) #2(mois) #3(année) est valide. Sinon, envoie un message d'erreur \def\ST@teST@date@validity#1#2#3{% - \IfInteger#1{}\ST@invalid@date - \IfInteger#2{}\ST@invalid@date - \IfInteger#3{}\ST@invalid@date + \ST@IfInteger#1{}\ST@invalid@date + \ST@IfInteger#2{}\ST@invalid@date + \ST@IfInteger#3{}\ST@invalid@date \ifnum#2<\@ne\ST@invalid@date\fi \ifnum#2>12 \ST@invalid@date\fi \ifnum#1<\@ne\ST@invalid@date\fi \ifnum#1>\ifcase#2\or31\or29\or31\or30\or31\or30\or31\or31\or30\or31\or30\or31\fi\ST@invalid@date\fi - \ifnum#3<\@ne\ST@invalid@date\fi% on va s'arrêter à JC quand même :-) + \ifnum#3<\@ne\ST@invalid@date\fi% on va s'arrêter à JC quand même :-) } -% Transforme une date anglaise longue du type «July 14, 1789» en un nombre -\def\ST@func@englongdatetonum#1#2{% #1=sc contenant la date longue #2=sc recevant le résultat +% Transforme une date anglaise longue du type «July 14, 1789» en un nombre +\def\ST@func@englongdatetonum#1#2{% #1=sc contenant la date longue #2=sc recevant le résultat \ST@analyse@text@engdate#1\ST@@@day\ST@@@month\ST@@@year \STdatetonum#2\ST@@@day\ST@@@month\ST@@@year } -\def\ST@analyse@text@engdate#1#2#3#4{% #1=texte représentant la date #2=jour #3=n° mois #4=année +\def\ST@analyse@text@engdate#1#2#3#4{% #1=texte représentant la date #2=jour #3=n° mois #4=année \ST@remove@firST@spaces#1% \def\ST@today{\today}% \ifx#1\ST@today @@ -1578,33 +1655,33 @@ }[\def#3{-1}]% \ST@right#1\space#2% \ST@Ifinstr#2,{\ST@split#2,#2#4}{\ST@split#2{ }#2#4}% - \IfInteger#2{}{\edef#2{\number\integerpart}}% + \ST@IfInteger#2{}{\edef#2{\number\ST@integerpart}}% \ST@removespaces#4% \ST@teST@date@validity#2#3#4% \fi } -% Transforme une date anglaise longue du type «14 juillet 1789» en un nombre -\def\ST@func@frlongdatetonum#1#2{% #1=sc contenant la date longue #2=sc recevant le résultat +% Transforme une date anglaise longue du type «14 juillet 1789» en un nombre +\def\ST@func@frlongdatetonum#1#2{% #1=sc contenant la date longue #2=sc recevant le résultat \ST@analyse@text@frdate#1\ST@@@day\ST@@@month\ST@@@year \STdatetonum#2\ST@@@day\ST@@@month\ST@@@year } \def\ST@utfencoding{utf8} -\def\ST@analyse@text@frdate#1#2#3#4{% #1=texte représentant la date #2=jour #3=n° mois #4=année +\def\ST@analyse@text@frdate#1#2#3#4{% #1=texte représentant la date #2=jour #3=n° mois #4=année \ST@remove@firST@spaces#1% \def\ST@today{\today}% \ifx#1\ST@today \edef#2{\number\day}\edef#3{\number\month}\edef#4{\number\year}% \else \ST@split#1{ }#2#3% - \IfInteger#2{}{\edef#2{\number\integerpart}}% + \ST@IfInteger#2{}{\edef#2{\number\ST@integerpart}}% \ST@split#3{ }#3#4% \ST@removespaces#3% - \def\ST@e{^^e9}\def\ST@u{^^fb}% é et û en latin1 + \def\ST@e{^^e9}\def\ST@u{^^fb}% é et û en latin1 \ifdefined\inputencodingname\ifx\ST@utfencoding\inputencodingname - \def\ST@e{^^c3^^a9}\def\ST@u{^^c3^^bb}% é et û en utf8 + \def\ST@e{^^c3^^a9}\def\ST@u{^^c3^^bb}% é et û en utf8 \fi\fi \expandafter\ST@subst\expandafter#3\expandafter{\ST@e}e\ST@subst#3\'{}% \expandafter\ST@subst\expandafter#3\expandafter{\ST@u}u\ST@subst#3\^{}% @@ -1657,6 +1734,10 @@ \def#2{0}% use 0 if tag undefined \fi } + +\def\ST@func@exp#1#2{% + +} % \def\ST@func@timetosec#1#2{% % \ST@left{#1}:\ST@nb@hours % \ST@right{#1}:\ST@nb@min @@ -1680,9 +1761,9 @@ % } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%% Construction du tableau à afficher %%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%% Construction du tableau à afficher %%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\def\ST@search@lastshowcol{% cherche le numéro de la dernière colonne non masquée +\def\ST@search@lastshowcol{% cherche le numéro de la dernière colonne non masquée \ST@colcount\ST@total@colnumber% on commence par la fin \ST@search@lastshowcol@i } @@ -1693,20 +1774,20 @@ {\edef\ST@lastshowcol{\number\ST@colcount}}% } -% cherche "<<ref>>" dans la sc #1 et remplace toutes ces occurences par le champ numérique de "ref" +% cherche "<<ref>>" dans la sc #1 et remplace toutes ces occurences par le champ numérique de "ref" \def\ST@displaynumfields#1{% \StrBehind#1\ST@startdisplay[\ST@dipslaycell]% \StrBefore\ST@dipslaycell\ST@enddisplay[\ST@dipslaycell]% - \let\ST@next\@gobble% à priori, on ne reboucle pas + \let\ST@next\@gobble% à priori, on ne reboucle pas \unless\ifx\@empty\ST@dipslaycell% si ce qui a entre les marqueurs n'est pas vide \edef\ST@current@colnumber{\number\ST@colcount}\edef\ST@current@rownumber{\number\ST@rowcount}% - \ST@ifref\ST@dipslaycell% et si c'est une référence valide + \ST@ifref\ST@dipslaycell% et si c'est une référence valide {\let\ST@next\ST@startdisplay \ST@expadd@tomacro\ST@next\ST@dipslaycell \ST@expadd@tomacro\ST@next\ST@enddisplay \ST@cslet\ST@dipslaycell{formula@\ST@temp@formula}% alias pour la formule distante - \unless\ifx\ST@decsep\ST@decsepfp\ST@substdecsep\ST@dipslaycell\fi% subsitution du séparateur décimal s'il y a lieu - \StrSubstitute#1\ST@next\ST@dipslaycell[#1]% on substitue <<ref>> par le champ numérique de la formule distante + \unless\ifx\ST@decsep\ST@decsepfp\ST@substdecsep\ST@dipslaycell\fi% subsitution du séparateur décimal s'il y a lieu + \StrSubstitute#1\ST@next\ST@dipslaycell[#1]% on substitue <<ref>> par le champ numérique de la formule distante \let\ST@next\ST@displaynumfields } {}% @@ -1716,50 +1797,50 @@ \def\ST@build@tab{% \ST@rowcount\@ne\ST@colcount\@ne - \expandafter\ST@expadd@tomacro\expandafter\ST@tab\csname endrow@0\endcsname% la (ou les) éventuelle ligne supérieure du tableau + \expandafter\ST@expadd@tomacro\expandafter\ST@tab\csname endrow@0\endcsname% la (ou les) éventuelle ligne supérieure du tableau \ST@build@tab@i } -\def\ST@build@tab@i{% reconstitue le tableau à partir des valeurs calculées et des cellules +\def\ST@build@tab@i{% reconstitue le tableau à partir des valeurs calculées et des cellules \ifnum\ST@rowcount>\ST@total@rownumber \let\ST@nextcell\relax \else \let\ST@nextcell\ST@build@tab@i \ST@Ifinstr\ST@row@skiplist{\expandafter(\number\ST@rowcount)}% la ligne fait partie de la skiplist ? - {\advance\ST@rowcount\@ne}% on passe à la ligne suivante + {\advance\ST@rowcount\@ne}% on passe à la ligne suivante {% \ST@Ifinstr\ST@col@skiplist{\expandafter(\number\ST@colcount)}% la colonne fait partie de la skiplist ? \ST@hiddencoltrue {% \ST@hiddencolfalse \ST@ifvalid@csname{text@\number\ST@colcount @\number\ST@rowcount}% si la cellule existe - {\ST@cslet\ST@temp@b{text@\number\ST@colcount @\number\ST@rowcount}% on créé un alias pour le texte + {\ST@cslet\ST@temp@b{text@\number\ST@colcount @\number\ST@rowcount}% on créé un alias pour le texte \exploregroups - \ifnum\csname code@\number\ST@colcount @\number\ST@rowcount\endcsname=\tw@% si la cellule contient un champ numérique + \ifnum\csname code@\number\ST@colcount @\number\ST@rowcount\endcsname=\tw@% si la cellule contient un champ numérique \ST@cslet\ST@temp@a{formula@\number\ST@colcount @\number\ST@rowcount}% alias pour la valeur - \unless\ifx\ST@decsep\ST@decsepfp\ST@substdecsep\ST@temp@a\fi% et si le "." doit être remplacé par "," on substitue - \StrSubstitute[1]\ST@temp@b\STnumericfieldmarker{\expandafter\STprintnum\expandafter{\ST@temp@a}}[\ST@temp@a]% on remplace le flag de formule par la valeur calculée - \else% si la cellule ne contient pas de champ numérique - \StrDel[1]\ST@temp@b\STnumericfieldmarker[\ST@temp@a]% on enlève l'éventuel marqueur + \unless\ifx\ST@decsep\ST@decsepfp\ST@substdecsep\ST@temp@a\fi% et si le "." doit être remplacé par "," on substitue + \StrSubstitute[1]\ST@temp@b\STnumericfieldmarker{\expandafter\STprintnum\expandafter{\ST@temp@a}}[\ST@temp@a]% on remplace le flag de formule par la valeur calculée + \else% si la cellule ne contient pas de champ numérique + \StrDel[1]\ST@temp@b\STnumericfieldmarker[\ST@temp@a]% on enlève l'éventuel marqueur \fi - \ST@displaynumfields\ST@temp@a% affiche les champs numériques des cellules entre << et >> + \ST@displaynumfields\ST@temp@a% affiche les champs numériques des cellules entre << et >> \noexploregroups \ST@expadd@tomacro\ST@tab\ST@temp@a% on ajoute la cellule au tableau } {}% }% - \advance\ST@colcount\@ne% on passe à la colonne suivante ! - \ST@ifvalid@csname{code@\number\ST@colcount @\number\ST@rowcount}% y a t-il encore un code défini ensuite ? + \advance\ST@colcount\@ne% on passe à la colonne suivante ! + \ST@ifvalid@csname{code@\number\ST@colcount @\number\ST@rowcount}% y a t-il encore un code défini ensuite ? {\ifnum\csname code@\number\ST@colcount @\number\ST@rowcount\endcsname<\z@% on est dans une cellule contenant \multicol ? \expandafter\ST@firstarg@after\csname text@\number\numexpr\ST@colcount-1@\number\ST@rowcount\endcsname\multicolumn\STmulticol@number% combien de cellules ? - \advance\ST@colcount\STmulticol@number% on va voir après le multicol en sautant toutes les valeurs des colonnes intermédiaires + \advance\ST@colcount\STmulticol@number% on va voir après le multicol en sautant toutes les valeurs des colonnes intermédiaires \advance\ST@colcount\m@ne - \ST@ifvalid@csname{code@\number\ST@colcount @\number\ST@rowcount}% y a t-il un code défini après le multicol ? + \ST@ifvalid@csname{code@\number\ST@colcount @\number\ST@rowcount}% y a t-il un code défini après le multicol ? {\STadd@tomacro\ST@tab&}% on ajoute la tabulation {}% \else% pas de \multicolumn - \unless\ifST@hiddencol% si la cellule n'est pas masquée - \unless\ifnum\ST@colcount>\ST@lastshowcol% si ce n'est pas la dernière cellule affichée + \unless\ifST@hiddencol% si la cellule n'est pas masquée + \unless\ifnum\ST@colcount>\ST@lastshowcol% si ce n'est pas la dernière cellule affichée \STadd@tomacro\ST@tab&%on ajoute la tabulation \fi \fi @@ -1767,24 +1848,24 @@ {\ST@ifvalid@csname{endrow@\number\ST@rowcount}% {\expandafter\ST@expadd@tomacro\expandafter\ST@tab\csname endrow@\number\ST@rowcount\endcsname}% ajoute la fin de la ligne {}% - \ST@colcount\@ne% on remet la colonne à 1 - \advance\ST@rowcount\@ne% on passe à la ligne suivante + \ST@colcount\@ne% on remet la colonne à 1 + \advance\ST@rowcount\@ne% on passe à la ligne suivante }% }% \fi \ST@nextcell } -% format des lettres et nombres représentant les coordonnées (helvetica gras très petit) +% format des lettres et nombres représentant les coordonnées (helvetica gras très petit) \def\ST@debugformat@headers{\usefont{T1}{phv}{b}{n}} -% format utilisé pour les cellules +% format utilisé pour les cellules \def\ST@debug@format@cells{\usefont{T1}{lmtt}{m}{n}} \def\ST@colorcell{\ifST@colortblloaded\noexpand\cellcolor[gray]{.6}\fi} \def\STdebug#1{% - \ST@debugmodetrue% on se met en mode débogage + \ST@debugmodetrue% on se met en mode débogage \begingroup \def\ST@debuginfo{#1}% \ifmmode\scriptscriptstyle\else\scriptsize\fi @@ -1809,7 +1890,7 @@ \repeat \ST@colcount\@ne \ST@edefadd@tomacro\ST@debugtab{% - &% passe à la dernière colonne de la première ligne + &% passe à la dernière colonne de la première ligne \noexpand\multicolumn1l{% \ifx\ST@temp@a\ST@debuginfo \ST@ifvalid@csname{endrow@\number\ST@rowcount}% @@ -1821,25 +1902,25 @@ \ST@debug@tab@i } -\def\ST@debug@tab@i{% affiche le tableau de débobage +\def\ST@debug@tab@i{% affiche le tableau de débobage \ifnum\ST@rowcount>\ST@total@rownumber \ST@edefadd@tomacro\ST@debugtab{\noexpand\cline{2-\number\numexpr\ST@lastshowcol+1}\noexpand\end{tabular}}% - \ST@debugtab% affichage du tableau de débogage - \ifmmode\\[0.5ex]\else\par\smallskip\fi% retour à la ligne + \ST@debugtab% affichage du tableau de débogage + \ifmmode\\[0.5ex]\else\par\smallskip\fi% retour à la ligne \expandafter\endgroup \else \ifnum\ST@colcount=\@ne \ST@edefadd@tomacro\ST@debugtab{% \noexpand\multicolumn1{c|}{\ST@colorcell\noexpand\ST@debugformat@headers\number\ST@rowcount}&}% \fi - \ifcsname\ST@debuginfo @\number\ST@colcount @\number\ST@rowcount\endcsname% si l'info existe pour la cellule concernée + \ifcsname\ST@debuginfo @\number\ST@colcount @\number\ST@rowcount\endcsname% si l'info existe pour la cellule concernée \ifx\ST@temp@a\ST@debuginfo \expandafter\ST@subst\csname\ST@debuginfo @\number\ST@colcount @\number\ST@rowcount\endcsname|{}% \fi - \ST@edefadd@tomacro\ST@debugtab{\detokenize\expandafter\expandafter\expandafter{\csname\ST@debuginfo @\number\ST@colcount @\number\ST@rowcount\endcsname}}% on ajoute la cellule au tableau que l'on a detokenisée au préalable + \ST@edefadd@tomacro\ST@debugtab{\detokenize\expandafter\expandafter\expandafter{\csname\ST@debuginfo @\number\ST@colcount @\number\ST@rowcount\endcsname}}% on ajoute la cellule au tableau que l'on a detokenisée au préalable \fi - \advance\ST@colcount\@ne% on passe à la colonne suivante ! - \ifnum\ST@colcount>\ST@lastshowcol% si c'est la dernière cellule affichée + \advance\ST@colcount\@ne% on passe à la colonne suivante ! + \ifnum\ST@colcount>\ST@lastshowcol% si c'est la dernière cellule affichée \ST@edefadd@tomacro\ST@debugtab{% &\noexpand\multicolumn1l{% \ifx\ST@temp@a\ST@debuginfo @@ -1848,8 +1929,8 @@ {}% \fi}% \noexpand\\\noexpand\cline{2-\number\numexpr\ST@lastshowcol+1}}% - \ST@colcount\@ne% on remet la colonne à 1 - \advance\ST@rowcount\@ne% on passe à la ligne suivante + \ST@colcount\@ne% on remet la colonne à 1 + \advance\ST@rowcount\@ne% on passe à la ligne suivante \else% il reste encore des cellules dans la ligne \STadd@tomacro\ST@debugtab&% on ajoute la tabulation \fi @@ -1861,12 +1942,12 @@ %%%%%%%%%%%%%%%%%% Environnement spreadtab et macros publiques %%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% définit quelle sera le séquence de conytrôle qui finira les lignes +% définit quelle sera le séquence de conytrôle qui finira les lignes % dans les tableaux de spreadtab \def\STeol#1{\def\ST@eol{#1}} \STeol\\ -% renvoie la valeur numérique de la cellule de tag #1 +% renvoie la valeur numérique de la cellule de tag #1 \def\STtag#1{% \ifcsname ST@celltag@\detokenize\expandafter{#1}\endcsname\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi {\csname ST@celltag@\detokenize\expandafter{#1}\endcsname} @@ -1893,24 +1974,24 @@ \fi } -% définit le séparateur décimal +% définit le séparateur décimal \def\STsetdecimalsep#1{\def\ST@decsep{#1}} -\def\ST@decsepfp{.}% le séparateur décimal donné par fp -\STsetdecimalsep.% le point par défaut +\def\ST@decsepfp{.}% le séparateur décimal donné par fp +\STsetdecimalsep.% le point par défaut -\STmessage{true}% affiche les messages par défaut +\STmessage{true}% affiche les messages par défaut \newif\ifST@clipround \def\STautoround{\@ifstar{\ST@cliproundfalse\ST@autoround}{\ST@cliproundtrue\ST@autoround}} \def\ST@autoround#1{\def\STrounddigit{#1}} -\STautoround{}% pas d'arrondi par défaut +\STautoround{}% pas d'arrondi par défaut -\def\STsavecell#1#2{% met dans la sc #1 la valeur du champ numérique de la cellule spécifiée par sa référence ABSOLUE +\def\STsavecell#1#2{% met dans la sc #1 la valeur du champ numérique de la cellule spécifiée par sa référence ABSOLUE \def\ST@temp@ref{#2}% \ST@ifref\ST@temp@ref{}\ST@illegal@ref \ST@Ifinstr\ST@temp@ref[\ST@illegal@ref{}% - \ST@cslet#1{formula@\ST@temp@formula}% le nombre est assigné à #1 - \unless\ifx\ST@decsep\ST@decsepfp\ST@substdecsep#1\fi% et si le "." doit être remplacé par "," on substitue + \ST@cslet#1{formula@\ST@temp@formula}% le nombre est assigné à #1 + \unless\ifx\ST@decsep\ST@decsepfp\ST@substdecsep#1\fi% et si le "." doit être remplacé par "," on substitue \global\let#1#1% on rend l'assignation globale } @@ -1937,11 +2018,11 @@ \fi \let\ST@FPmessages\ifFPmessages \if@STfpactive\ifST@message\FPmessagesfalse\fi\fi% pas de message de calcul de FP - \saveexpandmode\expandarg% 1-développement des arguments (réglages de xstring) - \saveexploremode\noexploregroups% pas d'exploration des groupes (réglages de xstring) + \saveexpandmode\expandarg% 1-développement des arguments (réglages de xstring) + \saveexploremode\noexploregroups% pas d'exploration des groupes (réglages de xstring) \edef\ST@catocde@saved{\catcode`:=\the\catcode`:\relax\catcode`;=\the\catcode`;\relax}% - \@makeother\:\@makeother\;% changer les catcodes pour éviter les incompatibilités avec frenchb - \def\ST@tab@preamble{#2}% préambule du tableau + \@makeother\:\@makeother\;% changer les catcodes pour éviter les incompatibilités avec frenchb + \def\ST@tab@preamble{#2}% préambule du tableau \StrChar{\@empty#2}\@ne[\ST@tab@name]% \def\ST@optcode{#1}% \let\ST@copylist\@empty @@ -1962,24 +2043,24 @@ \let\ST@ref@found\@empty \ST@read@tab% analyse le tableau contenu dans \ST@tab \ST@emit@message{ok^^J}% - \ST@search@lastshowcol% cherche la dernière colonne affichée - \ST@debugmodefalse% à priori, on n'est pas en mode débogage + \ST@search@lastshowcol% cherche la dernière colonne affichée + \ST@debugmodefalse% à priori, on n'est pas en mode débogage \let\ST@savecell\STsavecell \let\STsavecell\@gobbletwo \let\STdisplaytab\relax - \ST@optcode% exécute l'argument optionnel en ne tenant compte que de \STdebug + \ST@optcode% exécute l'argument optionnel en ne tenant compte que de \STdebug \let\STdebug\@gobble \def\STdisplaytab{% \ST@debugmodefalse \ST@emit@message{\space\space\space\space\space Debug mode: display final tab^^J}% \let\STdisplaytab\relax }% - \ST@optcode% exécute l'argument optionnel en ne tenant compte que de \STdisplaytab s'il y figure + \ST@optcode% exécute l'argument optionnel en ne tenant compte que de \STdisplaytab s'il y figure \unless\ifST@debugmode% si on doit afficher le tableau, on fait le boulot \ST@emit@message{* computing formulas:^^J}% \STeval@tab \let\STsavecell\ST@savecell - \ST@optcode% exécute l'argument optionnel en ne tenant compte que de \STsavecell + \ST@optcode% exécute l'argument optionnel en ne tenant compte que de \STsavecell \expandafter\def\expandafter\ST@tab\expandafter{\expandafter\begin\ST@tab@preamble}% \ST@emit@message{* building tab:}% \ST@build@tab @@ -2030,164 +2111,172 @@ v0.1alpha avril 2009 v0.1beta1 2009/06/06 ------------------------------------------------------------------------------- v0.1beta2 2009/06/07 - 1 Une valeur négative dans une cellule provoque un bug. - Les valeurs négatives sont désormais mises entre parenthèses - 2 Espaces supprimés en début de formules. + 1 Une valeur négative dans une cellule provoque un bug. + Les valeurs négatives sont désormais mises entre parenthèses + 2 Espaces supprimés en début de formules. ------------------------------------------------------------------------------- v0.1beta3 2009/06/12 - 1 Espaces laissés dans les formules pour pouvoir utiliser la notation - postfixée de fp. - 2 Les références ne sont plus «@(B4)» mais indifféremment «b4» ou - «B4». - 3 Références relatives possibles par [x,y] ou x et y sont les - décalages de la colonne et de la ligne par rapport à la cellule - où est la formule. - 4 Bugs corrigés pour rendre le package compatible avec tabularx ou + 1 Espaces laissés dans les formules pour pouvoir utiliser la notation + postfixée de fp. + 2 Les références ne sont plus «@(B4)» mais indifféremment «b4» ou + «B4». + 3 Références relatives possibles par [x,y] ou x et y sont les + décalages de la colonne et de la ligne par rapport à la cellule + où est la formule. + 4 Bugs corrigés pour rendre le package compatible avec tabularx ou tabulary (entre autres). ------------------------------------------------------------------------------- v0.1beta4 2009/06/21 - 1 Les espaces sont supprimés au début de chaque cellule, cela - créait un bug lorsque la cellule commençait par un nombre négatif. - 2 Mise en place de la compatibilité avec la commande - \multicolumn{nbre}{type}{contenu} du package éponyme - 3 Possibilité de masquer des lignes ou des colonnes entières avec les + 1 Les espaces sont supprimés au début de chaque cellule, cela + créait un bug lorsque la cellule commençait par un nombre négatif. + 2 Mise en place de la compatibilité avec la commande + \multicolumn{nbre}{type}{contenu} du package éponyme + 3 Possibilité de masquer des lignes ou des colonnes entières avec les commandes \SThiderow et \SThidecol - Seule condition : aucune colonne masquée ne doit se trouver dans les - colonnes impliquées dans un \multicolum à moins de prendre de - grandes précautions et savoir les conséquences que cela occasionne. + Seule condition : aucune colonne masquée ne doit se trouver dans les + colonnes impliquées dans un \multicolum à moins de prendre de + grandes précautions et savoir les conséquences que cela occasionne. ------------------------------------------------------------------------------- v0.1beta5 2009/06/29 - 1 Amélioration des messages d'erreur et d'information + 1 Amélioration des messages d'erreur et d'information 2 Suppression de tests superflus - 3 Redéfinition de \STtextcell en «@» qui est plus simple - 4 Implémentation de \STsavecell - 5 écriture de la documentation provisoire en français + 3 Redéfinition de \STtextcell en «@» qui est plus simple + 4 Implémentation de \STsavecell + 5 écriture de la documentation provisoire en français ------------------------------------------------------------------------------- v0.1beta6 2009/08/23 - 1 Correction d'un bug : dans une cellule, on ne pouvait pas écrire - plusieurs fois la même référence. - 2 Correction d'un bug avec \multicolumn : cette commande était mal - gérée lorsqu'employée avec une cellule de texte. - 3 Implémentation de macro-fonctions avec différenciation selon le - type d'argument et le type de donnée renvoyée. - 4 Possibilité d'imbrication des macro-fonctions. - 5 Mise en place d'un environnement « spreadtab » - 6 Nombreuses optimisations pour une meilleure vitesse d'exécution + 1 Correction d'un bug : dans une cellule, on ne pouvait pas écrire + plusieurs fois la même référence. + 2 Correction d'un bug avec \multicolumn : cette commande était mal + gérée lorsqu'employée avec une cellule de texte. + 3 Implémentation de macro-fonctions avec différenciation selon le + type d'argument et le type de donnée renvoyée. + 4 Possibilité d'imbrication des macro-fonctions. + 5 Mise en place d'un environnement « spreadtab » + 6 Nombreuses optimisations pour une meilleure vitesse d'exécution ------------------------------------------------------------------------------- v0.1pre 2009/09/02 - 1 Mise au point des messages d'erreurs et des arrêts de compilation - selon les erreurs rencontrées. + 1 Mise au point des messages d'erreurs et des arrêts de compilation + selon les erreurs rencontrées. 2 Correction d'un bug dans \ST@coord@toref 3 Les cellules vides, textuelles ou jointes par un \multicolumn sont - ignorées dans les plages de cellules concernées par les fonctions + ignorées dans les plages de cellules concernées par les fonctions sum et sumprod - 4 Les noms de mois accentués et \today sont désormais permis en + 4 Les noms de mois accentués et \today sont désormais permis en argument de la fonction frlongdatetonum - 5 somprod corrigé en sumprod, plus anglais ! - 6 La macro fonction rnd, trop complexe est supprimée au profit de rand + 5 somprod corrigé en sumprod, plus anglais ! + 6 La macro fonction rnd, trop complexe est supprimée au profit de rand et randint - 7 Améliorations et optimisations + 7 Améliorations et optimisations ------------------------------------------------------------------------------- -v0.1 2009/11/03 Première version publique sur le CTAN +v0.1 2009/11/03 Première version publique sur le CTAN ------------------------------------------------------------------------------- v0.2 2010/01/24 - 1 On peut définir le séparateur décimal par la macro - \STsetdecimalsep{<caractère>} - 2 Il est possible de copier une formule dans le tableau à l'aide de - \STcopy{>a,vb}{formule} où a et b sont les nombres de cellules - horizontaux et verticaux vers lesquels la formule sera copiée. - 3 Désormais, spreadtab est entièrement compatible avec toutes les + 1 On peut définir le séparateur décimal par la macro + \STsetdecimalsep{<caractère>} + 2 Il est possible de copier une formule dans le tableau à l'aide de + \STcopy{>a,vb}{formule} où a et b sont les nombres de cellules + horizontaux et verticaux vers lesquels la formule sera copiée. + 3 Désormais, spreadtab est entièrement compatible avec toutes les commandes du package booktabs 4 La commande \noalign et son argument est prise en compte lorsqu'elle se - trouve après un \\ - 5 Suppression d'espaces indésirables - 6 Mise en place d'un mode débogage où l'on peut visualiser les champs - numériques, les champs textuels ou les codes des cellules du tableau + trouve après un \\ + 5 Suppression d'espaces indésirables + 6 Mise en place d'un mode débogage où l'on peut visualiser les champs + numériques, les champs textuels ou les codes des cellules du tableau ------------------------------------------------------------------------------- v0.2a 2010/02/02 1 Ajout de la traduction en vietnamien et correction d'erreurs dans la - documentation française. + documentation française. 2 Implementation beta et donc non visible des macros fonctions gcd, lcm - Ces macro-fonctions ne sont pas encore documentées. + Ces macro-fonctions ne sont pas encore documentées. ------------------------------------------------------------------------------- v0.3 2010/03/28 - 1 La macro \STautoround{x} admet une version étoilée pour laquelle - les nombres sont arrondis et formatés pour avoir x chiffres après + 1 La macro \STautoround{x} admet une version étoilée pour laquelle + les nombres sont arrondis et formatés pour avoir x chiffres après la virgule en rajoutant des 0 inutiles si besoin - 2 La valeur sauvegardée par \STsavecell tient désormais compte du - séparateur décimal + 2 La valeur sauvegardée par \STsavecell tient désormais compte du + séparateur décimal 3 Macro fonctions "gcd" (PGCD), "lcm" (PPCM) et "scitodec" pour convertir - une écriture scientifique en une écriture décimale - 4 Dans le champ textuel d'une cellule, on peut désormais afficher le - champ numérique d'une cellule avec <<ref>> - 5 Amélioration de l'algorithme pour \STcopy : enleve une formule de - \ST@copylist lorsqu'on a dépassé la dernière ligne de la plage - où elle doit être copiée + une écriture scientifique en une écriture décimale + 4 Dans le champ textuel d'une cellule, on peut désormais afficher le + champ numérique d'une cellule avec <<ref>> + 5 Amélioration de l'algorithme pour \STcopy : enleve une formule de + \ST@copylist lorsqu'on a dépassé la dernière ligne de la plage + où elle doit être copiée 6 Correction d'un bug lorsque la macro-fonction admettant un argument - textuel a un argument faisant référence à une autre cellule : + textuel a un argument faisant référence à une autre cellule : enlever ":=" si besoin 7 Correction d'un bug dans xstring qui changeait les catcodes des tokens - de \@xs@afterinteger lorsqu'on appelle \IfInteger + de \@xs@afterinteger lorsqu'on appelle \ST@IfInteger 8 Correction d'un bug dans \ST@build@tab@i pour prendre en compte les - cellules de code 0 dans lesquelles ":=" doit être supprimé + cellules de code 0 dans lesquelles ":=" doit être supprimé ------------------------------------------------------------------------------- v0.3a 2010/05/15 - 1 Correction d'un bug dans \ST@gobble@remain : ce qui reste à manger + 1 Correction d'un bug dans \ST@gobble@remain : ce qui reste à manger peut contenir des tokens de catcode 1 ou 2 ce qui fait que - l'utilisation d'arguments délimités ne fonctionnerait pas dans ces + l'utilisation d'arguments délimités ne fonctionnerait pas dans ces cas. ------------------------------------------------------------------------------- v0.3b 2010/06/06 1 Correction d'un bug concernant les macro-fonctions renvoyant un texte. - Lorsque leur argument contenait une référence, celle-ci devenait + Lorsque leur argument contenait une référence, celle-ci devenait une cellule texte. 2 Correction d'un bug sur la macro \ST@stackcall : il faut y enlever - toutes les occurrences de la cellule en train d'être calculée - 3 Modification de l'ordre de calcul des cellules concernées par les + toutes les occurrences de la cellule en train d'être calculée + 3 Modification de l'ordre de calcul des cellules concernées par les macro fonctions sum et somprod - 4 Correction d'un bug dans la façon dont sont produites les skiplist + 4 Correction d'un bug dans la façon dont sont produites les skiplist \ST@row@skiplist et \STcol@skiplist - 5 Implémentation de la macro fonction "id" + 5 Implémentation de la macro fonction "id" ------------------------------------------------------------------------------- v0.3c 2011/04/08 - 1 Correction d'un gros bug lors de la substitution d'une référence de - type <lettre><nbre> lorsque nbre>10 : a10 était vu comme "a1" suivi - de 0, et même pour tous les nbre>10 ! + 1 Correction d'un gros bug lors de la substitution d'une référence de + type <lettre><nbre> lorsque nbre>10 : a10 était vu comme "a1" suivi + de 0, et même pour tous les nbre>10 ! 2 Macro \STprintnum ------------------------------------------------------------------------------- v0.4 2011/07/04 - 1 Les calculs se font en dehors d'un groupe pour éviter l'erreur de + 1 Les calculs se font en dehors d'un groupe pour éviter l'erreur de save-satck - 2 Possibilité d'écrire aussi \spreadtab<code tableau>\endspreadtab + 2 Possibilité d'écrire aussi \spreadtab<code tableau>\endspreadtab 3 Macros fonctions tag, cell, row, col et la macro \STtag qui permet de - faire appel à la valeur de la cellule marquée par la macro fonction + faire appel à la valeur de la cellule marquée par la macro fonction tag. \STmakegtag rend les sauvegardes globales. 4 La commande \STeol permet de choisir quel est le marqueur de fin de ligne dans les tableau de spreadtab 5 dans une cellule mixte, les macro fonctions renvoyant du texte ont leur - résultat qui prend la place de :={<formule>} + résultat qui prend la place de :={<formule>} ------------------------------------------------------------------------------- v0.4a 2011/08/11 - 1 Un bug corrigé dans \ST@search@hline@i + 1 Un bug corrigé dans \ST@search@hline@i ------------------------------------------------------------------------------- v0.4b 2012/05/13 - 1 Un bug corrigé dans \ST@func@sum + 1 Un bug corrigé dans \ST@func@sum ------------------------------------------------------------------------------- v0.4c 2014/11/06 - 1 Un bug corrigé dans \ST@analyse@text@frdate et + 1 Un bug corrigé dans \ST@analyse@text@frdate et \ST@analyse@text@engdate : si #1 commence par un espace parasite, - celui-ci est désormais retiré. - 2 Bug corrigé dans \ST@displaynumfields : les macros - \ST@current@colnumber et \ST@current@rownumber sont définies avant + celui-ci est désormais retiré. + 2 Bug corrigé dans \ST@displaynumfields : les macros + \ST@current@colnumber et \ST@current@rownumber sont définies avant d'appeler \ST@ifref ------------------------------------------------------------------------------- v0.4d 2018/01/02 - 1 Bug corrigé dans \STeval@cell : le \edef\ST@dependance@tree corrige + 1 Bug corrigé dans \STeval@cell : le \edef\ST@dependance@tree corrige le \def ! 2 Ajout d'un message d'erreur si une la fonction sum a une plage qui - contient la cellule courante elle-même + contient la cellule courante elle-même 3 Nouvelle macro fonction "value" 4 Nettoyage du code ------------------------------------------------------------------------------- v0.5 2019/02/27 - 1 Choix du moteur de calcul : fp ou xfp
\ No newline at end of file + 1 Choix du moteur de calcul : fp ou xfp + ------------------------------------------------------------------------------- +v0.51 2020/06/09 + 1 Bug corrigé : les \if..\fi n'étaient pas équilibrés lors des appels aux + macros \STif.. avec le moteur fp +------------------------------------------------------------------------------- +v0.51 2023/09/11 + 1 Bug corrigé : les anciennes macros de xstring \IfInteger et + \IfDecimal sont incorporées à spreadtab qui sinon est cassé
\ No newline at end of file |