texlive[50147] Master/texmf-dist: spreadtab (27feb19)
commits+karl at tug.org
commits+karl at tug.org
Wed Feb 27 22:55:16 CET 2019
Revision: 50147
http://tug.org/svn/texlive?view=revision&revision=50147
Author: karl
Date: 2019-02-27 22:55:15 +0100 (Wed, 27 Feb 2019)
Log Message:
-----------
spreadtab (27feb19)
Modified Paths:
--------------
trunk/Master/texmf-dist/doc/latex/spreadtab/README
trunk/Master/texmf-dist/doc/latex/spreadtab/spreadtab-en.pdf
trunk/Master/texmf-dist/doc/latex/spreadtab/spreadtab-en.tex
trunk/Master/texmf-dist/doc/latex/spreadtab/spreadtab-fr.pdf
trunk/Master/texmf-dist/doc/latex/spreadtab/spreadtab-fr.tex
trunk/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty
Modified: trunk/Master/texmf-dist/doc/latex/spreadtab/README
===================================================================
--- trunk/Master/texmf-dist/doc/latex/spreadtab/README 2019-02-27 21:55:03 UTC (rev 50146)
+++ trunk/Master/texmf-dist/doc/latex/spreadtab/README 2019-02-27 21:55:15 UTC (rev 50147)
@@ -1,9 +1,9 @@
L'extension
spreadtab
- v0.4d
+ v0.5
- 1er janvier 2018
+ 27 f\'evrier 2019
Author : Christian Tellechea
Email : unbonpetit at netc.fr (CT)
@@ -31,4 +31,4 @@
The cells in a table have coordinates representing their row and
column, and by this way can be inserted into formulas to generate
-values in other cells.
\ No newline at end of file
+values in other cells.
Modified: trunk/Master/texmf-dist/doc/latex/spreadtab/spreadtab-en.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/spreadtab/spreadtab-en.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/spreadtab/spreadtab-en.tex 2019-02-27 21:55:03 UTC (rev 50146)
+++ trunk/Master/texmf-dist/doc/latex/spreadtab/spreadtab-en.tex 2019-02-27 21:55:15 UTC (rev 50147)
@@ -4,7 +4,9 @@
\usepackage[T1]{fontenc}
\usepackage[a4paper,margin=2.6cm]{geometry}
\usepackage[table]{xcolor}
-\usepackage{amsmath,amssymb,textcomp,array,arydshln,tabularx,listings,numprint,xspace,spreadtab,fancyhdr,libertine,babel,enumitem}
+\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}
\fancyhead[L]{}
@@ -92,6 +94,8 @@
\newcommand\verbinline[1][]{\lstinline[breaklines=false,basicstyle=\normalsize\ttfamily,#1]}
\newcommand\ST{\textsf{\STname}\xspace}
+\newcommand\xfp{\texttt{\bfseries xfp}\xspace}
+\newcommand\fp{\texttt{\bfseries fp}\xspace}
\newcommand\falseverb[1]{\texttt{\detokenize{#1}}}
\usepackage[bookmarks=true,bookmarksopen=true,colorlinks=true,hyperfootnotes=false,filecolor=black,linkcolor=blue,urlcolor=magenta,pdfauthor={Christian TELLECHEA},pdftitle={spreadtab},pdfsubject={Spreadtab provides spreadsheet features for LaTeX table environments},pdfkeywords={spreadtab},pdfcreator={LaTeX}]{hyperref}
@@ -133,9 +137,18 @@
\section{Introduction}
\subsection{Presentation}
-This package allows us to construct tables in a manner similar to a spreadsheet. The cells of a table have row and column indices and these can be used in formulas to generate values in other cells.
+This package allows us to construct tables in a manner similar to a spreadsheet. The cells of a table have row and column indices and these can be used in formulas to generate values in other cells. The package is loaded with the classic syntax in the preamble:
+\begin{center}
+\verb-\usepackage[<options>]{spreadtab}-
+\end{center}
+where the options "\verb|fp|" or "\verb|xfp|" select the calculation engine. If no option is specified, the engine will be \fp. If both options are specified, the active engine at the beginning of the document will be \xfp, but in this case, you can change the engine at any time by running \verbinline|\STusefp| or \verbinline|\STusexfp|. This documentation is compiled with the engine \xfp, unless examples where \fp engine is selected. As a general rule, the two calculation engines must give identical results, but
+\begin{itemize}
+ \item \fp is a fixed point calculation engine (18 digits before and 18 after) and therefore gives more digits after the decimal point than \xfp which performs floating point calculations with 16 significant digits; on the other hand, \xfp natively allows tests, manages infinity and \verb|NaN|, understands implicit multiplication by juxtaposition, etc.
+ \item differences exist between the two engines regarding the functions available both in terms of syntax and their existence. Indeed, the function \verb|max(...)| only admits \emph{two} numbers as arguments with \fp while \xfp accepts as many arguments as you want. Similarly, the exponential is obtained with \verb|e^x| or \verb|pow(x,e)| with \fp while the syntax with \xfp is \verb|exp(x)|. Moreover, the functions recognized by the two engines are not the same, as can be seen from their documentation: \verb|ceil| for example, only exists for \xfp. In general, we can consider \xfp to have more features than \fp;
+ \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 $\varepsilon$-\TeX, \LaTeXe{} and the \href{http://www.ctan.org/tex-archive/macros/latex/contrib/fp/}{\texttt{\textbf{fp}}} package, 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 in its \falseverb{v1.5d [2010/03/28]} version or later.\medskip
+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 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
@@ -142,7 +155,7 @@
Consequently, \ST proceeds in 3 main stages before \verbinline=\begin{<table environment>}= sees the table:
\begin{itemize}
\item first, it reads the body of the table, divides it in lines and cells, and in each cell, seeks a possible formula;
- \item then, it computes the formulas in the cells, taking care for each to previously calculate all the dependent cells. The calculations are done by the \href{http://www.ctan.org/tex-archive/macros/latex/contrib/fp/}{\texttt{\textbf{fp}}} package;
+ \item then, it computes the formulas in the cells, taking care for each to previously calculate all the dependent cells. The calculations are made by the package \fp or \xfp, provided that the formulas to be evaluated in the cells are compatible with the syntaxes of the macros \verb|\FPeval| of the package \fp or \verb|\fpeval| of the package \xfp\footnote{If you want to use the logical "AND" of \xfp "\texttt{\string&\string&}", it is \emph{mandatory} to put this operator between brackets in an array so that the tokens \texttt{\string&\string&} are not understood as column separators. In a cell of a table, we will write for example \texttt{a1>1 \string{\string&\string&\string} a1<10}.};
\item finally, it is necessary to rebuild the table, replacing each formula by its numerical calculated value and handing over to the environment name specified by the user.
\end{itemize}
The syntax in both the following is allowed (and equivalent), where \verb-<name>- is the name of any table environment available with \LaTeX{} or with a package:\par\nobreak
@@ -168,7 +181,7 @@
\end{<name>}
\end{lstlisting}
-Although having features resembling those of a spreadsheet with \LaTeX{} is appreciable, the 3 stages described above take time, and above all, \verb-fp- is slow in its calculations. The \ST environment leads to \emph{much slower compilation} than with a classical table.
+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.
@@ -297,7 +310,7 @@
Moreover, if a cell is empty or filled with spaces, \ST will consider it as a text cell.
\subsection{Mixed cells}
-In reality, each cell is composed of two fields. The first is a \emph{numeric field} containing the formula; the second is a \emph{text field}, ignored by \falseverb{fp} and not taken into account for calculations:
+In reality, each cell is composed of two fields. The first is a \emph{numeric field} containing the formula; the second is a \emph{text field}, ignored by the calc engine and not taken into account for calculations:
\begin{itemize}
\item if nothing is specified in a cell, the entire cell is the number field, and the text field is empty (this was the case for all table cells of Pascal's triangle seen above);
\item if the cell contains the `\falseverb @' character, then the entire cell is the text field. The numeric field is empty and inaccessible;
@@ -435,7 +448,7 @@
\section{Features for formatting the table}
\subsection{Decimal seprarator}
-The \verb-fp- package returns its results with the decimal point separator. After the job of \verb-fp-, \ST can change this decimal separator: everything happens as if the results returned by \verb-fp- were taking this into account. The command \verbinline-\STsetdecimalsep- takes a mandatory argument which is the character used as decimal separator:
+The \fp and \xfp packages return results with the decimal point separator. After the job of calculation, \ST can change this decimal separator: everything happens as if the results returned by \fp or \xfp were taking this into account. The command \verbinline-\STsetdecimalsep- takes a mandatory argument which is the character used as decimal separator:
\begin{center}
\verbinline-\STsetdecimalsep-\verb-{<char>}-
\end{center}
@@ -494,14 +507,14 @@
\end{spreadtab}
\end{minipage}
-\subsection{Number formatting and the {\ttfamily fp} package}
-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/}{\texttt{\textbf{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 \falseverb{fp} displays \emph{all} the decimals!
+\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
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 \verb=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.
+ \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}
In this example, floating point numbers are rounded to 6 digits:\par\nobreak
\begin{lstlisting}
@@ -557,7 +570,7 @@
\end{spreadtab}
\end{center}
-Here is another similar example where we test if the number to display is negative with the command \verbinline-\FPifneg- from the \verb-fp- package. If this happens, the number is displayed in red. The command \verbinline-\STautoround- was preferred to \verbinline-\nprounddigits- from the \verb-numprint- package because the latter adds unnecessary 0's.
+Here is another similar example where we test if the number to display is negative with the command \verbinline-\FPifneg- from the \fp package. If this happens, the number is displayed in red. The command \verbinline-\STautoround- was preferred to \verbinline-\nprounddigits- from the \verb-numprint- package because the latter adds unnecessary 0's.
\begin{lstlisting}
\STsetdecimalsep{.}
\renewcommand\STprintnum[1]{\FPifneg{#1}\color{red}\fi\numprint{#1}}
@@ -575,7 +588,7 @@
@$x$ & -1 & 2 & -3 & 4 & -5 & 6 & -7 \\\hline
@$1/x$ &1/b1&1/c1&1/d1&1/e1&1/f1&1/g1&1/h1
\end{spreadtab}
-\end{center}
+\end{center}\STusexfp
\subsection{End of lines and horizontal rules}
\ST recognizes the usual line breaks and horizontal rules \verb|\\| and \verb|\hline|. It is also possible to specify the optional argument in line break: \verb-\\[<dimension>]-.
@@ -760,7 +773,7 @@
The marker `\falseverb{:=}' is necessary in every cell where the command \verbinline-\multicolumn- is written. Without it, \ST would consider that the whole cell (i.e. \verb-\multicolumn{2}{|c|}{<formula>}-) as the formula, which is impossible to calculate.
\section{Macro-functions}
-The \falseverb{fp} package provides a limited set of operations and functions. If these are not sufficient then \ST allows the advanced programmer to write macros using the operations and functions of \falseverb{fp}. This section presents the macro-functions currently available\footnote{Many others should be written soon and be available in future versions of the package.}. There will be more details on how to program macro functions in the next version of this manual.
+The \fp package provides a limited set of operations and functions. If these are not sufficient then \ST allows the advanced programmer to write macros using the operations and functions of \fp. This section presents the macro-functions currently available\footnote{Many others should be written soon and be available in future versions of the package.}. There will be more details on how to program macro functions in the next version of this manual.
\subsection{Mathematical macro-functions}
\subsubsection{Sum cells}
@@ -800,7 +813,7 @@
\end{minipage}%
\subsubsection{The \texttt{fact} macro}
-The macro-function \verbinline=fact(<number>)= computes the factorial of its argument, assuming it is an \emph{integer} between 0 and 18 to avoid overflows\footnote{Indeed, for \falseverb{fp} the greatest integer is $10^{18}-1$. The factorial of 19 is greater than this.}. 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://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
Here are the factorials from 0 to 8:\par\nobreak
\begin{lstlisting}
@@ -841,7 +854,10 @@
\subsubsection{Random numbers}
The macro-functions \verbinline-randint- and \verbinline-rand- each returns a random number depending on its argument.
-It should be noted that the seed initializing the random sequence depends on the date and the minute at which the compilation is done. Thus, the random sequence of numbers given by this function will change between two compilations made at different times. If random numbers need to be repeatable, the private macro \verb-\ST at seed- must be cancelled and a seed should be chosen for \falseverb{fp}. Here is the code to do this:\par\nobreak
+\paragraph{Random numbers with \fp calc engine}
+With this engine, \verbinline-randind- and \verbinline-rand- are \emph{macro functions} of \ST that rely on the macro \verb|\FPrandom| of \fp.
+
+It should be noted that the seed initializing the random sequence depends on the date and the minute at which the compilation is done. Thus, the random sequence of numbers given by this function will change between two compilations made at different times. If random numbers need to be repeatable, the private macro \verb-\ST at seed- must be cancelled and a seed should be chosen for \fp. Here is the code to do this:\par\nobreak
\begin{lstlisting}[backgroundcolor=\color{ST at codebckgcolor}]
\makeatletter
\renewcommand\ST at seed{}% redefines the private macro
@@ -853,6 +869,7 @@
The macro-function \verbinline-rand()- returns a random number between 0 and 1.\par\nobreak
\begin{lstlisting}
\STautoround{6}
+\STusefp
\begin{spreadtab}{{tabular}{|l|cccc|}}\hline
@numbers in [0;1] &rand() &rand() &rand() &rand() \\
@numbers in [-5;5] &randint(-5,5) &randint(-5,5) &randint(-5,5) &randint(-5,5)\\
@@ -859,9 +876,11 @@
@numbers in [0;20] &randint(20) &randint(20) &randint(20) &randint(20) \\
\hline
\end{spreadtab}
+\STusexfp
\end{lstlisting}
\begin{center}
\STautoround{6}
+\STusefp
\begin{spreadtab}{{tabular}{|l|cccc|}}\hline
@numbers in [0;1] &rand() &rand() &rand() &rand() \\
@numbers in [-5;5] &randint(-5,5) &randint(-5,5) &randint(-5,5) &randint(-5,5)\\
@@ -868,8 +887,35 @@
@numbers in [0;20] &randint(20) &randint(20) &randint(20) &randint(20) \\
\hline
\end{spreadtab}
+\STusexfp
\end{center}
+\paragraph{Random numbers with \xfp engine}
+With this engine, \verbinline-randind- and \verbinline-rand- are functions recognized natively by \xfp. A warning will be issued if \XeLaTeX{} is used in an older version that does not implement pseudo-random number generation primitives; in this case, using the functions \verbinline-randind- and \verbinline-rand- will not be enabled and will throw compilation errors.
+
+As specified in the documentation of \href{http://mirrors.ctan.org/macros/latex/contrib/l3kernel/interface3.pdf}{\texttt{\textbf{\textbf{interface3}}}}, the function \verbinline|randint(<a>,<b>)| produces a random integer between the two arguments, but if \verb|<a>| is omitted, \verbinline|randint(<b>)| produces an integer between {\color{red}\bfseries1} and \verb|<b>| which is different from the \verbinline-randint- macro function of \ST used with \fp which produces an integer between {\color{red}\bfseries0} and \verb|<b>|.\STusexfp
+
+\begin{lstlisting}
+\STautoround{6}
+\STusexfp
+\begin{spreadtab}{{tabular}{|l|cccc|}}\hline
+ at nombers in [0;1] &rand() &rand() &rand() &rand() \\
+ at nombers in [-5;5] &randint(-5,5) &randint(-5,5) &randint(-5,5) &randint(-5,5)\\
+ at nombers in [0;20] &randint(20) &randint(20) &randint(20) &randint(20) \\
+\hline
+\end{spreadtab}
+\end{lstlisting}
+\begin{center}
+\STautoround{6}
+\STusexfp
+\begin{spreadtab}{{tabular}{|l|cccc|}}\hline
+ at nombres dans [0;1] &rand() &rand() &rand() &rand() \\
+ at nombres dans [-5;5] &randint(-5,5) &randint(-5,5) &randint(-5,5) &randint(-5,5)\\
+ at nombres dans [1;20] &randint(20) &randint(20) &randint(20) &randint(20) \\
+\hline
+\end{spreadtab}
+\end{center}
+
\subsubsection{GCD and LCM}
The macro functions `gcd' and `lcm' compute the Greatest Common Divisor and the Least Common Multiple of the list of numbers in their argument:
\begin{center}
@@ -897,7 +943,7 @@
\end{center}
\subsubsection{Scientific notation}
-The macro function `scitodec' converts a number written in scientific notation into a decimal number, understandable by \ST to achieve its calculations. The syntax is \verbinline-scitodec(<text>)-, where \verb-<text>- is:
+The macro function `scitodec' converts a number written in scientific notation into a decimal number, understandable by \fp to achieve its calculations. The syntax is \verbinline-scitodec(<text>)-, where \verb-<text>- is:
\begin{itemize}
\item a sequence of characters with the syntax \verb-<mantissa>EE<exponent>- where \verb-<mantissa>- is a decimal number and the \verb-<exponent>- is an integer. The `EE' may be written uppercase or lowercase.
@@ -928,6 +974,8 @@
\end{spreadtab}
\end{center}
+The engine \xfp natively understands numbers written in scientific notation in the form \verb|<a>e<b>| but this syntax is \emph{impossible} to use with \ST because the number \verb|4e3|, which is 4000, would be understood by \ST as 4 followed by the content of the cell \verb|e3|.
+
\subsubsection{Identity}
The simplest macro function is `\verbinline=id(<number>)='. It returns the number in its argument. Mathematically, it is not very useful, but with \ST, it makes possible the writing of mathematical expressions in arguments of macro functions where they are not otherwise allowed -- in the argument of \verbinline=sum= for example.
@@ -947,7 +995,7 @@
\end{center}
\subsection{Tests}
-Three macro-functions provide tests:\par\nobreak
+Since \fp and its macro \verb|\FPeval| do not accept test in its argument, three macro-functions provide tests (they are not interesting with \xfp and its terenary operator \verb|?:|, see below):\par\nobreak
\begin{center}
\verbinline=ifeq(number1,number2,number3,number4)=\par
\verbinline=ifgt(number1,number2,number3,number4)=\par
@@ -993,7 +1041,33 @@
[0,-1]+0.5 & iflt([-1,0],1,10,ifeq([-1,0],1,0,-10))\\\hline
\end{spreadtab}
\end{center}
+The engine \xfp and its ternary operator \verb|<a>?<b>:<c>| makes tests easier in the evaluated expressions: if the test \verb|<a>| is true, \verb|<b>| is retained otherwise, it is \verb|<c>|. Thus, the nested tests above become:
+\begin{lstlisting}
+\begin{spreadtab}{{tabular}{|*2c|}}\hline
+@$x$ & @$f(x)$ \\\hline
+-0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\\hline
+\end{spreadtab}
+\end{lstlisting}
+\begin{center}
+\begin{spreadtab}{{tabular}{|*2c|}}\hline
+@$x$ & @$f(x)$ \\\hline
+-0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\\hline
+\end{spreadtab}
+\end{center}
+
\subsection{Macro-functions manipulating dates}
\subsubsection{Date to number with \ttfamily engshortdatetonum}\label{datetonum}
The macro \verbinline-engshortdatetonum- converts a short date like 1789/7/14 to an integer which is the number of days passed since the 1st March of the year 0\footnote{This year 0 does not exist but this should not be a problem with recent dates.}. It is important to note that this macro-function requires a \emph{textual} argument and not a number or the result of a mathematical calculation. Therefore, if the argument of this macro-function refers to a cell, that cell \emph{must} be a text cell, i.e. a cell containing `\verb- at -' or `\verb-:={}-'.
@@ -1433,7 +1507,7 @@
\renewcommand\STprintnum[1]{\numprint{#1}}
\begin{spreadtab}{{tabular}{cc}}
\multicolumn{2}{c}{Convergence at $x=\color{red}:={0.5}$}\\[1.5ex]
-@$n$ & e^a1\SThidecol & @ $\displaystyle e^{\numprint{<<a1>>}}-\sum_{k=0}^n\frac{\numprint{<<a1>>}^k}{k!}$\\[3ex]\hline
+@$n$ & exp(a1)\SThidecol & @ $\displaystyle e^{\numprint{<<a1>>}}-\sum_{k=0}^n\frac{\numprint{<<a1>>}^k}{k!}$\\[3ex]\hline
\color{red}:={0}& a1^[-1,0]/fact([-1,0]) & \STcopy{v}{b!2-b3}\\
\STcopy{v}{a3+1}& \STcopy{v}{a!1^a4/fact(a4)+b3}& \\
& & \\
Modified: trunk/Master/texmf-dist/doc/latex/spreadtab/spreadtab-fr.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex/spreadtab/spreadtab-fr.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/spreadtab/spreadtab-fr.tex 2019-02-27 21:55:03 UTC (rev 50146)
+++ trunk/Master/texmf-dist/doc/latex/spreadtab/spreadtab-fr.tex 2019-02-27 21:55:15 UTC (rev 50147)
@@ -4,7 +4,9 @@
\usepackage[T1]{fontenc}
\usepackage[a4paper,margin=2.6cm]{geometry}
\usepackage[table]{xcolor}
-\usepackage{amsmath,amssymb,textcomp,array,arydshln,tabularx,listings,numprint,xspace,spreadtab,fancyhdr,libertine,babel,enumitem}
+\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}
\fancyhead[L]{}
@@ -33,7 +35,7 @@
numbersep=1em,classoffset=1,%
morekeywords={% les macros et commandes de spreadtab
spreadtab,endspreadtab,SThiderow,SThidecol,STsavecell,STautoround,STmessage,STsetdecimalsep,STtransposecar,STdebug,STdisplaytab,STsetdisplaymarks,%
- STnumericfieldmarker,STprintnum,STtextcell,STcopy,STtag,STmakegtag,STeol,fact,id,ifeq,ifgt,iflt,numtofrshortdate,%
+ STnumericfieldmarker,STprintnum,STtextcell,STcopy,STtag,STmakegtag,STeol,fact,id,ifeq,ifgt,iflt,numtofrshortdate,STusefp,STusexfp,%
numtoengshortdate,numtofrlongdate,numtoenglongdate,numtofrmonth,%
numtoengmonth,numtofrday,numtoengday,sum,rand,randint,sumprod,%
frshortdatetonum,engshortdatetonum,englongdatetonum,frlongdatetonum,gcd,lcm,tag,cell,row,col,value},%
@@ -92,6 +94,8 @@
\newcommand\verbinline[1][]{\lstinline[breaklines=false,basicstyle=\normalsize\ttfamily,#1]}
\newcommand\ST{\textsf{\STname}\xspace}
+\newcommand\xfp{\texttt{\bfseries xfp}\xspace}
+\newcommand\fp{\texttt{\bfseries fp}\xspace}
\newcommand\falseverb[1]{\texttt{\detokenize{#1}}}
\usepackage[bookmarks=true,bookmarksopen=true,colorlinks=true,hyperfootnotes=false,filecolor=black,linkcolor=blue,urlcolor=magenta,pdfauthor={Christian TELLECHEA},pdftitle={spreadtab},pdfsubject={Spreadtab permet d'utiliser des fonctionnalités de tableur dans un tableau avec LaTeX},pdfkeywords={spreadtab},pdfcreator={LaTeX}]{hyperref}
@@ -120,7 +124,7 @@
\begin{minipage}{0.8\linewidth}
\noindent\hrulefill\par
\hfill\textbf{\textit{Résumé}}\hfill{}\medskip\par\footnotesize
- Cette extension permet d'utiliser des fonctionnalités de tableur dans n'importe quel environnement \og tableau\fg{} avec \LaTeX{}.\par\smallskip
+ Cette extension permet d'utiliser des fonctionnalités de tableur dans n'importe quel environnement «tableau» avec \LaTeX{}.\par\smallskip
La principale fonctionnalité étant de pouvoir écrire des formules dans les cellules d'un tableau qui font références à d'autres cellules, de calculer les formules contenues dans les cellules et d'afficher les résultats numériques de ces formules dans le tableau.\par
\hrulefill
\end{minipage}
@@ -133,16 +137,25 @@
\section{Introduction}
\subsection{Présentation}
-Cette extension permet de construire des tableaux similaire à des feuilles de calculs. Les cellules du tableau ont des coordonnées (colonne et ligne) qui peuvent être utilisées dans des formules pour calculer des valeurs dans d'autres cellules.
+Cette extension permet de construire des tableaux similaires à des feuilles de calculs. Les cellules du tableau ont des coordonnées (colonne et ligne) qui peuvent être utilisées dans des formules pour calculer des valeurs dans d'autres cellules. On charge le package en écrivant dans le préambule la syntaxe classique
+\begin{center}
+\verb-\usepackage[<options>]{spreadtab}-
+\end{center}
+où les options «\verb|fp|» ou «\verb|xfp|» spécifient le moteur de calcul choisi. Si aucune option n'est spécifiée, le moteur sera \fp. Si les deux options sont spécifiées, le moteur actif au début du document sera \fp, mais dans ce cas, on peut changer de moteur à tout moment en exécutant \verbinline|\STusefp| ou \verbinline|\STusexfp|. Cette documentation est compilée avec le moteur \xfp, sauf exemple où le contraire est spécifié. En règle générale, les deux moteurs de calcul doivent donner des résultats identiques, mais :
+\begin{itemize}
+ \item \fp est un moteur de calcul à virgule fixe (18 chiffres avant et 18 après) et donne donc davantage de chiffres après la virgule que \xfp qui effectue les calculs en virgule flottante avec 16 chiffres significatifs; en revanche, \xfp accepte nativement des tests, gère l'infini et \verb|NaN|, comprend la multiplication implicite par juxtaposition, etc.
+ \item des différences existent entre les deux moteurs concernant les fonctions disponibles tant du point de vue de la syntaxe que de leur existence même. Ainsi, la fonction \verb|max(...)| n'admet que \emph{deux} nombres en argument avec \fp tandis que \xfp accepte autant d'arguments que l'on veut. De la même façon, l'exponentielle s'obtient avec \verb|e^x| ou \verb|pow(x,e)| avec \fp alors que la syntaxe avec \xfp est \verb|exp(x)|. Par ailleurs, les fonctions reconnues par les deux moteurs ne sont pas les mêmes, comme on peut le constater en lisant leurs documentations : \verb|ceil| par exemple, n'existe que pour \xfp. D'une manière générale, on peut considérer \xfp comme étant mieux doté en fonctionnalités que \fp;
+ \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 $\varepsilon$-\TeX, le format \LaTeXe{} ainsi que le package \href{http://www.ctan.org/tex-archive/macros/latex/contrib/fp/}{\texttt{\textbf{fp}}} à qui sont confiés les calculs. Le package \href{http://www.ctan.org/tex-archive/macros/latex/contrib/xstring/}{\texttt{\textbf{xstring}}} est également requis dans une version \emph{supérieure ou égale} à la version \verb-v1.5d [2010/03/28]-.
+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.
-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 \og\verb=&=\fg{} et les retours à la ligne soient \og\verb=\\=\fg{}. 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 \og voit\fg{} le corps du tableau.
+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.
Par conséquent, \ST procède en 3 étapes :
\begin{itemize}
\item en premier lieu, \ST lit le corps du tableau et le divise en lignes puis en cellules en reconnaissant dans chacune la présence d'une éventuelle formule;
- \item ensuite, il procède au calcul des formules contenues dans les cellules, en ayant pris soin pour chacune de calculer auparavant les cellules dépendantes. L'ordre dans lequel les cellules doivent être calculées est déterminé par \ST. Les calculs sont faits par le package \href{http://www.ctan.org/tex-archive/macros/latex/contrib/fp/}{\texttt{\textbf{fp}}};
+ \item ensuite, il procède au calcul des formules contenues dans les cellules, en ayant pris soin pour chacune de calculer auparavant les cellules dépendantes. L'ordre dans lequel les cellules doivent être calculées est déterminé par \ST. Les calculs sont faits par le package \fp ou \xfp, sous réserve que les formules à évaluer dans les cellules soient compatibles avec les syntaxes des macros \verb|\FPeval| du package \fp ou \verb|\fpeval| du package \xfp\footnote{Si l'on souhaite utiliser le «ET» logique de \xfp noté «\texttt{\string&\string&}», il est \emph{obligatoire} de mettre cet opérateur entre accolades dans un tableau afin que les tokens \texttt{\string&} ne soient pas compris comme des séparateurs de colonnes. Dans une cellule d'un tableau, pour tester si le contenu de la cellule \texttt{a1} appartient à un intervalle, on écrira donc par exemple «\texttt{a1>1 \string{\string&\string&\string} a1<10}».};
\item enfin, il faut reconstruire le tableau en ayant remplacé chaque formule par la valeur numérique préalablement calculée et passer la main à l'environnement tableau spécifié par l'utilisateur.
\end{itemize}
Les deux syntaxes possibles (et équivalentes) sont les suivantes, où \verb-<nom>- représente le nom de n'importe quel environnement de type tableau disponible avec \LaTeX{} ou avec une extension :\par\nobreak
@@ -168,9 +181,9 @@
\end{<nom>}
\end{lstlisting}
-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 et surtout que \falseverb{fp} est lent dans ses calculs. L'ensemble conduit donc à des temps de compilation \emph{beaucoup plus importants} qu'avec un tableau classique.
+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 \og calc\fg{} de Open Office, et \href{http://www.ctan.org/tex-archive/support/excel2latex/}{\texttt{\textbf{excel2latex}}} pour \og excel\fg{} 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{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.
\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.
@@ -178,7 +191,7 @@
La route a été longue avant d'arriver à cette version et je tiens à remercier tout particulièrement Christophe \textsc{Casseau} pour l'intérêt qu'il a porté dès le début à ce travail et les suggestions qu'il m'a faites, ainsi que plus récemment Derek \textsc{O'Connor} pour ses conseils et pour les échanges constructifs que nous avons eus. J'adresse également mes remerciements à Andrew \textsc{Parsloe} pour la relecture et les corrections apportées à la traduction de ce manuel en anglais.
\section{Fonctionnalités courantes}
-Il faut noter tout d'abord qu'à l'intérieur d'un tableau sous environnement \ST, les caractères \og\verb=:=\fg{} et \og\verb=;=\fg{} perdent leur code de catégorie actif qui leur a été attribué si vous utilisez l'option \falseverb{frenchb} du package \falseverb{babel}. Par conséquent, l'espace automatique inséré avant ces caractères sera désactivé dans un tableau.
+Il faut noter tout d'abord qu'à l'intérieur d'un tableau sous environnement \ST, les caractères «\verb=:=», «\verb=;=», «\verb|!|» et «\verb|?|» perdent leur code de catégorie actif qui leur a été attribué si vous utilisez l'option \falseverb{french} du package \falseverb{babel}. Par conséquent, l'espace automatique inséré avant ces caractères sera désactivé dans un tableau.
\label{STeol}Par défaut, \ST considère qu'une ligne se termine avec ``\verb-\\-'' qui est habituel dans les tableaux. Ce marqueur de fin de ligne peut être modifié via la commande \verbinline-\STeol{<macro>}-. On peut par exemple écrire \verbinline-\STeol{\tabularnewline}-. Il faut bien comprendre que les fins de lignes qui seront insérées dans le tableau final seront toujours ``\verb-\\-'', même si le marqueur de fin de ligne lorsque \ST \emph{lit} le tableau a été modifié.
@@ -188,7 +201,7 @@
\item la colonne est une lettre de \falseverb a à \falseverb z, \falseverb a représentant la 1\iere{} colonne de gauche : on est donc d'emblée limité à 26 colonnes, ce qui devrait suffire pour la grande majorité des cas; la lettre est insensible à la casse, elle peut donc être indifféremment minuscule ou majuscule;
\item à la suite immédiate de la lettre, un nombre entier strictement positif représente le numéro de la ligne, la ligne numéro 1 étant la ligne du haut.
\end{itemize}
-Une référence absolue s'écrit donc par exemple : \og\falseverb{b4}\fg{}, \og\falseverb{C1}\fg{} ou \og\falseverb{d13}\fg\footnote{Cette notation se retrouve dans les tableurs : la lettre représente la colonne et le nombre qui suit représente la ligne. Cet ordre est le contraire de la convention utilisée avec les matrices en mathématiques.}. Visuellement, on peut illustrer ce fonctionnement par ce genre de tableau ressemblant à un tableur, ici volontairement limité à 5 lignes et 5 colonnes :
+Une référence absolue s'écrit donc par exemple : «\falseverb{b4}», «\falseverb{C1}» ou «\falseverb{d13}»\footnote{Cette notation se retrouve dans les tableurs : la lettre représente la colonne et le nombre qui suit représente la ligne. Cet ordre est le contraire de la convention utilisée avec les matrices en mathématiques.}. Visuellement, on peut illustrer ce fonctionnement par ce genre de tableau ressemblant à un tableur, ici volontairement limité à 5 lignes et 5 colonnes :
\begin{center}
\begin{OOocalc}[6em]{5}
&&&&\\&&&&\\&&&&\\&&&&\\&&&&\\
@@ -241,9 +254,9 @@
\end{minipage}%
\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 \og relatives\fg{} 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.
+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 \og\verbinline-matrix-\fg{} 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{http://www.ctan.org/tex-archive/macros/latex/required/amslatex/math/}{\texttt{\textbf{amsmath}}} est utilisé :\par\nobreak
\begin{minipage}{0.82\linewidth}
\begin{lstlisting}
$
@@ -275,7 +288,7 @@
On peut utiliser dans une même formule un mélange de références absolues et relatives.
\subsection{Cellules de texte}
-Si l'on veut mettre du texte dans une cellule, il faut indiquer à \ST que la cellule ne doit pas être calculée. Il suffit de placer quelque part dans la cellule le caractère \og\falseverb @\fg{}. Ce faisant, la cellule est ignorée par \ST et devient une cellule inerte à qui il n'est pas possible\footnote{Il y a une exception à cette règle, voir la page \protect\pageref{datetonum}.} de faire référence nulle part ailleurs dans le tableau.
+Si l'on veut mettre du texte dans une cellule, il faut indiquer à \ST que la cellule ne doit pas être calculée. Il suffit de placer quelque part dans la cellule le caractère «\falseverb @». Ce faisant, la cellule est ignorée par \ST et devient une cellule inerte à qui il n'est pas possible\footnote{Il y a une exception à cette règle, voir la page \protect\pageref{datetonum}.} de faire référence nulle part ailleurs dans le tableau.
Voici un exemple :\par\nobreak
\begin{lstlisting}
@@ -292,24 +305,24 @@
@ $f(x)=2x$ & 2*[0,-1] & 2*[0,-1] & 2*[0,-1] \\\hline
\end{spreadtab}
\end{center}
-Le caractère \og\falseverb @\fg{} est le développement de la séquence de contrôle \verbinline=\STtextcell=. On peut donc redéfinir cette séquence de contrôle en ce que l'on veut et par exemple, \verbinline-\renewcommand\STtextcell{`}- fera qu'une cellule contenant le caractère ``\verb=`='' sera comprise comme étant une cellule de texte.
+Le caractère «\falseverb @» est le développement de la séquence de contrôle \verbinline=\STtextcell=. On peut donc redéfinir cette séquence de contrôle en ce que l'on veut et par exemple, \verbinline-\renewcommand\STtextcell{`}- fera qu'une cellule contenant le caractère ``\verb=`='' sera comprise comme étant une cellule de texte.
De plus, si une cellule est vide ou entièrement constituée d'espaces, alors \ST la considérera comme une cellule de texte.
\subsection{Cellules mixtes}
-En réalité, chaque cellule est composée de \emph{deux} champs. D'un côté le \emph{champ numérique} qui contient la formule et de l'autre le \emph{champ textuel} qui sera ignoré par \falseverb{fp} et n'entre pas en ligne de compte pour les calculs :
+En réalité, chaque cellule est composée de \emph{deux} champs. D'un côté le \emph{champ numérique} qui contient la formule et de l'autre le \emph{champ textuel} qui sera ignoré par le moteur de calcul et n'entre pas en ligne de compte pour les calculs :
\begin{itemize}
\item dans une cellule, si rien n'est précisé, la totalité de la cellule est considérée comme étant le champ numérique, et le champ textuel est vide (c'était le cas pour toutes les cellules du tableau du triangle de Pascal vu précédemment);
- \item si la cellule contient \og\falseverb{@}\fg{}, alors la totalité de la cellule est considérée comme étant le champ textuel. Le champ numérique est vide et inaccessible.
- \item si la cellule contient \og\verb-:=-\fg, alors l'argument entre accolades qui suit est le champ numérique, et tout le reste est le champ textuel. La cellule a cette structure :\par\smallskip
+ \item si la cellule contient «\falseverb{@}», alors la totalité de la cellule est considérée comme étant le champ textuel. Le champ numérique est vide et inaccessible.
+ \item si la cellule contient «\verb-:=-», alors l'argument entre accolades qui suit est le champ numérique, et tout le reste est le champ textuel. La cellule a cette structure :\par\smallskip
\hfil\verb-<champ textuel>:={champ numérique}<suite du champ textuel>-\hfil\null\par\smallskip
- On peut changer ce marqueur en la séquence de contrôle \og\verb-\=-\fg{} par exemple, en redéfinissant la macro \verbinline-\STnumericfieldmarker- de cette façon :\par\smallskip{\centering
+ On peut changer ce marqueur en la séquence de contrôle «\verb-\=-» par exemple, en redéfinissant la macro \verbinline-\STnumericfieldmarker- de cette façon :\par\smallskip{\centering
\verbinline-\renewcommand\STnumericfieldmarker{\=}-\par\smallskip}
Dans ce cas, le développement de \verb-\=- n'aurait strictement aucune importance et n'interviendrait pas dans le processus : pour \ST, il ne s'agit que d'un marqueur de début de formule qui est cherché et reconnu sans être développé.
\end{itemize}
-Une fois le \og\verb-champ numérique-\fg{} calculé, lui seul et le marqueur \og\verb-:=-\fg{} seront remplacés par la valeur numérique calculée.
+Une fois le «\verb-champ numérique-» calculé, lui seul et le marqueur «\verb-:=-» seront remplacés par la valeur numérique calculée.
-Il faut noter que \og\verb-:={champ numérique}-\fg{} peut se trouver à l'intérieur d'accolades et ce quelque soit le niveau d'imbrication. Par exemple, dans une cellule, on peut écrire \verb-\textbf{:={a1+1}}-. Si le champ numérique de la cellule \falseverb{a1} est 5, alors la cellule contiendra au final \verb-\textbf{6}-.
+Il faut noter que «\verb-:={champ numérique}-» peut se trouver à l'intérieur d'accolades et ce quelque soit le niveau d'imbrication. Par exemple, dans une cellule, on peut écrire \verb-\textbf{:={a1+1}}-. Si le champ numérique de la cellule \falseverb{a1} est 5, alors la cellule contiendra au final \verb-\textbf{6}-.
Pour fixer les idées, voici un exemple très simple :\par\nobreak
\begin{lstlisting}
@@ -322,7 +335,7 @@
valeur 1 : :={50} & valeur 2 : :={29} & moyenne : \textbf{:={(a1+b1)/2}}\\\hline
\end{spreadtab}
\end{center}
-À noter également que \og\verb-:={}-\fg{}, qui définit formule vide, a le même effet que \og\verb- at -\fg dans une cellule : celle-ci est comprise comme cellule de texte. Cependant, \og\verb- at -\fg et \og\verb-:={}-\fg{} \emph{ne sont pas équivalents} car une cellule textuelle contenant ce dernier peut recevoir une formule par copie (voir section suivante), ce qui est impossible avec \og\verb- at -\fg.
+À noter également que «\verb-:={}-», qui définit formule vide, a le même effet que «\verb- at -» dans une cellule : celle-ci est comprise comme cellule de texte. Cependant, «\verb- at -» et «\verb-:={}-» \emph{ne sont pas équivalents} car une cellule textuelle contenant ce dernier peut recevoir une formule par copie (voir section suivante), ce qui est impossible avec «\verb- at -».
\subsection{Copier des formules}
Pour éviter d'avoir à recopier des formules identiques dans des cellules voisines, \ST fournit l'instruction \verbinline-\STcopy-.
@@ -331,13 +344,13 @@
\begin{center}
\verbinline-\STcopy{>-$x$\verbinline-,v-$y$\verbinline-}{formule}-
\end{center}
-où $x$ et $y$ sont des nombres positifs qui représentent des décalages horizontaux et verticaux par rapport à la cellule où se trouve l'instruction. La cellule qui contient la commande et la cellule obtenue par ces décalages définissent une plage rectangulaire de cellules qui recevront la \verb-<formule>-\footnote{La copie ne peut donc se faire que vers des cellules se trouvant à droite et plus bas que la cellule dans laquelle se trouve la commande.}. La commande \verbinline-\STcopy -\emph{ne doit pas} se trouver dans une cellule où un marqueur de champ numérique \og\verb-:=-\fg{} est présent.
+où $x$ et $y$ sont des nombres positifs qui représentent des décalages horizontaux et verticaux par rapport à la cellule où se trouve l'instruction. La cellule qui contient la commande et la cellule obtenue par ces décalages définissent une plage rectangulaire de cellules qui recevront la \verb-<formule>-\footnote{La copie ne peut donc se faire que vers des cellules se trouvant à droite et plus bas que la cellule dans laquelle se trouve la commande.}. La commande \verbinline-\STcopy -\emph{ne doit pas} se trouver dans une cellule où un marqueur de champ numérique «\verb-:=-» est présent.
Voici comment se déroule la copie : elle se fait en partant de la cellule où se trouve l'instruction, la cellule source. Pour chaque cellule cible, toutes les références dans la formule sont incrémentées pour tenir compte du décalage entre la cellule cible et la cellule source. Ainsi par exemple, mettons que la cellule source contienne la formule \verb-a1+b2+c3-. Lorsque cette formule est copiée dans une cellule cible se trouvant 2 colonnes à droite et 5 lignes en dessous, cette formule deviendra : \verb-c6+d7+e8-. La formule peut également contenir des références relatives qui, puisqu'elle sont relatives, ne seront pas modifiées.
-En faisant précéder d'un \og\verb-!-\fg une coordonnée d'une référence, cette coordonnée reste inchangée lors de la copie. Reprenons l'exemple précédent avec la formule \verb-a!1+!b2+!c!3-. Si cette formule est copiée dans la cellule se trouvant 2 colonnes à droite et 5 lignes en dessous, alors, elle deviendra : \verb-c1+b7+c3-. Cette fonctionnalité est compatible avec des références relatives : mettons qu'une cellule contienne la formule \verb|[-1,!-1]+[!-1,1]+[!1,!2]| et que cette formule soit copiée vers la cellule se trouvant 2 colonnes à droite et 5 lignes en dessous. Alors, elle deviendra : \verb|[-1,-6]+[-3,1]+[-1,-3]|.
+En faisant précéder d'un «\verb-!-» une coordonnée d'une référence, cette coordonnée reste inchangée lors de la copie. Reprenons l'exemple précédent avec la formule \verb-a!1+!b2+!c!3-. Si cette formule est copiée dans la cellule se trouvant 2 colonnes à droite et 5 lignes en dessous, alors, elle deviendra : \verb-c1+b7+c3-. Cette fonctionnalité est compatible avec des références relatives : mettons qu'une cellule contienne la formule \verb|[-1,!-1]+[!-1,1]+[!1,!2]| et que cette formule soit copiée vers la cellule se trouvant 2 colonnes à droite et 5 lignes en dessous. Alors, elle deviendra : \verb|[-1,-6]+[-3,1]+[-1,-3]|.
-Le caractère \og\verb-!-\fg est le développement de la séquence de contrôle \verbinline-\STtransposecar-. On peut donc modifier ce caractère en tout autre avec \verbinline-\renewcommand\STtransposecar-\verb-{<caractère>}-. Le point d'exclamation, utilisé par défaut, garde son code de catégorie actif qui lui a été attribué par le package \verb-babel- chargé avec l'option \verb-frenchb-.
+Le caractère «\verb-!-» est le développement de la séquence de contrôle \verbinline-\STtransposecar-. On peut donc modifier ce caractère en tout autre avec \verbinline-\renewcommand\STtransposecar-\verb-{<caractère>}-. Le point d'exclamation, utilisé par défaut, garde son code de catégorie actif qui lui a été attribué par le package \verb-babel- chargé avec l'option \verb-frenchb-.
Dans la syntaxe \verbinline-\STcopy{>-$x$\verbinline-,v-$y$\verbinline-}{formule}-, si le nombre $x$ est absent, la copie dans le sens horizontal se fait vers la droite jusqu'au bord droit du tableau. Si $y$ est absent, la copie dans le sens vertical se fait jusqu'en bas du tableau.
@@ -388,7 +401,7 @@
Lors d'une copie de formule, si la cellule cible contient déjà un champ numérique non vide, celui-ci n'est pas écrasé et la copie ne se fait pas.
-Si des commandes \verbinline-\STcopy- se trouvant danns des plusieurs cellules départ ont une même cellule cible, la formule que cette dernière reçoit est celle correspondant à la dernière commande \verbinline-\STcopy- rencontrée lorsque le tableau est lu de haut en bas et de droite à gauche. Dans l'exemple visuel ci-dessous, le \verbinline-\STcopy- se trouvant dans la cellule rose \falseverb{B1} a son champ cible partiellement recouvert par celui du \verbinline-\STcopy- se trouvant dans la cellule verte \falseverb{C3}. En effet, cette dernière est rencontrée plus tard lors de la lecture du tableau :
+Si des commandes \verbinline-\STcopy- se trouvant dans des plusieurs cellules départ ont une même cellule cible, la formule que cette dernière reçoit est celle correspondant à la dernière commande \verbinline-\STcopy- rencontrée lorsque le tableau est lu de haut en bas et de droite à gauche. Dans l'exemple visuel ci-dessous, le \verbinline-\STcopy- se trouvant dans la cellule rose \falseverb{B1} a son champ cible partiellement recouvert par celui du \verbinline-\STcopy- se trouvant dans la cellule verte \falseverb{C3}. En effet, cette dernière est rencontrée plus tard lors de la lecture du tableau :
\begin{center}
\begin{OOocalc}[2.3cm]{6}
1 &\CC{palepink}\ttfamily\textbackslash STcopy \{v,>\}\{!a1+1\} &\CC{lightpink} &\CC{lightpink} &\CC{lightpink} &\CC{lightpink} \\
@@ -398,7 +411,7 @@
5 &\CC{lightpink} &\CC{lightpink} &\CC{lightpink} &\CC{lightpink} &\CC{lightpink}~\par~ \\
\end{OOocalc}
\end{center}
-Voici cet exemple repris ci-dessous pour mettre en évidence ces comportements. Dans cet exemple, la celule \verb-b5- qui est composée d'un champ numérique et la cellule \verb-c5- qui est mixte, leur champ numérique n'étant pas vide, il est conservé.
+Voici cet exemple repris ci-dessous pour mettre en évidence ces comportements. Dans cet exemple, la cellule \verb-b5- qui est composée d'un champ numérique et la cellule \verb-c5- qui est mixte, leur champ numérique n'étant pas vide, il est conservé.
\begin{lstlisting}
\begin{spreadtab}{{tabular}{|*6{c|}}}\hline
1 &\STcopy{v,>}{!a1+1} & & & & \\\hline
@@ -417,7 +430,7 @@
5 & -1 & a:={0}b & & & \\\hline
\end{spreadtab}
\end{center}
-Comme on l'a dit à la fin du chapitre précédent, on peut également copier une formule dans une cellule de texte contenant un champ numérique vide (c'est-à-dire une cellule contenant \og\verb-:={}-\fg). Dans ce cas, la formule est copiée à l'endroit où se trouve \og\verb-:={}-\fg. Par contre, dans une cellule de texte contenant \og\verb- at -\fg, la copie ne se fait pas et la cellule reste purement textuelle.
+Comme on l'a dit à la fin du chapitre précédent, on peut également copier une formule dans une cellule de texte contenant un champ numérique vide (c'est-à-dire une cellule contenant «\verb-:={}-»). Dans ce cas, la formule est copiée à l'endroit où se trouve «\verb-:={}-». Par contre, dans une cellule de texte contenant «\verb- at -», la copie ne se fait pas et la cellule reste purement textuelle.
Exemple :
\begin{lstlisting}
@@ -435,7 +448,7 @@
\section{Mise en forme du tableau}
\subsection{Séparateur décimal}
-Le package \verb-fp- renvoie ses résultats décimaux avec le point comme séparateur décimal. Il est possible de changer ce séparateur décimal de telle sorte que tout se passe comme si les résultats retournés par \verb-fp- en tenaient compte. L'instruction \verbinline-\STsetdecimalsep- permet de changer le séparateur décimal en n'importe quel caractère en utilisant la syntaxe :
+Les packages \fp et \xfp renvoient les résultats décimaux avec le point comme séparateur décimal. Il est possible de changer ce séparateur décimal de telle sorte que tout se passe comme si les résultats retournés par \fp ou \xfp en tenaient compte. L'instruction \verbinline-\STsetdecimalsep- permet de changer le séparateur décimal en n'importe quel caractère en utilisant la syntaxe :
\begin{center}
\verbinline-\STsetdecimalsep-\verb-{<caractère>}-
\end{center}
@@ -494,16 +507,16 @@
\end{spreadtab}
\end{minipage}
-\subsection{Mise en forme des nombres}
-Comme cela a été précisé, 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 \og\falseverb{a1+b1}\fg{} est équivalente aux formules postfixes \og\falseverb{a1 b1 add}\fg{} ou \og\falseverb{a1 b1 +}\fg.}. 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.
+\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
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 demander à \verb=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.
+ \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}
-Voici un exemple simple des nombres de 1 à 7 et leurs inverses, arrondis à $10^{-6}$ :\par\nobreak
+Voici un exemple, des nombres de 1 à 7 et leurs inverses sont arrondis à $10^{-6}$ :\par\nobreak
\begin{lstlisting}
\STautoround{6}
\begin{spreadtab}{{tabular}{|l|*7{>{\centering\arraybackslash}m{1.35cm}|}}}
@@ -557,7 +570,7 @@
\end{spreadtab}
\end{center}
-Voici un autre exemple similaire où l'on teste si le nombre à afficher est négatif avec la commande \verbinline-\FPifneg- du package \verb-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.
+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}}
@@ -569,13 +582,13 @@
\end{lstlisting}
\begin{center}
\STsetdecimalsep{.}
-\renewcommand\STprintnum[1]{\FPifneg{#1}\color{red}\fi\numprint{#1}}
+\renewcommand\STprintnum[1]{\STifneg{#1}\color{red}\fi\numprint{#1}}
\STautoround{6}
\begin{spreadtab}{{tabular}{cccccccc}}
@$x$ & -1 & 2 & -3 & 4 & -5 & 6 & -7 \\\hline
@$1/x$ &1/b1&1/c1&1/d1&1/e1&1/f1&1/g1&1/h1
\end{spreadtab}
-\end{center}
+\end{center}\STusexfp
\subsection{Retours à la ligne et filets horizontaux}
Pour bien délimiter la fin d'une ligne, \ST est contraint de reconnaître les retours à la ligne et les filets horizontaux. Ce package permet d'utiliser dans le tableau l'argument optionnel de \verb-\\- de cette façon : \verb-\\[<dimension>]-.
@@ -757,7 +770,7 @@
\multicolumn{2}{|K{1}}{:=8}&\multicolumn{2}{|K{1}}{:=7}&\multicolumn{2}{|K{1}|}{:=6}\\\hline
\end{spreadtab}
\end{center}
-On remarque que le marqueur de champ numérique \og\falseverb{:=}\fg{} est nécessaire dans chaque cellule où se trouve la commande \verbinline-\multicolumn-. On comprend en effet que si ce marqueur n'existait pas, la totalite de la cellule, c'est-à-dire \verb-\multicolumn{2}{|c|}{<formule>}- serait considérée comme étant une formule.
+On remarque que le marqueur de champ numérique «\falseverb{:=}» est nécessaire dans chaque cellule où se trouve la commande \verbinline-\multicolumn-. On comprend en effet que si ce marqueur n'existait pas, la totalite de la cellule, c'est-à-dire \verb-\multicolumn{2}{|c|}{<formule>}- serait considérée comme étant une formule.
\section{Macro-fonctions}
L'extension \falseverb{fp} fournit un nombre conséquent d'opérations et de fonctions. Malgré tout, dans le cadre d'un package comme \ST, celles-ci peuvent être insuffisantes et il est possible au programmeur averti d'écrire des macro-fonctions supplémentaires en utilisant celles fournies par \falseverb{fp}. Cette section présente les macro-fonctions pour l'instant disponibles\footnote{Bien d'autres restent à écrire ! Elles seront disponibles dans des versions futures de \ST.}. Il y aura plus de précisions sur la méthode pour programmer des macro-fonctions dans la prochaine version de ce manuel.
@@ -764,13 +777,13 @@
\subsection{Macro-fonctions mathématiques}
\subsubsection{Sommer des cellules}
-La fonction \og\verbinline=sum=\fg permet de faire la somme d'une ou plusieurs plages de cellules.
+La fonction «\verbinline=sum=» permet de faire la somme d'une ou plusieurs plages de cellules.
Elle s'utilise ainsi : \verbinline=sum(<plage 1>;<plage 2>;...;<plage n>)=, où une plage de cellules est :
\begin{itemize}
- \item soit une cellule isolée comme \og\falseverb{a1}\fg{} ou \og\falseverb{[2,1]}\fg{};
- \item soit une zone rectangulaire délimitée par la cellule supérieure gauche et inférieure droite de cette façon : \og\verb=<cellule 1>:<cellule 2>=\fg, à condition que \og\verb=<cellule 1>=\fg se trouve \emph{avant} \og\verb=<cellule 2>=\fg{} lorsqu'on parcourt le tableau de haut en bas, de gauche à droite.\par
- Voici des exemple de plages de cellules : \og\falseverb{a2:d5}\fg{}, \og\falseverb{[-1,-1]:[2,3]}\fg{}, \og\falseverb{b4:[5,1]}\fg{}.
+ \item soit une cellule isolée comme «\falseverb{a1}» ou «\falseverb{[2,1]}»;
+ \item soit une zone rectangulaire délimitée par la cellule supérieure gauche et inférieure droite de cette façon : «\verb=<cellule 1>:<cellule 2>=», à condition que «\verb=<cellule 1>=» se trouve \emph{avant} «\verb=<cellule 2>=» lorsqu'on parcourt le tableau de haut en bas, de gauche à droite.\par
+ Voici des exemple de plages de cellules : «\falseverb{a2:d5}», «\falseverb{[-1,-1]:[2,3]}», «\falseverb{b4:[5,1]}».
\end{itemize}
Dans les plages de cellules, les cellules vides ou ne contenant que du texte sont considérées comme contenant le nombre 0. Il en est de même pour les cellules masquée car fusionnées par \verbinline-\multicolumn-.
@@ -800,7 +813,7 @@
\end{minipage}%
\subsubsection{Macro-fonction \ttfamily fact}
-La macro-fonction \verbinline=fact(<nombre>)= permet de calculer la factorielle de son argument, sous réserve que celui-ci soit un entier compris entre 0 et 18 inclus pour éviter des débordements\footnote{En effet, pour \falseverb{fp} le plus grand entier est $10^{18}-1$. La factorielle de 19 dépasse ce nombre.}. 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://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.
Voici les factorielles de 0 à 8 :\par\nobreak
\begin{lstlisting}
@@ -839,9 +852,12 @@
De la même façon que pour la macro-fonction \verbinline-sum-, les cellules de texte, vides ou fusionnées par un \verbinline-\multicolumn- sont considérées comme contenant le nombre 0.
\subsubsection{Nombres aléatoires}
-Les macro-fonctions \verbinline-randint- et \verbinline-rand- renvoient un nombre aléatoire.
+\verbinline-randint- et \verbinline-rand- renvoient un nombre aléatoire, respectivement entier entre bornes et décimal entre 0 et 1.
-À noter : la \og graine\fg{} qui initialise la suite aléatoire dépend de la date ainsi que de la la minute à laquelle est faite la compilation. Les séries aléatoires données par cette fonction changeront entre deux compilations faites à des heures dont les minutes diffèrent. Si l'on veut vraiment avoir des nombres aléatoires indépendant du moment de compilation et donc reproductibles, il faut neutraliser la macro interne \verb-\ST at seed- et définir une graine pour \verb-fp- :\par\nobreak
+\paragraph{Nombres aléatoires avec le moteur \fp}
+Avec ce moteur, \verbinline-randint- et \verbinline-rand- sont des \emph{macro fonctions} de \ST qui s'appuient sur la macro \verb|\FPrandom| de \fp.
+
+À noter : la «graine» qui initialise la suite aléatoire dépend de la date ainsi que de la la minute à laquelle est faite la compilation. Les séries aléatoires données par cette fonction changeront entre deux compilations faites à des heures dont les minutes diffèrent. Si l'on veut vraiment avoir des nombres aléatoires indépendant du moment de compilation et donc reproductibles, il faut neutraliser la macro interne \verb-\ST at seed- et définir une graine pour \fp :\par\nobreak
\begin{lstlisting}[backgroundcolor=\color{ST at codebckgcolor}]
\makeatletter
\renewcommand\ST at seed{}% redefinit la macro interne
@@ -853,6 +869,7 @@
La macro fonction \verbinline-rand()- renvoie un nombre aléatoire décimal compris entre 0 et 1 :\par\nobreak
\begin{lstlisting}
\STautoround{6}
+\STusefp
\begin{spreadtab}{{tabular}{|l|cccc|}}\hline
@nombres dans [0;1] &rand() &rand() &rand() &rand() \\
@nombres dans [-5;5] &randint(-5,5) &randint(-5,5) &randint(-5,5) &randint(-5,5)\\
@@ -859,9 +876,11 @@
@nombres dans [0;20] &randint(20) &randint(20) &randint(20) &randint(20) \\
\hline
\end{spreadtab}
+\STusexfp
\end{lstlisting}
\begin{center}
\STautoround{6}
+\STusefp
\begin{spreadtab}{{tabular}{|l|cccc|}}\hline
@nombres dans [0;1] &rand() &rand() &rand() &rand() \\
@nombres dans [-5;5] &randint(-5,5) &randint(-5,5) &randint(-5,5) &randint(-5,5)\\
@@ -868,8 +887,35 @@
@nombres dans [0;20] &randint(20) &randint(20) &randint(20) &randint(20) \\
\hline
\end{spreadtab}
+\STusexfp
\end{center}
+\paragraph{Nombres aléatoires avec le moteur \xfp}
+Avec ce moteur, \verbinline-randint- et \verbinline-rand- sont des fonctions reconnues nativement par \xfp. Un avertissement sera émis si \XeLaTeX{} est utilisé dans une version trop ancienne qui n'implémente pas les primitives de génération de nombres pseudo-aléatoires; dans ce cas, utiliser les fonctions \verbinline-randint- et \verbinline-rand- ne sera pas possible et conduira à des erreurs de compilation.
+
+Comme le spécifie la documentation de \href{http://mirrors.ctan.org/macros/latex/contrib/l3kernel/interface3.pdf}{\texttt{\textbf{interface3}}}, la fonction \verbinline|randint(<a>,<b>)| produit un entier aléatoire entre les deux arguments, mais si \verb|<a>| est omis, \verbinline|randint(<b>)| produit un entier entre {\color{red}\bfseries1} et \verb|<b>| ce qui constitue un comportement différent de la macro fonction \verbinline-randint- de \ST utilisée avec \fp qui produit un entier entre {\color{red}\bfseries0} et \verb|<b>|.\STusexfp
+
+\begin{lstlisting}
+\STautoround{6}
+\STusexfp
+\begin{spreadtab}{{tabular}{|l|cccc|}}\hline
+ at nombres dans [0;1] &rand() &rand() &rand() &rand() \\
+ at nombres dans [-5;5] &randint(-5,5) &randint(-5,5) &randint(-5,5) &randint(-5,5)\\
+ at nombres dans [0;20] &randint(20) &randint(20) &randint(20) &randint(20) \\
+\hline
+\end{spreadtab}
+\end{lstlisting}
+\begin{center}
+\STautoround{6}
+\STusexfp
+\begin{spreadtab}{{tabular}{|l|cccc|}}\hline
+ at nombres dans [0;1] &rand() &rand() &rand() &rand() \\
+ at nombres dans [-5;5] &randint(-5,5) &randint(-5,5) &randint(-5,5) &randint(-5,5)\\
+ at nombres dans [1;20] &randint(20) &randint(20) &randint(20) &randint(20) \\
+\hline
+\end{spreadtab}
+\end{center}
+
\subsubsection{PGCD et PPCM}
Les macros fonctions "gcd" et "lcm" permettent de calculer le Plus Grand Commun Diviseur (PGCD) et le Plus Petit Commun Multiple (PPCM) des nombres passés en arguments et séparés par des virgules :
\begin{center}
@@ -897,7 +943,7 @@
\end{center}
\subsubsection{Écriture scientifique}
-La macro fonction "scitodec" permet de convertir un nombre écrit en écriture scientifique en nombre décimal compréhensible par \ST pour faire ses calculs. La syntaxe est \verbinline-scitodec(<texte>)-, où le \verb-<texte>- est :
+La macro fonction "scitodec" permet de convertir un nombre écrit en écriture scientifique en nombre décimal. La syntaxe est \verbinline-scitodec(<texte>)-, où le \verb-<texte>- est :
\begin{enumerate}[label=--]
\item une suite de caractères se présentant sous la syntaxe \verb-<mantisse>EE<exposant>-, où la \verb-<mantisse>- est un nombre décimal et l'\verb->exposant>- est un entier relatif. Les "E" peuvent être écrit en majuscule ou minuscule.
@@ -928,8 +974,10 @@
\end{spreadtab}
\end{center}
+Le moteur \xfp est comprend nativement les nombres écrits en notation scientifique sous la forme \verb|<a>e<b>| mais l'utilisation de cette syntaxe est \emph{impossible} à utiliser avec \ST car le nombre \verb|4e3|, qui est 4000, serait compris par \ST comme 4 suivi du contenu de la cellule \verb|e3|.
+
\subsubsection{Identité}
-La plus simple des macros fonctions est \og\verbinline=id(<nombre>)=\fg. Celle-ci renvoie le nombre qui se trouve entre parenthèses. Mathématiquement, elle ne sert pas à grand chose, mais avec \ST, elle permet de passer des expressions mathématiques à des macros qui n'en admettent pas. On peut ainsi s'en servir dans les plages de cellules de \verbinline=sum= par exemple.
+La plus simple des macros fonctions est «\verbinline=id(<nombre>)=». Celle-ci renvoie le nombre qui se trouve entre parenthèses. Mathématiquement, elle ne sert pas à grand chose, mais avec \ST, elle permet de passer des expressions mathématiques à des macros qui n'en admettent pas. On peut ainsi s'en servir dans les plages de cellules de \verbinline=sum= par exemple.
Dans le code ci dessous, la macro \verbinline=id= est utilisée pour déterminer la plage de cellules à additionner avec \verbinline-sum-. Dans cet exemple, la valeur du champ numérique de la cellule a2 vaut 8. Et donc, "\verbinline=sum([0,-1]:[id(a2-1),-1])/a2=" est équivalent à \verbinline=sum([0,-1]:[7,-1])/8= :
@@ -947,7 +995,7 @@
\end{center}
\subsection{Macro-fonctions de test}
-Elles sont au nombre de 3 et ont la syntaxe suivante :\par\nobreak
+Comme \fp et sa macro \verb|\FPeval| n'admet pas de test dans son argument, 3 macro-fonctions de test sont disponibles (elles sont moins intéressantes pour \xfp qui dispose de l'opérateur «\verb|?:|», voir plus bas) :\par\nobreak
\begin{center}
\verbinline=ifeq(nombre1,nombre2,nombre3,nombre4)=\par
\verbinline=ifgt(nombre1,nombre2,nombre3,nombre4=\par
@@ -993,10 +1041,36 @@
[0,-1]+0.5 & iflt([-1,0],1,10,ifeq([-1,0],1,0,-10))\\\hline
\end{spreadtab}
\end{center}
+Le moteur \xfp et son opérateur ternaire \verb|<a>?<b>:<c>| rend les tests plus faciles dans les expressions évaluées : si le test \verb|<a>| est vrai, \verb|<b>| est retenu sinon, c'est \verb|<c>|. Ainsi, l'imbrication de tests ci-dessus se programme :
+\begin{lstlisting}
+\begin{spreadtab}{{tabular}{|*2c|}}\hline
+@$x$ & @$f(x)$ \\\hline
+-0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\\hline
+\end{spreadtab}
+\end{lstlisting}
+\begin{center}
+\begin{spreadtab}{{tabular}{|*2c|}}\hline
+@$x$ & @$f(x)$ \\\hline
+-0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
+[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\\hline
+\end{spreadtab}
+\end{center}
+
\subsection{Macro-fonctions de date}
\subsubsection{Convertir une date en nombre avec \ttfamily frshortdatetonum}\label{datetonum}
-La macro \verbinline-frshortdatetonum- permet de convertir une date de la forme 14/7/1789 en un nombre qui est en fait le nombre de jours écoulés depuis le 1\ier{} mars de l'an 0\footnote{Cet \og an 0\fg{} n'existe d'ailleurs pas, mais cela ne devrait pas être gênant pour les dates contemporaines}. Il est important de noter que cette macro-fonction requiert un argument \emph{textuel} et non pas un nombre ou le résultat d'un calcul mathématique. Par conséquent, si l'argument de cette macro-fonction fait référence à une cellule, cette cellule \emph{doit} être une cellule textuelle, c'est à dire contenant \og\verb- at -\fg{} ou \og\verb-:={}-\fg{}
+La macro \verbinline-frshortdatetonum- permet de convertir une date de la forme 14/7/1789 en un nombre qui est en fait le nombre de jours écoulés depuis le 1\ier{} mars de l'an 0\footnote{Cet «an 0» n'existe d'ailleurs pas, mais cela ne devrait pas être gênant pour les dates contemporaines}. Il est important de noter que cette macro-fonction requiert un argument \emph{textuel} et non pas un nombre ou le résultat d'un calcul mathématique. Par conséquent, si l'argument de cette macro-fonction fait référence à une cellule, cette cellule \emph{doit} être une cellule textuelle, c'est à dire contenant «\verb- at -» ou «\verb-:={}-»
Dans l'exemple ci-dessous, les deux premières lignes montrent que la cellule de gauche contient une date, et la cellule de droite fait référence à cette date pour calculer le nombre correspondant. La troisième ligne montre dans la cellule de gauche la date 0, mais surtout calcule dans la cellule de droite le nombre correspondant à la date \emph{d'aujourd'hui}, en transformant en nombre les compteurs de \TeX{} \verbinline-\day-, \verbinline-\month- et \verbinline-\year- qui contiennent les numéros des jours, mois et année courants.\par\nobreak
\begin{lstlisting}
@@ -1013,7 +1087,7 @@
frshortdatetonum(1/3/0) & frshortdatetonum(\number\day/\number\month/\number\year)
\end{spreadtab}
\end{center}
-Une autre macro-fonction existe, elle transforme une date longue du type \og 25 décembre 1789\fg{} en un nombre. L'argument peut aussi être la séquence de contrôle \verbinline-\today- si l'on a pris le soin de charger l'extension \verb-babel- avec l'option \verb-frenchb-.\par\nobreak
+Une autre macro-fonction existe, elle transforme une date longue du type «25 décembre 1789» en un nombre. L'argument peut aussi être la séquence de contrôle \verbinline-\today- si l'on a pris le soin de charger l'extension \verb-babel- avec l'option \verb-frenchb-.\par\nobreak
\begin{lstlisting}[escapechar=Z]
\begin{spreadtab}{{tabular}{cc}}
frlongdatetonum(\today) & frlongdatetonum(25 dZéZcembre 2009)\\
@@ -1033,7 +1107,7 @@
Voici ces fonctions :
\begin{itemize}
\item \verbinline-numtofrshortdate- transforme un nombre en une date courte du type 14/7/1789;
- \item \verbinline-numtofrlongdate- transforme un nombre en une date longue du type \og 14 juillet 1789\fg;
+ \item \verbinline-numtofrlongdate- transforme un nombre en une date longue du type «14 juillet 1789»;
\item \verbinline-numtofrmonth- extrait d'un nombre représentant une date le nom du mois correspondant;
\item \verbinline-numtofrday- extrait d'un nombre représentant une date le nom du jour correspondant.
\end{itemize}
@@ -1234,14 +1308,14 @@
\end{center}
Il y a 4 cellules \emph{visibles} fusionnées, on écrira donc \verbinline-\multicolumn{4}- car on ne tient \emph{jamais} compte des colonnes masquées dans le décompte du nombre de cellules à fusionner.
-Maintenant, on compte 4 lettres à partir de la lettre \falseverb{b} en l'incluant dans le décompte. On arrive à la lettre \falseverb{e} : cela détermine un intervalle de colonnes \og\falseverb{b-e}\fg. Dans cet intervalle, 2 colonnes masquées sont incluses (\falseverb c et \falseverb d) et 1 colonne masquée n'est pas comprise (\falseverb f). Ces 2 nombres sont importants pour comprendre la suite, aussi, notons-les $x$ et $y$ dans le cas général.
+Maintenant, on compte 4 lettres à partir de la lettre \falseverb{b} en l'incluant dans le décompte. On arrive à la lettre \falseverb{e} : cela détermine un intervalle de colonnes «\falseverb{b-e}». Dans cet intervalle, 2 colonnes masquées sont incluses (\falseverb c et \falseverb d) et 1 colonne masquée n'est pas comprise (\falseverb f). Ces 2 nombres sont importants pour comprendre la suite, aussi, notons-les $x$ et $y$ dans le cas général.
La règle est la suivante :
\begin{itemize}
- \item il faut rajouter $y$ signes \og\verb-&-\fg{} après le \verbinline-\multicolumn- (pour l'exemple, il en faudrait 1).
- \item les références des colonnes des cellules qui suivent le \verbinline-\multicolumn- seront décalées de $x$ lettres vers le début de l'alphabet. Pour l'exemple donnée, si on veut faire référence à la cellule marquée \og \falseverb{i2}\fg{}, il faudra écrire \falseverb{g2} (au lieu de \falseverb{i2}).
+ \item il faut rajouter $y$ signes «\verb-&-» après le \verbinline-\multicolumn- (pour l'exemple, il en faudrait 1).
+ \item les références des colonnes des cellules qui suivent le \verbinline-\multicolumn- seront décalées de $x$ lettres vers le début de l'alphabet. Pour l'exemple donnée, si on veut faire référence à la cellule marquée «\falseverb{i2}», il faudra écrire \falseverb{g2} (au lieu de \falseverb{i2}).
\end{itemize}
-Voici un vrai exemple dont la structure est similaire au précédent : $x=2$ et $y=1$. Dans le code, remarquer le \og\textcolor{red}{\texttt{\&}}\fg{} qui a été ajouté puisque $y=1$. Par ailleurs, on reste simple avec les formules, on ajoute 1 au nombre du dessus :\par\nobreak
+Voici un vrai exemple dont la structure est similaire au précédent : $x=2$ et $y=1$. Dans le code, remarquer le «\textcolor{red}{\texttt{\&}}» qui a été ajouté puisque $y=1$. Par ailleurs, on reste simple avec les formules, on ajoute 1 au nombre du dessus :\par\nobreak
\begin{lstlisting}[escapechar=Z]
\begin{spreadtab}{{tabular}{|*{7}{c|}}}
\hline
@@ -1380,7 +1454,7 @@
\section{Exemples}
Voici quelques tableaux pour finir !
-Afin que l'on sache quels nombres sont calculés, seuls les nombres non calculés sont en \textcolor{red}{rouge}. Dans ces tableaux, beaucoup d'artifices (des struts, des multicolumn) et des packages (notamment numprint et ses colonnes \og N\fg{} qui alignent les séparateurs décimaux) ont été utilisés pour obtenir un résultat satisfaisant. Le code est parfois lourd et peu lisible, mais il ne s'agit pas ici d'exemples basiques mais de tableaux peaufinés !
+Afin que l'on sache quels nombres sont calculés, seuls les nombres non calculés sont en \textcolor{red}{rouge}. Dans ces tableaux, beaucoup d'artifices (des struts, des multicolumn) et des packages (notamment numprint et ses colonnes «N» qui alignent les séparateurs décimaux) ont été utilisés pour obtenir un résultat satisfaisant. Le code est parfois lourd et peu lisible, mais il ne s'agit pas ici d'exemples basiques mais de tableaux peaufinés !
\subsection{Encore un triangle de Pascal}
\begin{lstlisting}
@@ -1433,7 +1507,7 @@
\renewcommand\STprintnum[1]{\numprint{#1}}
\begin{spreadtab}{{tabular}{cc}}
\multicolumn{2}{c}{Convergence en $x=\color{red}:={0.5}$}\\[1.5ex]
-@$n$ & e^a1\SThidecol & @ $\displaystyle e^{\numprint{<<a1>>}}-\sum_{k=0}^n\frac{\numprint{<<a1>>}^k}{k!}$\\[3ex]\hline
+@$n$ & exp(a1)\SThidecol & @ $\displaystyle e^{\numprint{<<a1>>}}-\sum_{k=0}^n\frac{\numprint{<<a1>>}^k}{k!}$\\[3ex]\hline
\color{red}:={0}& a1^[-1,0]/fact([-1,0]) & \STcopy{v}{b!2-b3}\\
\STcopy{v}{a3+1}& \STcopy{v}{a!1^a4/fact(a4)+b3}& \\
& & \\
@@ -1499,7 +1573,7 @@
\end{center}
\subsection{Tableau de facturation}
-Voici un tableau de facturation, où les séparateurs décimaux sont alignés dans les colonnes grâce au spécificateur de colonne \og N\fg{} du package \falseverb{numprint}.
+Voici un tableau de facturation, où les séparateurs décimaux sont alignés dans les colonnes grâce au spécificateur de colonne «N» du package \falseverb{numprint}.
Ce tableau est généré par l'environnement \verb=tabularx= de façon à occuper 80\% de la largeur de la ligne. La commande \verbinline=\multicolumn= a été largement utilisée pour la mise en forme :\par\nobreak
\begin{lstlisting}
Modified: trunk/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty 2019-02-27 21:55:03 UTC (rev 50146)
+++ trunk/Master/texmf-dist/tex/latex/spreadtab/spreadtab.sty 2019-02-27 21:55:15 UTC (rev 50147)
@@ -1,36 +1,148 @@
+% !TeX encoding = ISO-8859-1
% Ce fichier contient le code de l'extension "spreadtab"
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
\def\STname {spreadtab} %
-\def\STver {0.4d} %
+\def\STver {0.5} %
% %
-\def\STdate {2018/01/01} %
+\def\STdate {2019/02/27} %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% --------------------------------------------------------------------
-% Author : Christian Tellechea
-% Status : Maintained
-% Email : unbonpetit at netc.fr
-% Package URL: https://www.ctan.org/pkg/spreadtab
-% Bug tracker: https://framagit.org/unbonpetit/spreadtab/issues
-% Repository : https://framagit.org/unbonpetit/spreadtab/tree/master
-% Copyright : Christian Tellechea 2009-2018
-% Licence : Released under the LaTeX Project Public License v1.3c
-% or later, see http://www.latex-project.org/lppl.txt
-% Files : 1) spreadtab.sty
-% 2) spreadtab-fr.tex
-% 3) spreadtab-fr.pdf
-% 4) spreadtab-en.tex
-% 5) spreadtab-en.pdf
-% 6) README
-% --------------------------------------------------------------------
+% %
+% Author : Christian Tellechea %
+% Status : Maintained %
+% Maintainer : Christian Tellechea %
+% Email : unbonpetit at netc.fr %
+% Package URL: https://www.ctan.org/pkg/spreadtab %
+% Bug tracker: https://framagit.org/unbonpetit/spreadtab/issues %
+% Repository : https://framagit.org/unbonpetit/spreadtab/tree/master %
+% Copyright : Christian Tellechea 2009-2019 %
+% Licence : Released under the LaTeX Project Public License v1.3c %
+% or later, see http://www.latex-project.org/lppl.txt %
+% Files : 1) spreadtab.sty %
+% 2) spreadtab-fr.tex %
+% 3) spreadtab-fr.pdf %
+% 4) spreadtab-en.tex %
+% 5) spreadtab-en.pdf %
+% 6) README %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ProvidesPackage{spreadtab}[\STdate\space v\STver\space Spreadsheet features for table environments (CT)]
\NeedsTeXFormat{LaTeX2e}
-\RequirePackage{fp}% pour les calculs scientifiques
-\RequirePackage{xstring}[2013/07/29]% version n\'ecessaire
+\def\ST at cslet#1#2{\expandafter\let\expandafter#1\csname#2\endcsname}
+\RequirePackage{xstring}[2013/07/29]% version n\xE9cessaire
+% liste des fonctions dont l'argument est num\xE9rique
+\def\ST at functions@with at num@arg{%
+ id,fact,ifeq,ifgt,iflt,numtofrshortdate,numtoengshortdate,numtofrlongdate,gcd,lcm,%
+ numtoenglongdate,numtofrmonth,numtoengmonth,numtofrday,numtoengday}
+
+% liste des fonctions dont l'argument est un texte
+\def\ST at functions@with at text@arg{frshortdatetonum,engshortdatetonum,englongdatetonum,frlongdatetonum,scitodec,tag,row,col,cell,value}
+
+% liste des fonctions dont l'argument ne doit pas \xEAtre calcul\xE9
+\def\ST at functions@no at 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\xE9f\xE9rences dans l'argument
+\def\ST at functions@with at assign@argument{tag,row,col,cell,value}
+
+% liste des fonctions dont le r\xE9sultat est un texte
+\def\ST at functions@with at textresult{%
+ numtofrshortdate,numtoengshortdate,numtofrlongdate,numtoenglongdate,%
+ numtofrmonth,numtoengmonth,numtofrday,numtoengday}
+
+% liste totale des fonctions
+%\edef\ST at functions@list{\ST at functions@with at range@arg,\ST at functions@with at num@arg,\ST at functions@with at text@arg}
+
+\newif\if at fp \@fpfalse
+\newif\if at xfp\@xfpfalse
+\newif\if at STfpactive
+\def\STusefp {\PackageError\STname{The FP package is not loaded, you cannot select it with \string\STusefp}{Please, read the manual.}}
+\def\STusexfp{\PackageError\STname{The xfp package is not loaded, you cannot select it with \string\STusexfp}{Please, read the manual.}}
+\DeclareOption{fp}{\@fptrue}
+\DeclareOption{xfp}{\@xfptrue}
+\DeclareOption*{\PackageWarning{spreadtab}{Unknown "\CurrentOption"}}
+
+\ProcessOptions\relax
+\ifnum0\if at fp1\fi\if at xfp1\fi=0 \@fptrue\fi% charger fp si aucune option
+\if at fp\expandafter\@firstofone\else\expandafter\@gobble\fi% car les \fi ne sont pas \xE9quilibr\xE9s
+{ \RequirePackage{fp}%
+ \def\STusefp{%
+ \let\STeval\FPeval
+ \let\STround\FPround
+ \let\STclip\FPclip
+ \let\STtrunc\FPtrunc
+ \let\STadd\FPadd
+ \let\STmul\FPmul
+ \let\STdiv\FPdiv
+ \def\STseed{\FPseed\number\time\number\day\number\month}%
+ \let\STrandom\FPrandom
+ \let\STifzero\FPifzero
+ \let\STifgt\FPifgt
+ \let\STiflt\FPiflt
+ \let\STifeq\FPifeq
+ \let\STifint\FPifint
+ \def\STifneg##1{\STiflt{##1}{0}}%
+ \def\ST at functions@with at range@arg{sum,randint,rand,sumprod}% liste des fonctions dont l'argument est une plage ou est vide
+ \edef\ST at functions@list{\ST at functions@with at range@arg,\ST at functions@with at num@arg,\ST at functions@with at text@arg}% liste totale des fonctions
+ % Calcule la factorielle du nombre ##1 et met le r\xE9sultat dans la sc ##2
+ \def\ST at func@fact##1##2{%
+ \edef##2{%
+ \ifcase##1 1\or1\or2\or6\or24\or120\or720\or5040\or40320\or362880\or3628800\or39916800\or479001600\or
+ 6227020800\or87178291200\or1307674368000\or20922789888000\or355687428096000\or6402373705728000\else
+ -1%
+ \fi}%
+ }%
+ \message{\STname\space message: FP calc engine now active}%
+ \@STfpactivetrue
+ }%
+ \STusefp
+}
+\if at xfp
+ \RequirePackage{xfp}%
+ \ExplSyntaxOn
+ \def\STusexfp{
+ \def\STeval##1##2{\edef##1{\fpeval{##2}}}
+ \def\STround##1##2##3{\edef##1{\fpeval{round(##2,##3)}}}
+ \def\STclip##1##2{}%
+ \def\STtrunc##1##2##3{\edef##1{\fpeval{trunc(##2,##3)}}}
+ \def\STadd##1##2##3{\edef##1{\fpeval{##2+##3}}}
+ \def\STmul##1##2##3{\edef##1{\fpeval{##2*##3}}}
+ \def\STdiv##1##2##3{\edef##1{\fpeval{##2/##3}}}
+ \let\STseed\relax
+ \def\STrandom##1{\edef##1{\fpeval{rand()}}}
+ \ST at cslet\ST at iftrue{iftrue}\ST at cslet\ST at iffalse{iffalse}
+ \def\STifgt##1##2{\fp_compare:nNnTF{##1}>{##2}\ST at iftrue\ST at iffalse}
+ \def\STiflt##1##2{\fp_compare:nNnTF{##1}<{##2}\ST at iftrue\ST at iffalse}
+ \def\STifeq##1##2{\fp_compare:nNnTF{##1}={##2}\ST at iftrue\ST at iffalse}
+ \def\STifint ##1{\fp_compare:nNnTF{##1-trunc(##1,0)}={0}\ST at iftrue\ST at iffalse}
+ \def\STifzero##1{\STifeq{##1}{0}}
+ \def\STifneg##1{\STiflt{##1}{0}}
+ \ifdefined\XeTeXrevision% si on compile avec XeLaTeX
+ \ifdefined\uniformdeviate\else% avec une version trop ancienne ( < TL13 ?)
+ \PackageWarning\STname{With this version of XeLaTeX, functions rand and randint are not available}
+ \fi
+ \fi
+ \def\ST at functions@with at range@arg{sum,sumprod}
+ \edef\ST at functions@list{\ST at functions@with at range@arg,\ST at functions@with at num@arg,\ST at functions@with at text@arg}% liste totale des fonctions
+ \def\ST at func@fact##1##2{
+ \bool_if:nTF{ \fp_compare_p:nNn {##1}>{-1} && \fp_compare_p:nNn {##1-trunc(##1,0)}={0} }
+ {\def##2{1}\def\ST at factcntt{0}
+ \fp_do_while:nNnn {\ST at factcntt}<{##1}
+ {\edef\ST at factcntt{\number\numexpr\ST at factcntt+1}
+ \edef##2{##2*\ST at factcntt}%
+ }
+ \edef##2{\fpeval{##2}}
+ }
+ {\ST at fact@outofrange}
+ }
+ \message{\STname~message:~xfp~calc~engine~now~active}
+ \@STfpactivefalse
+ }
+ \ExplSyntaxOff
+ \if at fp\else\expandafter\expandafter\expandafter\STusexfp\fi
+\fi
+
\newcount\ST at count
\newcount\ST at colcount
\newcount\ST at colcount@i
@@ -43,23 +155,24 @@
\newif\ifST at colortblloaded
\AtBeginDocument{\@ifpackageloaded{colortbl}\ST at colortblloadedtrue\ST at colortblloadedfalse}
-% D\'efinit le marqueur qui signale le commencement du champ num\'erique
+% D\xE9finit le marqueur qui signale le commencement du champ num\xE9rique
\def\STnumericfieldmarker{:=}
-% D\'efinit la macro qui va afficher les valeurs num\'eriques dans le tableau
+% D\xE9finit la macro qui va afficher les valeurs num\xE9riques dans le tableau
\def\STprintnum#1{#1}
-% D\'efinit les caract\`eres entre lesquels doivent entre envelopp\'ees les r\'ef\'erences des cellules
+% D\xE9finit les caract\xE8res entre lesquels doivent entre envelopp\xE9es les r\xE9f\xE9rences des cellules
% que l'on veut afficher dans les champs textuels
\def\STsetdisplaymarks#1#2{\def\ST at startdisplay{#1}\def\ST at enddisplay{#2}}
-\STsetdisplaymarks{<<}{>>}% d\'elimiteurs par d\'efaut
+\STsetdisplaymarks{<<}{>>}% d\xE9limiteurs par d\xE9faut
-% d\'efinit le marqueur qui signale une cellule de texte
+% d\xE9finit le marqueur qui signale une cellule de texte
\edef\STtextcell{\string @}
-% Commande qui permet \'a l'utilisateur de d\'efinir le caract\`ere qui conserve une r\'ef\'erence lors de la copie d'une formule
+% Commande qui permet \xE0 l'utilisateur de d\xE9finir le caract\xE8re qui conserve une r\xE9f\xE9rence lors de la copie d'une formule
\AtBeginDocument{\def\STtransposecar{!}}
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Messages d'erreur %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -69,7 +182,7 @@
\def\ST at emit@message#1{\ifST at message\message{#1}\fi}
-\def\ST at seedoc@i{Please, read the manual.}
+\def\STseedoc at i{Please, read the manual.}
\def\ST at circular@reference{%
\ST at coord@toref\ST at coord
@@ -76,7 +189,7 @@
\let\ST at deptree\@empty
\ST at show@dependance at tree
\PackageError\STname{circular reference found in cell \ST at coord!^^J
- Here is its dependant cells: \ST at deptree}\ST at seedoc@i
+ Here is its dependant cells: \ST at deptree}\STseedoc at i
}
\def\ST at undefined@cell{%
@@ -83,7 +196,7 @@
\ST at coord@toref\ST at temp@callcell
\ST at coord@toref\ST at coord
\PackageError\STname{Undefined reference!^^J
- Cell \ST at temp@callcell\space contains a reference to an undefined cell: \ST at coord}\ST at seedoc@i
+ Cell \ST at temp@callcell\space contains a reference to an undefined cell: \ST at coord}\STseedoc at i
}
\def\ST at zerocodecell@cell{%
@@ -90,59 +203,59 @@
\ST at coord@toref\ST at temp@callcell
\ST at coord@toref\ST at coord
\PackageError\STname{A reference to a non-numeric or empty cell is not allowed!^^J
- Cell \ST at temp@callcell\space contains a reference to an empty or text cell: \ST at coord}\ST at seedoc@i
+ Cell \ST at temp@callcell\space contains a reference to an empty or text cell: \ST at coord}\STseedoc at i
}
-\def\ST at multicol@cell{%
+\def\STmulticol at cell{%
\ST at coord@toref\ST at temp@callcell
\ST at coord@toref\ST at coord
\PackageError\STname{Cell \ST at temp@callcell\space contains a reference to a merged
- \string\multicolumn\space cell: \ST at coord}\ST at seedoc@i
+ \string\multicolumn\space cell: \ST at coord}\STseedoc at i
}
\def\ST at illegal@relativeref{%
\edef\ST at temp@callcell{\ST at current@colnumber,\ST at current@rownumber}%
\ST at coord@toref\ST at temp@callcell
- \PackageError\STname{Illegal relative reference found in cell \ST at temp@callcell!}\ST at seedoc@i
+ \PackageError\STname{Illegal relative reference found in cell \ST at temp@callcell!}\STseedoc at i
}
-\def\ST at illegal@ref{\PackageError\STname{Illegal reference in \string\STsavecell!}\ST at seedoc@i}
+\def\ST at illegal@ref{\PackageError\STname{Illegal reference in \string\STsavecell!}\STseedoc at i}
\def\ST at unmatch@matrixdim{%
\edef\ST at temp@callcell{\ST at current@colnumber,\ST at current@rownumber}%
\ST at coord@toref\ST at temp@callcell
- \PackageError\STname{Somprod dimension of matrix do not match in cell \ST at temp@callcell!}\ST at seedoc@i
+ \PackageError\STname{Somprod dimension of matrix do not match in cell \ST at temp@callcell!}\STseedoc at i
}
-\def\ST at fact@outofrange{\PackageError\STname{Argument of fact is not integer or is out of range!}\ST at seedoc@i}
+\def\ST at fact@outofrange{\PackageError\STname{Argument of fact is not integer or is out of range!}\STseedoc at i}
\def\ST at invalid@date{%
\edef\ST at temp@callcell{\ST at current@colnumber,\ST at current@rownumber}%
\ST at coord@toref\ST at temp@callcell
- \PackageError\STname{Invalid date in cell \ST at temp@callcell.}\ST at seedoc@i
+ \PackageError\STname{Invalid date in cell \ST at temp@callcell.}\STseedoc at i
}
\def\ST at invalid@range{%
\edef\ST at temp@callcell{\ST at current@colnumber,\ST at current@rownumber}%
\ST at coord@toref\ST at temp@callcell
- \PackageError\STname{Invalid range in cell \ST at temp@callcell.}\ST at seedoc@i
+ \PackageError\STname{Invalid range in cell \ST at temp@callcell.}\STseedoc at i
}
\def\ST at invalidSTcopy{%
\edef\ST at temp@callcell{\ST at current@colnumber,\ST at current@rownumber}%
\ST at coord@toref\ST at temp@callcell
- \PackageError\STname{Numeric field marker found, \string\STcopy\space forbidden in cell \ST at temp@callcell.}\ST at seedoc@i
+ \PackageError\STname{Numeric field marker found, \string\STcopy\space forbidden in cell \ST at temp@callcell.}\STseedoc at i
}
\def\ST at unknown@tag{%
\edef\ST at temp@callcell{\ST at current@colnumber,\ST at current@rownumber}%
\ST at coord@toref\ST at temp@callcell
- \PackageError\STname{Undefined tag in cell \ST at temp@callcell.}\ST at seedoc@i
+ \PackageError\STname{Undefined tag in cell \ST at temp@callcell.}\STseedoc at i
}
-\def\ST at intarg@required{\PackageError\STname{Macro function randint require integer argument}\ST at seedoc@i}
+\def\ST at intarg@required{\PackageError\STname{Macro function randint require integer argument}\STseedoc at i}
-% transforme la chaine de cellules "(1,3)(4,5)(3,2)(1,3)" rencontr\'e en r\'ef\'erence circulaire en "A3-D5-C2-A3"
+% transforme la chaine de cellules "(1,3)(4,5)(3,2)(1,3)" rencontr\xE9 en r\xE9f\xE9rence circulaire en "A3-D5-C2-A3"
\def\ST at show@dependance at tree{%
\ST at between\ST at dependance@tree()\ST at currentref
\ST at right\ST at dependance@tree)\ST at dependance@tree
@@ -149,12 +262,12 @@
\ST at coord@toref\ST at currentref
\ST at expadd@tomacro\ST at deptree\ST at currentref
\unless\ifx\@empty\ST at dependance@tree
- \ST at add@tomacro\ST at deptree-%
+ \STadd at tomacro\ST at deptree-%
\expandafter\ST at show@dependance at tree
\fi
}
-% transforme la s\'equence de contr\^ole #1 qui contient par exemple «4,5» en «D5»
+% transforme la s\xE9quence de contr\xF4le #1 qui contient par exemple \xAB4,5\xBB en \xABD5\xBB
\def\ST at coord@toref#1{%
\ST at split#1,\ST at temp@a#1%
\edef#1{\ifcase\ST at 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
@@ -161,7 +274,7 @@
N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\fi#1}%
}
-\def\ST at illegal@copy{\PackageError\STname{Illegal reference in copied formula!}\ST at seedoc@i}
+\def\ST at illegal@copy{\PackageError\STname{Illegal reference in copied formula!}\STseedoc at i}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% Macros d'affectation et d'expansion %%%%%%%%%%%%%%%%%%%%%
@@ -175,9 +288,9 @@
\ST at tmp@
}
-\def\ST at add@tomacro#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
+\def\STadd at tomacro#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
-\def\ST at expadd@tomacro#1#2{\expandafter\ST at add@tomacro\expandafter#1\expandafter{#2}}
+\def\ST at expadd@tomacro#1#2{\expandafter\STadd at tomacro\expandafter#1\expandafter{#2}}
\def\ST at edefadd@tomacro#1#2{\edef#1{\unexpanded\expandafter{#1}#2}}
@@ -184,7 +297,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%% Macros de manipulation de chaines %%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\ST at gobble@remain{% mange tous jusqu'à \ST at nil. Méthode LENTE privilégiée car il peut y avoir des ) de catcode 2 isolées
+\def\ST at gobble@remain{% mange tous jusqu'\xE0 \ST at nil. M\xE9thode LENTE privil\xE9gi\xE9e car il peut y avoir des ) de catcode 2 isol\xE9es
\afterassignment\ST at gobble@remain at i
\let\ST at toks=
}
@@ -195,7 +308,7 @@
\expandafter\ST at splitatfirstcar@i#1\@nil
}
-% dans la sc #1, remplace le . par le s\'eparateur d\'ecimal
+% dans la sc #1, remplace le . par le s\xE9parateur d\xE9cimal
\def\ST at substdecsep#1{%
\ST at Ifinstr#1.
{\expandafter\ST at substdecsep@i\expandafter#1\expandafter{\ST at decsep}}
@@ -206,7 +319,7 @@
\expandafter\ST at substdecsep@ii#1\@nil
}
-% enl\`eve tous les espaces de la sc #1 et assigne le r\'esultat \'a #1
+% enl\xE8ve tous les espaces de la sc #1 et assigne le r\xE9sultat \xE0 #1
\def\ST at remove@firST at spaces#1{%
\IfBeginWith#1\space
{\StrGobbleLeft#11[#1]\ST at remove@firST at spaces{#1}}%
@@ -213,17 +326,17 @@
{}%
}
-\def\ST at keep@firstcar#1{% on ne garde dans la sc #1 que le 1er caract\`ere de la sc #1 ou on enl\`eve les accolades
+\def\ST at keep@firstcar#1{% on ne garde dans la sc #1 que le 1er caract\xE8re de la sc #1 ou on enl\xE8ve les accolades
\expandafter\expandafter\expandafter\def
\expandafter\expandafter\expandafter#1\expandafter\expandafter\expandafter{\expandafter\@car#1\@nil}%
}
-\def\ST at firstarg@after#1#2#3{% assigne \'a la sc #3 l'argument qui suit #2 dans le d\'eveloppement de la sc #1
+\def\ST at firstarg@after#1#2#3{% assigne \xE0 la sc #3 l'argument qui suit #2 dans le d\xE9veloppement de la sc #1
\def\ST at firstarg@after at i##1#2##2##3\@nil{\def#3{##2}}%
\expandafter\ST at firstarg@after at i#1\@nil
}
-\def\ST at thirdarg@after#1#2#3{% assigne \'a la sc #3 le 3\`e argument qui suit #2 dans le d\'eveloppement de la sc #1
+\def\ST at thirdarg@after#1#2#3{% assigne \xE0 la sc #3 le 3\xE8 argument qui suit #2 dans le d\xE9veloppement de la sc #1
\def\ST at thirdarg@after at i##1#2##2##3##4##5\@nil{\def#3{##4}}%
\expandafter\ST at thirdarg@after at i#1\@nil
}
@@ -235,7 +348,7 @@
\ST at Ifinstr@ii#1\@@nil#2\@nil
}
-% Est ce que la sc #1 commence par les caract\`eres #2 ?
+% Est ce que la sc #1 commence par les caract\xE8res #2 ?
\def\ST at Iffirstis#1#2{%
\expandafter\ST at Ifinstr@i\expandafter{#1}{#2}%
{\def\ST at Iffirstis@i##1#2##2\@nil{%
@@ -246,14 +359,14 @@
\expandafter\ST at Iffirstis@i#1\@@nil#2\@nil
}
-% Coupe la sc #1 au caract\`ere #2
-% ce qui est avant est assign\'e \'a #3 et ce qui est apr\`es \'a #4
+% Coupe la sc #1 au caract\xE8re #2
+% ce qui est avant est assign\xE9 \xE0 #3 et ce qui est apr\xE8s \xE0 #4
\def\ST at split#1#2#3#4{%
\def\ST at split@i##1#2##2\@nil{\def#3{##1}\def#4{##2}}%
\expandafter\ST at split@i#1\@nil
}
-% Dans la sc #1, assigne ce qui est avant le d\'eveloppement de la sc #2 \'a la sc #3
+% Dans la sc #1, assigne ce qui est avant le d\xE9veloppement de la sc #2 \xE0 la sc #3
\def\ST at left#1#2#3{\ST at exp@two at args\ST at left@i{#1}{#2}#3}
\def\ST at left@i#1#2#3{%
\def\ST at left@ii##1#2##2\@nil{\def#3{##1}}%
@@ -260,7 +373,7 @@
\ST at left@ii#1\@nil
}
-% Dans la sc #1, assigne ce qui est apr\`es le d\'eveloppement de la sc #2 \'a la sc #3
+% Dans la sc #1, assigne ce qui est apr\xE8s le d\xE9veloppement de la sc #2 \xE0 la sc #3
\def\ST at right#1#2#3{\ST at exp@two at args\ST at right@i{#1}{#2}#3}
\def\ST at right@i#1#2#3{%
\def\ST at right@ii##1#2##2\@nil{\def#3{##2}}%
@@ -267,13 +380,13 @@
\ST at right@ii#1\@nil
}
-% Dans la sc #1, assigne \'a la sc #4 ce qui est entre les caract\`eres #2 et #3
+% Dans la sc #1, assigne \xE0 la sc #4 ce qui est entre les caract\xE8res #2 et #3
\def\ST at between#1#2#3#4{%
\def\ST at between@i##1#2##2#3##3\@nil{\def#4{##2}}%
\expandafter\ST at between@i#1\@nil
}
-% Dans la sc #1, substitue la premi\`ere occurrence du pattern #2 par le pattern #3
+% Dans la sc #1, substitue la premi\xE8re occurrence du pattern #2 par le pattern #3
\def\ST at subST@once#1#2#3{%
\def\ST at subST@once at i##1#2##2\@nil{\def#1{##1#3##2}}%
\ST at Ifinstr#1{\@empty#2}
@@ -313,11 +426,11 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Lecture du tableau %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% lit le tableau : consid\`ere que \\ s\'epare les lignes
+% lit le tableau : consid\xE8re que \\ s\xE9pare les lignes
\def\ST at read@tab{%
\def\ST at total@colnumber{0}%
\ST at rowcount\z@
- \ST at search@hline% on met de c\^ot\'e la (ou les) ligne sup\'erieure du tableau
+ \ST at search@hline% on met de c\xF4t\xE9 la (ou les) ligne sup\xE9rieure du tableau
\ST at read@tab at i
}
@@ -326,12 +439,12 @@
\ST at Ifinstr\ST at tab{\ST at eol}% si contient \\, il reste encore des lignes
{\expandafter\ST at split\expandafter\ST at tab\expandafter{\ST at eol}\ST at current@row\ST at tab
\@namedef{endrow@\number\ST at rowcount\expandafter}\expandafter{\ST at eol}% est la fin de cette ligne, pour l'instant
- \ST at Iffirstis\ST at tab[% on prend en compte l'\'eventuel argument optionnel de \\
+ \ST at Iffirstis\ST at tab[% on prend en compte l'\xE9ventuel argument optionnel de \\
{\ST at between\ST at tab[]\ST at temp@a% prend ce qui est entre crochet
- \ST at Ifinstr\ST at temp@a,% si c'est une r\'ef\'erence (on teste juste la pr\'esence de la virgule, ça devrait suffire)
+ \ST at Ifinstr\ST at temp@a,% si c'est une r\xE9f\xE9rence (on teste juste la pr\xE9sence de la virgule, \xE7a devrait suffire)
{}% on ne fait rien
{\ST at split\ST at tab]\ST at temp@a\ST at tab% sinon, coupe au crocher fermant
- \expandafter\ST at expadd@tomacro\csname endrow@\number\ST at rowcount\endcsname{\ST at temp@a]}}% ajoute l'argument optionnel \'a la fin de ligne
+ \expandafter\ST at expadd@tomacro\csname endrow@\number\ST at rowcount\endcsname{\ST at temp@a]}}% ajoute l'argument optionnel \xE0 la fin de ligne
}%
{}%
\ST at search@hline% on va purger les hlines et les mettre dans la fin de ligne
@@ -342,16 +455,16 @@
\let\ST at next@readrows\ST at read@tab at i
\fi
}%
- {\let\ST at current@row\ST at tab% plus de ligne ? on prend le tout c-\'a-d la ligne incompl\`ete qui finit le tableau
+ {\let\ST at current@row\ST at tab% plus de ligne ? on prend le tout c-\xE0-d la ligne incompl\xE8te qui finit le tableau
\let\ST at next@readrows\relax
\edef\ST at total@rownumber{\number\ST at rowcount}}%
- \ST at Ifinstr\ST at current@row{\@empty\SThiderow}% il est demand\'e de masquer la colonne ?
- {\edef\ST at row@skiplist{(\number\ST at rowcount)\ST at row@skiplist}% on ajoute le num\'ero de ligne \'a masquer \'a la skiplist
+ \ST at Ifinstr\ST at current@row{\@empty\SThiderow}% il est demand\xE9 de masquer la colonne ?
+ {\edef\ST at row@skiplist{(\number\ST at rowcount)\ST at row@skiplist}% on ajoute le num\xE9ro de ligne \xE0 masquer \xE0 la skiplist
\StrDel\ST at current@row{\@empty\SThiderow}[\ST at current@row]%
}%
{}%
\ST at colcount\z@
- \let\ST at multicol@number\@empty
+ \let\STmulticol at number\@empty
\let\ST at nextcell\@empty
\ST at read@cells% lit les cellules de la ligne courante \ST at current@row
\ST at next@readrows
@@ -368,9 +481,9 @@
\ifnum\ST at colcount>\ST at total@colnumber\edef\ST at total@colnumber{\number\ST at colcount}\fi
}%
\ST at Ifinstr\ST at current@cell{\@empty\SThidecol}% on doit masquer cette colonnes ?
- {\ST at Ifinstr\ST at col@skiplist{\expandafter(\number\ST at colcount)}% ça a d\'ej\'a \'et\'e demand\'e ?
+ {\ST at Ifinstr\ST at col@skiplist{\expandafter(\number\ST at colcount)}% \xE7a a d\xE9j\xE0 \xE9t\xE9 demand\xE9 ?
{}% on fait rien
- {\edef\ST at col@skiplist{(\number\ST at colcount)\ST at col@skiplist}% sinon -> ajout \'a la skiplist
+ {\edef\ST at col@skiplist{(\number\ST at colcount)\ST at col@skiplist}% sinon -> ajout \xE0 la skiplist
\ifnum\ST at colcount>\ST at laST@skipcol\edef\ST at laST@skipcol{\number\ST at colcount}\fi
}%
\StrDel\ST at current@cell{\@empty\SThidecol}[\ST at current@cell]%
@@ -377,11 +490,11 @@
}%
{}%
\exploregroups
- \ST at Ifinstr\ST at current@cell{\@empty\multicolumn}% tester la pr\'esence d'un \multicol
- {\ST at firstarg@after\ST at current@cell\multicolumn\ST at multicol@number}%
- {\let\ST at multicol@number\@empty}%
- \IfSubStr\ST at current@cell\STnumericfieldmarker% il y a un marqueur de champ num\'erique ?
- {\IfSubStr\ST at current@cell{\@empty\STcopy}\ST at invalidSTcopy{}% s'il y a un \STcopy, erreur (pas de champ num\'erique et de \STcopy dans une m\^eme cellule)
+ \ST at Ifinstr\ST at current@cell{\@empty\multicolumn}% tester la pr\xE9sence d'un \multicol
+ {\ST at firstarg@after\ST at current@cell\multicolumn\STmulticol at number}%
+ {\let\STmulticol at number\@empty}%
+ \IfSubStr\ST at current@cell\STnumericfieldmarker% il y a un marqueur de champ num\xE9rique ?
+ {\IfSubStr\ST at current@cell{\@empty\STcopy}\ST at invalidSTcopy{}% s'il y a un \STcopy, erreur (pas de champ num\xE9rique et de \STcopy dans une m\xEAme cellule)
\StrBehind\ST at current@cell\STnumericfieldmarker[\ST at current@formula]%
\noexploregroups
\StrChar\ST at current@formula1[\ST at temp@a]% \ST at temp@a contient {<formule}
@@ -390,58 +503,58 @@
\ST at expadd@tomacro\ST at temp@b\ST at temp@a
\StrSubstitute[1]\ST at current@cell\ST at temp@b\STnumericfieldmarker[\ST at current@cell]% on remplace :={<formule>} par ":="
\noexploregroups
- \ST at keep@firstcar\ST at temp@a% dans la formule, on enl\`eve les accolades
+ \ST at keep@firstcar\ST at temp@a% dans la formule, on enl\xE8ve les accolades
\ST at removespaces\ST at temp@a% et tous les espaces
\ifx\ST at temp@a\@empty% \ST at temp@a contient la formule : si la formule est vide
\ifx\ST at copylist\@empty% pas de copylist ?
- \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{0}% met le code \'a 0
+ \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{0}% met le code \xE0 0
\else% si la copylist existe
\ST at lookincopylist{\number\ST at colcount}{\number\ST at rowcount}\ST at celltocopy% on cherche si la cellule en cours est dans une plage de copie
\ifx\ST at celltocopy\@empty
- \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{0}% si c'est non, met le code \'a 0
+ \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{0}% si c'est non, met le code \xE0 0
\StrDel[1]\ST at current@cell\STnumericfieldmarker[\ST at current@cell]% on supprime aussi ":="
\else
- \ST at letname{formula@\number\ST at colcount @\number\ST at rowcount}\ST at celltocopy% il y a une cellule \'a copier : on l'assigne au champ num\'erique
- \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{1}% et on met le code \'a 1
+ \ST at letname{formula@\number\ST at colcount @\number\ST at rowcount}\ST at celltocopy% il y a une cellule \xE0 copier : on l'assigne au champ num\xE9rique
+ \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{1}% et on met le code \xE0 1
\fi
\fi
\else% la formule n'est pas vide
- \ST at letname{formula@\number\ST at colcount @\number\ST at rowcount}\ST at temp@a% et on assigne \'a la formule
- \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{1}% code 1 \'a priori
+ \ST at letname{formula@\number\ST at colcount @\number\ST at rowcount}\ST at temp@a% et on assigne \xE0 la formule
+ \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{1}% code 1 \xE0 priori
\fi
- }% ci dessous, il n'y a pas de marqueur de champ num\'erique
+ }% ci dessous, il n'y a pas de marqueur de champ num\xE9rique
{\IfSubStr\ST at current@cell\STtextcell% si c'est une cellule de texte
{\StrDel\ST at current@cell\STtextcell[\ST at current@cell]% on le(s) supprime les flags
- \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{0}% met le code \'a 0
- }% ci dessous, ce n'est pas une cellule texte, c'est donc une cellule purement champ num\'erique sans marqueur
+ \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{0}% met le code \xE0 0
+ }% ci dessous, ce n'est pas une cellule texte, c'est donc une cellule purement champ num\xE9rique sans marqueur
{\StrDel\ST at current@cell\space[\ST at temp@a]%
\ifx\@empty\ST at temp@a% il n'y a que des espaces, c'est donc une cellule vide
\ifx\ST at copylist\@empty% pas de copylist ?
- \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{0}% met le code \'a 0
+ \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{0}% met le code \xE0 0
\else% si la copylist existe
\ST at lookincopylist{\number\ST at colcount}{\number\ST at rowcount}\ST at celltocopy% on cherche si la cellule en cours est dans un oplage de copie
\ifx\ST at celltocopy\@empty
- \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{0}% si c'est non, met le code \'a 0
+ \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{0}% si c'est non, met le code \xE0 0
\else
- \let\ST at current@cell\STnumericfieldmarker% il y a une cellule \'a copier ici
- \ST at letname{formula@\number\ST at colcount @\number\ST at rowcount}\ST at celltocopy% on l'assigne au champ num\'erique
- \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{1}% et on met le code \'a 1
+ \let\ST at current@cell\STnumericfieldmarker% il y a une cellule \xE0 copier ici
+ \ST at letname{formula@\number\ST at colcount @\number\ST at rowcount}\ST at celltocopy% on l'assigne au champ num\xE9rique
+ \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{1}% et on met le code \xE0 1
\fi
\fi
- \else% ici, la cellule est compos\'ee d'une champ num\'erique sans marqueur
- \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{1}% toute la cellule est consid\'er\'ee comme champ num\'erique
+ \else% ici, la cellule est compos\xE9e d'une champ num\xE9rique sans marqueur
+ \@namedef{code@\number\ST at colcount @\number\ST at rowcount}{1}% toute la cellule est consid\xE9r\xE9e comme champ num\xE9rique
\ST at remove@firST at spaces\ST at current@cell
\ST at Ifinstr\ST at current@cell{\@empty\STcopy}%
{\ST at findcopyargs\ST at current@cell\ST at copyrange\ST at copyformula% on chope les arguments de \STcopy
- \ST at seekcopyoffset\ST at copyrange% cherche les d\'ecalages
- \edef\ST at copyrange{\ST at hoffest,\ST at voffest}% et affecte sous forme a,b o\`u a et b sont des nombres ou sont vides
- \expandafter\def\expandafter\ST at newtocopylist\expandafter{\expandafter|\ST at copyformula|}% \ST at newtocopylist est le nouvel \'el\'ement \'a ajouter \'a la copylist
+ \ST at seekcopyoffset\ST at copyrange% cherche les d\xE9calages
+ \edef\ST at copyrange{\ST at hoffest,\ST at voffest}% et affecte sous forme a,b o\xF9 a et b sont des nombres ou sont vides
+ \expandafter\def\expandafter\ST at newtocopylist\expandafter{\expandafter|\ST at copyformula|}% \ST at newtocopylist est le nouvel \xE9l\xE9ment \xE0 ajouter \xE0 la copylist
\ST at edefadd@tomacro\ST at newtocopylist{[\number\ST at colcount,\number\ST at rowcount]}%
\ST at expadd@tomacro\ST at newtocopylist{\expandafter(\ST at copyrange)}%
- \ST at expadd@tomacro\ST at newtocopylist\ST at copylist% ajoute la copylist \'a la fin
- \let\ST at copylist\ST at newtocopylist% et l'assigne \'a copylist
- \ST at transposeformula00\ST at copyformula\ST at copyformula% on transpose \'eventuellement pour g\'erer les "!"
- \ST at letname{formula@\number\ST at colcount @\number\ST at rowcount}\ST at copyformula% affecte la formule inchang\'ee au champ num\'erique courant
+ \ST at expadd@tomacro\ST at newtocopylist\ST at copylist% ajoute la copylist \xE0 la fin
+ \let\ST at copylist\ST at newtocopylist% et l'assigne \xE0 copylist
+ \ST at transposeformula00\ST at copyformula\ST at copyformula% on transpose \xE9ventuellement pour g\xE9rer les "!"
+ \ST at letname{formula@\number\ST at colcount @\number\ST at rowcount}\ST at copyformula% affecte la formule inchang\xE9e au champ num\xE9rique courant
}%
{\ST at letname{formula@\number\ST at colcount @\number\ST at rowcount}\ST at current@cell% et on assigne toute la cellule
\let\ST at current@cell\STnumericfieldmarker% et on met le flag pour la formule
@@ -454,10 +567,10 @@
\ST at try@calc at cell(\number\ST at colcount,\number\ST at rowcount)% on essaie de calculer la cellule
\fi
\ST at letname{text@\number\ST at colcount @\number\ST at rowcount}\ST at current@cell
- \unless\ifx\@empty\ST at multicol@number% si c'est une cellule qui contient \multicolumn
- \loop% on met tous les codes des cellules fusion\'ees qui suivent la cellule en cours \'a -1
- \ifnum\ST at multicol@number>\@ne
- \edef\ST at multicol@number{\number\numexpr\ST at multicol@number-1}%
+ \unless\ifx\@empty\STmulticol at number% si c'est une cellule qui contient \multicolumn
+ \loop% on met tous les codes des cellules fusion\xE9es qui suivent la cellule en cours \xE0 -1
+ \ifnum\STmulticol at number>\@ne
+ \edef\STmulticol at number{\number\numexpr\STmulticol at number-1}%
\advance\ST at colcount\@ne
\@namedef{code@\number\ST at colcount @\number\ST at rowcount}{-1}% -1 = cellule multicol
\repeat
@@ -466,7 +579,7 @@
}
% On va essayer de purger dans #1 toutes les \hline, \clines, \hhline etc, et ajouter tout ce beau monde
-% et leur ev\'entuels arguments dans des sc sp\'eciales (par ex \endrow at 3 pour la fin de la 3e ligne.)
+% et leur ev\xE9ntuels arguments dans des sc sp\xE9ciales (par ex \endrow at 3 pour la fin de la 3e ligne.)
\def\ST at search@hline{%
\ST at ifvalid@csname{endrow@\number\ST at rowcount}%
{}
@@ -475,53 +588,53 @@
}
\def\ST at search@hline at i{%
- \ST at remove@firST at spaces\ST at tab% on enl\`eve les espaces au d\'ebut
+ \ST at remove@firST at spaces\ST at tab% on enl\xE8ve les espaces au d\xE9but
\StrChar\ST at tab1[\ST at temp@a]% \ST at temp@a est le 1er car
\let\ST at next\ST at search@hline at i
- \IfStrEqCase\ST at temp@a{% on envisage tous les cas de trac\'e de ligne horizontale
- {\@empty\hline}{\StrGobbleLeft\ST at tab1[\ST at tab]\expandafter\ST at add@tomacro\csname endrow@\number\ST at rowcount\endcsname\hline}%
+ \IfStrEqCase\ST at temp@a{% on envisage tous les cas de trac\xE9 de ligne horizontale
+ {\@empty\hline}{\StrGobbleLeft\ST at tab1[\ST at tab]\expandafter\STadd at tomacro\csname endrow@\number\ST at rowcount\endcsname\hline}%
{\@empty\cline}{\StrSplit\ST at tab2\ST at temp@a\ST at tab\expandafter\ST at expadd@tomacro\csname endrow@\number\ST at rowcount\endcsname\ST at temp@a}%
{\@empty\hhline}{\StrSplit\ST at tab2\ST at temp@a\ST at tab\expandafter\ST at expadd@tomacro\csname endrow@\number\ST at rowcount\endcsname\ST at temp@a}%
{\@empty\noalign}{\StrSplit\ST at tab2\ST at temp@a\ST at tab\expandafter\ST at expadd@tomacro\csname endrow@\number\ST at rowcount\endcsname\ST at temp@a}%
{\@empty\toprule}{% les commandes de booktabs
- \StrSplit\ST at tab1\ST at temp@a\ST at tab% chope le 1er lex\`eme : la commande \toprule
+ \StrSplit\ST at tab1\ST at temp@a\ST at tab% chope le 1er lex\xE8me : la commande \toprule
\IfBeginWith\ST at tab[{\StrBefore\ST at tab][\ST at temp@b]\ST at expadd@tomacro\ST at temp@a{\ST at temp@b]}\StrBehind\ST at tab][\ST at tab]}{}%
\expandafter\ST at expadd@tomacro\csname endrow@\number\ST at rowcount\endcsname\ST at temp@a
}%
{\@empty\midrule}{%
- \StrSplit\ST at tab1\ST at temp@a\ST at tab% chope le 1er lex\`eme : la commande \midrule
+ \StrSplit\ST at tab1\ST at temp@a\ST at tab% chope le 1er lex\xE8me : la commande \midrule
\IfBeginWith\ST at tab[{\StrBefore\ST at tab][\ST at temp@b]\ST at expadd@tomacro\ST at temp@a{\ST at temp@b]}\StrBehind\ST at tab][\ST at tab]}{}%
\expandafter\ST at expadd@tomacro\csname endrow@\number\ST at rowcount\endcsname\ST at temp@a
}%
{\@empty\bottomrule}{%
- \StrSplit\ST at tab1\ST at temp@a\ST at tab% chope le 1er lex\`eme : la commande \bottomrule
+ \StrSplit\ST at tab1\ST at temp@a\ST at tab% chope le 1er lex\xE8me : la commande \bottomrule
\IfBeginWith\ST at tab[{\StrBefore\ST at tab][\ST at temp@b]\ST at expadd@tomacro\ST at temp@a{\ST at temp@b]}\StrBehind\ST at tab][\ST at tab]}{}%
\expandafter\ST at expadd@tomacro\csname endrow@\number\ST at rowcount\endcsname\ST at temp@a
}%
{\@empty\cmidrule}{%
- \StrSplit\ST at tab1\ST at temp@a\ST at tab% chope le 1er lex\`eme : la commande \cmidrule
+ \StrSplit\ST at tab1\ST at temp@a\ST at tab% chope le 1er lex\xE8me : la commande \cmidrule
\IfBeginWith\ST at tab[{\StrBefore\ST at tab][\ST at temp@b]\ST at expadd@tomacro\ST at temp@a{\ST at temp@b]}\StrBehind\ST at tab][\ST at tab]}{}%
\IfBeginWith\ST at tab({\StrBefore\ST at tab)[\ST at temp@b]\ST at expadd@tomacro\ST at temp@a{\ST at temp@b)}\StrBehind\ST at tab)[\ST at tab]}{}%
\StrSplit\ST at tab1\ST at temp@b\ST at tab% chope l'argument obligatoire : {a-b}
- \ST at expadd@tomacro\ST at temp@a\ST at temp@b% l'ajoute \'a \ST at temp@b
- \expandafter\ST at expadd@tomacro\csname endrow@\number\ST at rowcount\endcsname\ST at temp@a% et on ajoute le tout \'a endrow
+ \ST at expadd@tomacro\ST at temp@a\ST at temp@b% l'ajoute \xE0 \ST at temp@b
+ \expandafter\ST at expadd@tomacro\csname endrow@\number\ST at rowcount\endcsname\ST at temp@a% et on ajoute le tout \xE0 endrow
}%
{\@empty\addlinespace}{%
- \StrSplit\ST at tab1\ST at temp@a\ST at tab% chope le 1er lex\`eme : la commande \addlinespace
+ \StrSplit\ST at tab1\ST at temp@a\ST at tab% chope le 1er lex\xE8me : la commande \addlinespace
\IfBeginWith\ST at tab[{\StrBefore\ST at tab][\ST at temp@b]\ST at expadd@tomacro\ST at temp@a{\ST at temp@b]}\StrBehind\ST at tab][\ST at tab]}{}%
\expandafter\ST at expadd@tomacro\csname endrow@\number\ST at rowcount\endcsname\ST at temp@a
}%
- {\@empty\morecmidrules}{\StrGobbleLeft\ST at tab1[\ST at tab]\expandafter\ST at add@tomacro\csname endrow@\number\ST at rowcount\endcsname\morecmidrules}%
+ {\@empty\morecmidrules}{\StrGobbleLeft\ST at tab1[\ST at tab]\expandafter\STadd at tomacro\csname endrow@\number\ST at rowcount\endcsname\morecmidrules}%
{\@empty\specialrule}{\StrSplit\ST at tab4\ST at temp@a\ST at tab\expandafter\ST at expadd@tomacro\csname endrow@\number\ST at rowcount\endcsname\ST at temp@a}%
}[\let\ST at next\relax]%
\ST at next
}
-% Cette macro transpose toutes les r\'ef\'erences (absolues et relatives) de la sc #3.
-% Le d\'ecalage est de #1 (nombre sign\'e) pour les colonnes et de #2 (nombre sign\'e) pour les lignes.
-% La sc #4 recoit la formule transpos\'ee.
+% Cette macro transpose toutes les r\xE9f\xE9rences (absolues et relatives) de la sc #3.
+% Le d\xE9calage est de #1 (nombre sign\xE9) pour les colonnes et de #2 (nombre sign\xE9) pour les lignes.
+% La sc #4 recoit la formule transpos\xE9e.
\def\ST at transposeformula#1#2#3#4{%
- \def\ST at addcol{#1}\def\ST at addrow{#2}\let\ST at temp@formula#3%
+ \def\STaddcol{#1}\def\STaddrow{#2}\let\ST at temp@formula#3%
\let\ST at transposed@formula\@empty
\ST at transposeformula@i
\let#4\ST at transposed@formula
@@ -530,30 +643,30 @@
\def\ST at transposeformula@i{%
\unless\ifx\@empty\ST at temp@formula% tant que l'on n'a pas parcouru \ST at temp@formula
\ST at splitatfirstcar\ST at temp@formula\ST at firstcar\ST at temp@formula% prend le 1er car de \ST at temp@formula
- \if\expandafter\noexpand\STtransposecar\expandafter\noexpand\ST at firstcar% si ce caract\`ere est un !
- \let\ST at addcol@\z@% pas de tranposition sur la colonne
- \ST at splitatfirstcar\ST at temp@formula\ST at firstcar\ST at temp@formula% on prend le premier caract\`ere qui suit le !
+ \if\expandafter\noexpand\STtransposecar\expandafter\noexpand\ST at firstcar% si ce caract\xE8re est un !
+ \let\STaddcol@\z@% pas de tranposition sur la colonne
+ \ST at splitatfirstcar\ST at temp@formula\ST at firstcar\ST at temp@formula% on prend le premier caract\xE8re qui suit le !
\else
- \let\ST at addcol@\ST at addcol% sinon, on copie le vecteur
+ \let\STaddcol@\STaddcol% sinon, on copie le vecteur
\fi
\expandafter\ST at ifcar@isletter\expandafter{\ST at firstcar}% est-ce que le 1er car est une lettre ?
- {\if\expandafter\noexpand\STtransposecar\expandafter\expandafter\expandafter\noexpand\expandafter\@car\ST at temp@formula\@nil% le caract\`ere suivant est un "!" ?
- \let\ST at addrow@\z@% pas de tranposition sur la ligne
- \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST at temp@formula\expandafter\expandafter\expandafter{\expandafter\@cdr\ST at temp@formula\@nil}% on prend ce qui est apr\`es le !
+ {\if\expandafter\noexpand\STtransposecar\expandafter\expandafter\expandafter\noexpand\expandafter\@car\ST at temp@formula\@nil% le caract\xE8re suivant est un "!" ?
+ \let\STaddrow@\z@% pas de tranposition sur la ligne
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST at temp@formula\expandafter\expandafter\expandafter{\expandafter\@cdr\ST at temp@formula\@nil}% on prend ce qui est apr\xE8s le !
\else
- \let\ST at addrow@\ST at addrow% sinon, on copie le vecteur
+ \let\STaddrow@\STaddrow% sinon, on copie le vecteur
\fi
\IfInteger\ST at temp@formula{}{}% on prend le nombre qui suit
- \ifnum\integerpart>\z@% si ce nombre est plus grand que 0 -> r\'ef\'erence valide
- \let\ST at temp@formula\@xs at afterinteger% on prend ce qui est apr\`es le nombre
+ \ifnum\integerpart>\z@% si ce nombre est plus grand que 0 -> r\xE9f\xE9rence valide
+ \let\ST at temp@formula\@xs at afterinteger% on prend ce qui est apr\xE8s le nombre
\expandafter\lowercase\expandafter{\expandafter\def\expandafter\ST at firstcar\expandafter{\ST at firstcar}}% met en minuscules
- \edef\ST at firstcar{\number\numexpr\expandafter`\ST at firstcar-`a+1+\ST at addcol@}% est le num\'ero de la colonne
+ \edef\ST at firstcar{\number\numexpr\expandafter`\ST at firstcar-`a+1+\STaddcol@}% est le num\xE9ro de la colonne
\ifnum\ST at firstcar<\@ne\ST at illegal@copy\fi% erreur de copie ?
\ST at edefadd@tomacro\ST at transposed@formula{%
\ifcase\ST at firstcar \or a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m\or
n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\fi
- \number\numexpr\integerpart+\ST at addrow@}%
- \ifnum\numexpr\integerpart+\ST at addrow@<\@ne\ST at illegal@copy\fi% erreur de copie ?
+ \number\numexpr\integerpart+\STaddrow@}%
+ \ifnum\numexpr\integerpart+\STaddrow@<\@ne\ST at illegal@copy\fi% erreur de copie ?
\else
\let\ST at temp@formula\@xs at afterinteger
\ST at expadd@tomacro\ST at transposed@formula\ST at firstcar
@@ -561,25 +674,25 @@
}%
{\if[\expandafter\noexpand\ST at firstcar% si le 1er car est [
\ST at left\ST at temp@formula]\ST at temp@ref% on prend ce qui est entre crochet
- \ST at right\ST at temp@formula]\ST at temp@formula% pour la suite, on prend ce qui apr\`es le crochet
+ \ST at right\ST at temp@formula]\ST at temp@formula% pour la suite, on prend ce qui apr\xE8s le crochet
\ST at left\ST at temp@ref,\ST at rel@num% ce qui est avant la virgule
\if\expandafter\noexpand\STtransposecar\expandafter\expandafter\expandafter\noexpand\expandafter\@car\ST at rel@num\@nil% commence par un "!" ?
- \let\ST at addcol@\ST at addcol% compensation pour conserver la cellule initiale
- \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST at rel@num\expandafter\expandafter\expandafter{\expandafter\@cdr\ST at rel@num\@nil}% on prend ce qui est apr\`es le !
+ \let\STaddcol@\STaddcol% compensation pour conserver la cellule initiale
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST at rel@num\expandafter\expandafter\expandafter{\expandafter\@cdr\ST at rel@num\@nil}% on prend ce qui est apr\xE8s le !
\else
- \let\ST at addcol@\z@% sinon, on n'ajoute rien
+ \let\STaddcol@\z@% sinon, on n'ajoute rien
\fi
\IfInteger\ST at rel@num
- {\edef\ST at addcol@{\number\numexpr\ST at rel@num-\ST at addcol@}%
- \ST at right\ST at temp@ref,\ST at rel@num% ce qui est apr\`es la virgule
+ {\edef\STaddcol@{\number\numexpr\ST at rel@num-\STaddcol@}%
+ \ST at right\ST at temp@ref,\ST at rel@num% ce qui est apr\xE8s la virgule
\if\expandafter\noexpand\STtransposecar\expandafter\expandafter\expandafter\noexpand\expandafter\@car\ST at rel@num\@nil% commence par un "!"?
- \let\ST at addrow@\ST at addrow% on compense pour conserver la cellule initiale
- \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST at rel@num\expandafter\expandafter\expandafter{\expandafter\@cdr\ST at rel@num\@nil}% on prend ce qui est apr\`es le !
+ \let\STaddrow@\STaddrow% on compense pour conserver la cellule initiale
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\ST at rel@num\expandafter\expandafter\expandafter{\expandafter\@cdr\ST at rel@num\@nil}% on prend ce qui est apr\xE8s le !
\else
- \let\ST at addrow@\z@% sinon, on n'ajoute rien
+ \let\STaddrow@\z@% sinon, on n'ajoute rien
\fi
\IfInteger\ST at rel@num
- {\ST at edefadd@tomacro\ST at transposed@formula{[\ST at addcol@,\number\numexpr\ST at rel@num-\ST at addrow@]}%
+ {\ST at edefadd@tomacro\ST at transposed@formula{[\STaddcol@,\number\numexpr\ST at rel@num-\STaddrow@]}%
}%
\ST at illegal@relativeref
}%
@@ -592,8 +705,8 @@
\fi
}
-% Cherche dans la sc #1 les 3 arguments qui se trouvent apr\`es \STcopy
-% Affecte le 1er \'a #2, le 2\`e \'a #3 et le 3\`e \'a #4
+% Cherche dans la sc #1 les 3 arguments qui se trouvent apr\xE8s \STcopy
+% Affecte le 1er \xE0 #2, le 2\xE8 \xE0 #3 et le 3\xE8 \xE0 #4
\def\ST at findcopyargs#1#2#3{%
\def\ST at argaftercopy##1\STcopy##2##3##4\@nil{%
\def#1{##1}\ST at expadd@tomacro#1{\STnumericfieldmarker##4}% dans #1,supprime \STcopy{<arg1>}{<arg2>} et le remplace par :=
@@ -642,9 +755,9 @@
\ST at next
}
-% Regarde dans la liste de copie si la cellule de coodonn\'ees #1 #2 est dans une plage de copie
-% si oui, affecte \'a #3 la formule transpos\'ee
-% La liste de copy est parcourue de gauche \'a droite avec sortie d\`es qu'une plage qui convient est rencontr\'ee
+% Regarde dans la liste de copie si la cellule de coodonn\xE9es #1 #2 est dans une plage de copie
+% si oui, affecte \xE0 #3 la formule transpos\xE9e
+% La liste de copy est parcourue de gauche \xE0 droite avec sortie d\xE8s qu'une plage qui convient est rencontr\xE9e
\def\ST at lookincopylist#1#2#3{%
\let\ST at alias@copylist\ST at copylist
\let\ST at returnedformula\@empty
@@ -667,26 +780,26 @@
\ST at next
}
-% Teste si un \'el\'ement de la copylist contient une plage qui inclus la cellule en cours.
+% Teste si un \xE9l\xE9ment de la copylist contient une plage qui inclus la cellule en cours.
\def\ST at testfirstincopylist|#1|[#2,#3](#4,#5)#6\@nil{%
- \def\ST at alias@copylist{#6}% on enl\`eve le premier \'el\'ement de la copylist
- \ST at Ifin\ST at copycol\ST at copyrow[#2,#3](#4,#5)% si ça correspond
+ \def\ST at alias@copylist{#6}% on enl\xE8ve le premier \xE9l\xE9ment de la copylist
+ \ST at Ifin\ST at copycol\ST at copyrow[#2,#3](#4,#5)% si \xE7a correspond
{\def\ST at returnedformula{#1}%
\ST at transposeformula{\numexpr\ST at copycol-#2}{\numexpr\ST at copyrow-#3}\ST at returnedformula\ST at returnedformula
}%
{\ifx\@empty#5\@empty\else
\ifnum\ST at copyrow>\numexpr#3+#5\relax
- \ST at subst\ST at copylist{|#1|[#2,#3](#4,#5)}{}% si on a d\'epass\'e la ligne, on retire ce premier \'el\'ement de la copylist
+ \ST at subst\ST at copylist{|#1|[#2,#3](#4,#5)}{}% si on a d\xE9pass\xE9 la ligne, on retire ce premier \xE9l\xE9ment de la copylist
\fi
\fi
}%
}
-% Cherche dans la sc#1 du type ">4,v9" les d\'ecalages horizontaux et verticaux
-% sp\'ecifi\'es avec > et v
-% S'il trouve > ou v sans nombre derri\`ere, le d\'ecalage correspondant est vide
-% S'il ne trouve pas > ou v, le d\'ecalage correspond est \'egal \'a 0
-% Assigne les d\'ecalages trouv\'es dans \ST at hoffest et \ST at voffest
+% Cherche dans la sc#1 du type ">4,v9" les d\xE9calages horizontaux et verticaux
+% sp\xE9cifi\xE9s avec > et v
+% S'il trouve > ou v sans nombre derri\xE8re, le d\xE9calage correspondant est vide
+% S'il ne trouve pas > ou v, le d\xE9calage correspond est \xE9gal \xE0 0
+% Assigne les d\xE9calages trouv\xE9s dans \ST at hoffest et \ST at voffest
\def\ST at seekcopyoffset#1{%
\ST at Ifinstr#1>%
{\ST at findcopyoffest#1>\ST at hoffest}%
@@ -703,7 +816,7 @@
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%% Recherche d'une r\'ef\'erence %%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%% Recherche d'une r\xE9f\xE9rence %%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% teste si le token #1 est une lettre (majuscule ou minuscule)
\def\ST at ifcar@isletter#1{%
@@ -715,8 +828,8 @@
\ifnum\numexpr(`#1-`a)*(`#1-`z)\relax>\z@\expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi
}
-% cherche une r\'ef\'erence du type lettre+nombre dans la sc #1
-% si on trouve, renvoie les coordonn\'ees dans #2 sous la forme x at y
+% cherche une r\xE9f\xE9rence du type lettre+nombre dans la sc #1
+% si on trouve, renvoie les coordonn\xE9es dans #2 sous la forme x at y
% si on ne trouve pas, #2 est vide.
\def\ST at findref@informula#1#2{%
\let\ST at temp@formula#1%
@@ -737,13 +850,13 @@
\StrSplit\ST at temp@formula1\ST at firstcar\ST at temp@formula% prend le 1er car de ce qui reste
\expandafter\ST at ifcar@isletter\expandafter{\ST at firstcar}% est-ce que le 1er car est une lettre ?
{\IfInteger\ST at temp@formula{}{}% on prend le nombre qui suit
- \ifnum\integerpart>\z@% si ce nombre est plus grand que 0 -> r\'ef\'erence valide
+ \ifnum\integerpart>\z@% si ce nombre est plus grand que 0 -> r\xE9f\xE9rence valide
\let\ST at after@ref at found\@xs at afterinteger
- \edef\ST at ref@found{\ST at firstcar\number\integerpart}% est la r\'ef\'erence trouv\'ee
- \edef\ST at distant@rownumber{\number\integerpart}% on chope ce nombre pour le num\'ero de colonne
+ \edef\ST at ref@found{\ST at firstcar\number\integerpart}% est la r\xE9f\xE9rence trouv\xE9e
+ \edef\ST at distant@rownumber{\number\integerpart}% on chope ce nombre pour le num\xE9ro de colonne
\edef\ST at distant@colnumber{\number\numexpr\expandafter`\ST at firstcar-`a+1}% traduction lettre->chiffre
\ifnum\ST at distant@colnumber<\z@\edef\ST at distant@colnumber{\number\numexpr\ST at distant@colnumber+32}\fi% met les majuscules en minuscules
- \edef\ST at temp@formula{\ST at distant@colnumber @\ST at distant@rownumber}% les coordonn\'ees de la r\'ef\'erence
+ \edef\ST at temp@formula{\ST at distant@colnumber @\ST at distant@rownumber}% les coordonn\xE9es de la r\xE9f\xE9rence
\let\ST at next@search\relax
\fi
}%
@@ -757,7 +870,7 @@
\ST at right\ST at temp@formula,\ST at rel@num
\IfInteger\ST at rel@num
{\edef\ST at distant@rownumber{\number\numexpr\ST at current@rownumber+\ST at rel@num}%
- \edef\ST at temp@formula{\ST at distant@colnumber @\ST at distant@rownumber}% les coordonn\'ees de la r\'ef\'erence
+ \edef\ST at temp@formula{\ST at distant@colnumber @\ST at distant@rownumber}% les coordonn\xE9es de la r\xE9f\xE9rence
\let\ST at next@search\relax
}%
\ST at illegal@relativeref
@@ -769,7 +882,7 @@
\ST at next@search
}
-% cette commande teste si la sc #1 est syntaxiquement une r\'ef\'erence
+% cette commande teste si la sc #1 est syntaxiquement une r\xE9f\xE9rence
\def\ST at ifref#1{%
\let\ST at temp@formula#1%
\let\ST at ref@found\@empty
@@ -787,19 +900,19 @@
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%% Le noyau : \'evaluation de toutes les cellules %%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%% Le noyau : \xE9valuation de toutes les cellules %%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Essaie de calculer la cellule (#1,#2)
\def\ST at try@calc at cell(#1,#2){%
- \ST at ifvalid@csname{formula@#1@#2}% on v\'erifie que la formule existe
+ \ST at ifvalid@csname{formula@#1@#2}% on v\xE9rifie que la formule existe
{\expandafter\ifx\csname formula@#1@#2\endcsname\@empty
- \@namedef{code@#1@#2}{0}% si vide, code \'a 0
+ \@namedef{code@#1@#2}{0}% si vide, code \xE0 0
\else% et qu'elle est non vide
\def\ST at current@colnumber{#1}\def\ST at current@rownumber{#2}%
\expandafter\ST at find@firST at func\csname formula@#1@#2\endcsname% cherche une fonction dans la formule
\ifx\@empty\ST at function@namefound% s'il n'y a pas de fonction
\expandafter\ST at findref@informula\csname formula@#1@#2\endcsname\ST at coord
- \ifx\@empty\ST at coord% ni de r\'ef\'erence
+ \ifx\@empty\ST at coord% ni de r\xE9f\xE9rence
\ST at calc@cell(#1,#2)% on va la calculer la cellule
\fi
\fi
@@ -808,39 +921,39 @@
{}%
}
-\def\ST at calc@cell(#1,#2){% calcule la formule num\'erique de la cellule (#1,#2)
+\def\ST at calc@cell(#1,#2){% calcule la formule num\xE9rique de la cellule (#1,#2)
\unless\ifnum\csname code@#1@#2\endcsname<\@ne% si le code est >= 1
- \expandafter\let\expandafter\ST at temp@a\csname formula@#1@#2\endcsname% \ST at temp@a est le contenu de la formule
+ \ST at cslet\ST at temp@a{formula@#1@#2}% \ST at temp@a est le contenu de la formule
\ST at Iffirstis\ST at temp@a-{\expandafter\def\expandafter\ST at temp@a\expandafter{\expandafter0\ST at temp@a}}{}%
- \FPeval\ST at temp@a\ST at temp@a% on calcule cette formule
- \unless\ifx\ST at rounddigit\@empty\FPround\ST at temp@a\ST at temp@a\ST at rounddigit\fi% on arrondi s'il faut
+ \STeval\ST at temp@a\ST at temp@a% on calcule cette formule
+ \unless\ifx\STrounddigit\@empty\STround\ST at temp@a\ST at temp@a\STrounddigit\fi% on arrondi s'il faut
\ifST at clipround% on arrondit en enlevant les 0 inutiles ?
- \FPclip\ST at temp@a\ST at temp@a
+ \STclip\ST at temp@a\ST at temp@a
\else% si on laisse certains 0 inutiles
- \unless\ifx\ST at rounddigit\@empty% on ne tronque que si le nombre n'est pas vide
- \FPtrunc\ST at temp@a\ST at temp@a\ST at rounddigit
+ \unless\ifx\STrounddigit\@empty% on ne tronque que si le nombre n'est pas vide
+ \STtrunc\ST at temp@a\ST at temp@a\STrounddigit
\fi
\fi
- \ST at letname{formula@#1@#2}\ST at temp@a% assigne le r\'esultat \'a la formule
- \@namedef{code@#1@#2}{2}% et met le code \'a 2 (cellule calcul\'ee)
+ \ST at letname{formula@#1@#2}\ST at temp@a% assigne le r\xE9sultat \xE0 la formule
+ \@namedef{code@#1@#2}{2}% et met le code \xE0 2 (cellule calcul\xE9e)
\fi
}
% Calcule toutes les formules du tableau
-\def\ST at eval@tab{%
+\def\STeval at tab{%
\ST at rowcount\@ne\ST at colcount\@ne
- \ST at eval@tab at i
+ \STeval at tab@i
}
-\def\ST at eval@tab at i{%
+\def\STeval at tab@i{%
\ifnum\ST at rowcount>\ST at total@rownumber
\let\ST at nextcell\relax
\else
\ST at ifvalid@csname{formula@\number\ST at colcount @\number\ST at rowcount}% si la formule existe
- {\ST at eval@cell(\number\ST at colcount,\number\ST at rowcount)}% on la calcule
+ {\STeval at cell(\number\ST at colcount,\number\ST at rowcount)}% on la calcule
{}%
\advance\ST at colcount\@ne
- \let\ST at nextcell\ST at eval@tab at i
+ \let\ST at nextcell\STeval at tab@i
\ifnum\ST at colcount>\ST at total@colnumber
\ST at colcount\@ne
\advance\ST at rowcount\@ne
@@ -850,7 +963,7 @@
}
% la sc #1 est le nom d'une fonction.
-% La macro renvoie dans la sc #2 : 1, 2 ou 2 selon que #1 est le nom d'une macro \'a argument num\'erique, \'a argument plage ou \'a argument texte.
+% La macro renvoie dans la sc #2 : 1, 2 ou 2 selon que #1 est le nom d'une macro \xE0 argument num\xE9rique, \xE0 argument plage ou \xE0 argument texte.
% #2 est vaut 0 si #1 n'est pas le nom d'une fonction
\def\ST at determine@function at code#1#2{%
\ST at Ifinstr{\ST at functions@with at num@arg,}{#1,}%
@@ -864,12 +977,12 @@
}%
}
-% \'Evalue la cellule (#1#2) par ses coordonn\'ees num\'eriques (col,row)
-\def\ST at eval@cell(#1,#2){%
+% \xE9value la cellule (#1#2) par ses coordonn\xE9es num\xE9riques (col,row)
+\def\STeval at cell(#1,#2){%
\edef\ST at dependance@tree{(#1,#2)}% FIXME : mettre \edef
\let\ST at stackcall\@empty
\let\ST at function@namesaved\@empty
- \ST at eval@cell at i(#1,#2)% on appelle la macro r\'ecursive
+ \STeval at cell@i(#1,#2)% on appelle la macro r\xE9cursive
\ifST at message
\let\ST at deptree\@empty
\ST at show@dependance at tree
@@ -878,88 +991,88 @@
\fi
}
-% Ceci est la macro principale : elle \'evalue la cellule (#1,#2)
-\def\ST at eval@cell at i(#1,#2){% #1 = no colonne #2 = no ligne
- \ifnum\csname code@#1@#2\endcsname=\@ne% on ne fait quelque chose que si le code est 1 : cellule non calcul\'ee
+% Ceci est la macro principale : elle \xE9value la cellule (#1,#2)
+\def\STeval at 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\xE9e
\def\ST at current@colnumber{#1}\def\ST at current@rownumber{#2}%
\expandafter\ST at find@firST at func\csname formula@#1@#2\endcsname% cherche une fonction dans la formule
\ifx\@empty\ST at function@namefound% il n'y a pas de fonction
\IfSubStr[2]\ST at dependance@tree{(#1,#2)}%
- {\edef\ST at coord{#1,#2}\ST at circular@reference}% message et on s'arr\^ete si r\'ef\'erence circulaire
+ {\edef\ST at coord{#1,#2}\ST at circular@reference}% message et on s'arr\xEAte si r\xE9f\xE9rence circulaire
{}%
- \expandafter\ST at findref@informula\csname formula@#1@#2\endcsname\ST at coord% y a t-il une r\'ef\'erence dans l'argument ?
- \ifx\ST at coord\@empty% pas de r\'ef\'erence dans l'argument
- \ifx\ST at function@namesaved\@empty% si aucune fonction n'a \'et\'e d\'ecel\'ee
+ \expandafter\ST at findref@informula\csname formula@#1@#2\endcsname\ST at coord% y a t-il une r\xE9f\xE9rence dans l'argument ?
+ \ifx\ST at coord\@empty% pas de r\xE9f\xE9rence dans l'argument
+ \ifx\ST at function@namesaved\@empty% si aucune fonction n'a \xE9t\xE9 d\xE9cel\xE9e
\ST at calc@cell(#1,#2)% on calcule la cellule en cours
\else
- \ST at Ifinstr{\ST at functions@with at textresult,}{\ST at function@namesaved,}% si la derni\`ere fonction rend du texte
+ \ST at Ifinstr{\ST at functions@with at textresult,}{\ST at function@namesaved,}% si la derni\xE8re fonction rend du texte
{\ifx\ST at stackcall\@empty% et si on est dans la cellule source
- \@namedef{code@#1@#2}{0}% on met le code \'a 0, la cellule devient textuelle
+ \@namedef{code@#1@#2}{0}% on met le code \xE0 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 at letname{formula@#1@#2}\@empty% et plus rien dans la formule
\else
- \ST at calc@cell(#1,#2)% sinon, on se trouve dans une cellule appel\'ee par une macrofonction et donc, on la calcule
+ \ST at calc@cell(#1,#2)% sinon, on se trouve dans une cellule appel\xE9e par une macrofonction et donc, on la calcule
\fi
}%
- {\ST at calc@cell(#1,#2)}% c'est une fonction qui donne un arg num\'erique : on calcule la cellule en cours
+ {\ST at calc@cell(#1,#2)}% c'est une fonction qui donne un arg num\xE9rique : on calcule la cellule en cours
\fi
\else
\ST at ifvalid@csname{code@\ST at coord}% le code distant exite ?
{\ifcase\csname code@\ST at coord\endcsname% code distant = 0 ==> cellule vide ou textuelle, pas bon du tout !
- \edef\ST at temp@callcell{#1,#2}% coordonn\'ees de la cellule appelante
- \edef\ST at coord{\ST at distant@colnumber,\ST at distant@rownumber}% coordonn\'ees appel\'ees
- \ST at zerocodecell@cell% erreur : r\'ef\'erence \'a une cellule de code 0
+ \edef\ST at temp@callcell{#1,#2}% coordonn\xE9es de la cellule appelante
+ \edef\ST at coord{\ST at distant@colnumber,\ST at distant@rownumber}% coordonn\xE9es appel\xE9es
+ \ST at zerocodecell@cell% erreur : r\xE9f\xE9rence \xE0 une cellule de code 0
\or% code distant = 1
- \edef\ST at dependance@tree{\ST at dependance@tree(\ST at distant@colnumber,\ST at distant@rownumber)}% on l'ajoute \'a l'arbre des d\'ependances
- % on doit \'evaluer cette formule distante et ensuite, on doit encore recommence avec la formule en cours : on les ajoute sur la pile lifo
+ \edef\ST at dependance@tree{\ST at dependance@tree(\ST at distant@colnumber,\ST at distant@rownumber)}% on l'ajoute \xE0 l'arbre des d\xE9pendances
+ % on doit \xE9valuer cette formule distante et ensuite, on doit encore recommence avec la formule en cours : on les ajoute sur la pile lifo
\edef\ST at stackcall{(\ST at distant@colnumber,\ST at distant@rownumber)(#1,#2)\ST at stackcall}%
- \or% code distant = 2, la cellule distante est calcul\'ee, on cr\'e\'e un alias pour le contenu de la formule distante
- \expandafter\let\expandafter\ST at distant@formula\csname formula@\ST at coord\endcsname
- % si la valeur distante est <0, on la met entre parenth\`eses
+ \or% code distant = 2, la cellule distante est calcul\xE9e, on cr\xE9\xE9 un alias pour le contenu de la formule distante
+ \ST at cslet\ST at distant@formula{formula@\ST at coord}%
+ % si la valeur distante est <0, on la met entre parenth\xE8ses
\ST at Iffirstis\ST at distant@formula-%
{\expandafter\def\expandafter\ST at distant@formula\expandafter{\expandafter(\ST at distant@formula)}}%
{}%
- % on remplace toutes les r\'ef\'erences par la valeur distante
+ % on remplace toutes les r\xE9f\xE9rences par la valeur distante
\expandafter\ST at expsubst\csname formula@#1@#2\endcsname{\ST at ref@found|}\ST at distant@formula
- \edef\ST at stackcall{(#1,#2)\ST at stackcall}% puis, on \'evalue \'a nouveau cette cellule
+ \edef\ST at stackcall{(#1,#2)\ST at stackcall}% puis, on \xE9value \xE0 nouveau cette cellule
\else% code distant n'est pas {0,1,2} donc est -1, pas bon du tout !
- \edef\ST at temp@callcell{#1,#2}% coordonn\'ees de la cellule appelante
- \ST at subst\ST at coord @,% coordonn\'ees appel\'ees
- \ST at multicol@cell
+ \edef\ST at temp@callcell{#1,#2}% coordonn\xE9es de la cellule appelante
+ \ST at subst\ST at coord @,% coordonn\xE9es appel\xE9es
+ \STmulticol at cell
\fi}%
- {\edef\ST at temp@callcell{#1,#2}% coordonn\'ees de la cellule appelante
- \ST at subst\ST at coord @,% coordonn\'ees appel\'ees
+ {\edef\ST at temp@callcell{#1,#2}% coordonn\xE9es de la cellule appelante
+ \ST at subst\ST at coord @,% coordonn\xE9es appel\xE9es
\ST at undefined@cell% code distant inexistant -> cellule hors limite du tableau
}%
\fi
\else% il y a une fonction dans la formule
\let\ST at function@namesaved\ST at function@namefound
- \ST at determine@function at code\ST at function@namefound\ST at codefunc% d\'etermine le code de la fonction
+ \ST at determine@function at code\ST at function@namefound\ST at codefunc% d\xE9termine le code de la fonction
\ifcase\ST at codefunc\relax
\PackageError\STname{This error should not occur! Please email the author. Thanks.}{}%
- \or% le code vaut 1, c'est une fonction \'a argument num\'erique
- \ST at findref@informula\ST at function@argfound\ST at temp@formula% y a t-il une r\'ef\'erence dans l'argument de la formule ?
- \ifx\ST at temp@formula\@empty% pas de r\'ef\'erence dans l'argument de la fonction
- \expandafter\let\expandafter\ST at current@formula\csname formula@#1@#2\endcsname% alias pour la formule
+ \or% le code vaut 1, c'est une fonction \xE0 argument num\xE9rique
+ \ST at findref@informula\ST at function@argfound\ST at temp@formula% y a t-il une r\xE9f\xE9rence dans l'argument de la formule ?
+ \ifx\ST at temp@formula\@empty% pas de r\xE9f\xE9rence dans l'argument de la fonction
+ \ST at cslet\ST at current@formula{formula@#1@#2}% alias pour la formule
\let\ST at tobereplaced\ST at function@namefound
- \ST at expadd@tomacro\ST at tobereplaced{\expandafter(\ST at function@argfound)}% ce qui va \^etre replac\'e : fonction(argument)
+ \ST at expadd@tomacro\ST at tobereplaced{\expandafter(\ST at function@argfound)}% ce qui va \xEAtre replac\xE9 : fonction(argument)
\ST at Ifinstr{\ST at functions@no at calc@arg,}{\ST at function@namefound,}% doit-on calculer l'argument de cette fonction ?
{}%
- {\FPeval\ST at function@argfound\ST at function@argfound\FPclip\ST at function@argfound\ST at function@argfound}%
- \csname ST at func@\ST at function@namefound\endcsname\ST at function@argfound\ST at result@func% puis on \'evalue la fonctionfound
+ {\STeval\ST at function@argfound\ST at function@argfound\STclip\ST at function@argfound\ST at function@argfound}%
+ \csname ST at func@\ST at function@namefound\endcsname\ST at function@argfound\ST at result@func% puis on \xE9value la fonctionfound
\ST at Iffirstis\ST at result@func-{\expandafter\def\expandafter\ST at result@func\expandafter{\expandafter(\ST at result@func)}}{}%
\ST at expsubst\ST at current@formula\ST at tobereplaced\ST at result@func% on replace dans l'alias
\ST at letname{formula@#1@#2}\ST at current@formula% on l'assigne dans la formule
- \ifx\@empty\ST at current@formula% pour cause de macro fonction "tag" qui est seule et qui a disparue apr\`es substitution
+ \ifx\@empty\ST at current@formula% pour cause de macro fonction "tag" qui est seule et qui a disparue apr\xE8s substitution
\@namedef{code@#1@#2}{0}%
\else
- \edef\ST at stackcall{(#1,#2)\ST at stackcall}% puis, on \'evalue \'a nouveau cette cellule
+ \edef\ST at stackcall{(#1,#2)\ST at stackcall}% puis, on \xE9value \xE0 nouveau cette cellule
\fi
\else
- \ifnum\csname code@\ST at temp@formula\endcsname=\tw@% si la r\'ef\'erence est calcul\'ee, on la replace par sa valeur
- \expandafter\let\expandafter\ST at current@formula\csname formula@\ST at temp@formula\endcsname% alias pour la formule distante
+ \ifnum\csname code@\ST at temp@formula\endcsname=\tw@% si la r\xE9f\xE9rence est calcul\xE9e, on la replace par sa valeur
+ \ST at cslet\ST at current@formula{formula@\ST at temp@formula}% alias pour la formule distante
\ST at Iffirstis\ST at current@formula-%
{\expandafter\def\expandafter\ST at current@formula\expandafter{\expandafter(\ST at current@formula)}}%
{}%
@@ -970,36 +1083,36 @@
\ST at subst\ST at tobereplaced|{}%
\expandafter\ST at expsubst\csname formula@#1@#2\endcsname\ST at tobereplaced\ST at replaced
\edef\ST at stackcall{(#1,#2)\ST at stackcall}%
- \else% la r\'ef\'erence n'est pas calcul\'ee, donc d'abord il faut
- \edef\ST at stackcall{(\ST at distant@colnumber,\ST at distant@rownumber)(#1,#2)\ST at stackcall}% l'\'evaluer, et ensuite r\'e-evaluer la cellule courante
- \edef\ST at dependance@tree{\ST at dependance@tree(\ST at distant@colnumber,\ST at distant@rownumber)}% mise \'a jour de l'arbre des d\'ependances
+ \else% la r\xE9f\xE9rence n'est pas calcul\xE9e, donc d'abord il faut
+ \edef\ST at stackcall{(\ST at distant@colnumber,\ST at distant@rownumber)(#1,#2)\ST at stackcall}% l'\xE9valuer, et ensuite r\xE9-evaluer la cellule courante
+ \edef\ST at dependance@tree{\ST at dependance@tree(\ST at distant@colnumber,\ST at distant@rownumber)}% mise \xE0 jour de l'arbre des d\xE9pendances
\fi
\fi
- \or% le code vaut 2, c'est une fonction \'a argument «plage de cellules»
+ \or% le code vaut 2, c'est une fonction \xE0 argument \xABplage de cellules\xBB
\let\ST at tobereplaced\ST at function@namefound\ST at expadd@tomacro\ST at tobereplaced{\expandafter(\ST at function@argfound)}%
- \csname ST at func@\ST at function@namefound\endcsname\ST at function@argfound\ST at result@func% puis on essaie d'\'evaluer la fonction
+ \csname ST at func@\ST at function@namefound\endcsname\ST at function@argfound\ST at result@func% puis on essaie d'\xE9valuer la fonction
\unless\ifx\ST at result@func\@empty% si le calcul a abouti
\ST at Iffirstis\ST at result@func-{\expandafter\def\expandafter\ST at result@func\expandafter{\expandafter(\ST at result@func)}}{}%
\expandafter\ST at expsubst\csname formula@#1@#2\endcsname\ST at tobereplaced\ST at result@func% on replace dans la formule
- \edef\ST at stackcall{(#1,#2)\ST at stackcall}% puis, on \'evalue \'a nouveau cette cellule
+ \edef\ST at stackcall{(#1,#2)\ST at stackcall}% puis, on \xE9value \xE0 nouveau cette cellule
\fi
\or% le code vaut 3, c'est un fonction dont l'argument est textuel
\let\ST at function@argfound at edefed\ST at function@argfound
\ST at Ifinstr{\ST at functions@with at assign@argument,}{\ST at function@namefound,}%
{\let\ST at temp@formula\@empty}%
- {\ST at findref@informula\ST at function@argfound\ST at temp@formula}% y a t-il une r\'ef\'erence dans l'argument de la fonction ?
- \ifx\ST at temp@formula\@empty% pas de r\'ef\'erence dans l'argument de la fonction
- \expandafter\let\expandafter\ST at current@formula\csname formula@#1@#2\endcsname% alias pour la formule
+ {\ST at findref@informula\ST at function@argfound\ST at temp@formula}% y a t-il une r\xE9f\xE9rence dans l'argument de la fonction ?
+ \ifx\ST at temp@formula\@empty% pas de r\xE9f\xE9rence dans l'argument de la fonction
+ \ST at cslet\ST at current@formula{formula@#1@#2}% alias pour la formule
\let\ST at tobereplaced\ST at function@namefound
- \ST at expadd@tomacro\ST at tobereplaced{\expandafter(\ST at function@argfound)}% ce qui va \^etre remplac\'e : fonction(argument)
- \csname ST at func@\ST at function@namefound\endcsname\ST at function@argfound at edefed\ST at result@func% puis on \'evalue la fonction
+ \ST at expadd@tomacro\ST at tobereplaced{\expandafter(\ST at function@argfound)}% ce qui va \xEAtre remplac\xE9 : fonction(argument)
+ \csname ST at func@\ST at function@namefound\endcsname\ST at function@argfound at edefed\ST at result@func% puis on \xE9value la fonction
\ST at expsubst\ST at current@formula\ST at tobereplaced\ST at result@func% on replace dans l'alias
\ST at letname{formula@#1@#2}\ST at current@formula% on l'assigne dans la formule
- \edef\ST at stackcall{(#1,#2)\ST at stackcall}% puis, on \'evalue \'a nouveau cette cellule
- \else% il y a une r\'ef\'erence dans l'argument de la fontion
- \ifnum\csname code@\ST at temp@formula\endcsname=\z@% si la r\'ef\'erence est une cellule texte
- \expandafter\let\expandafter\ST at current@formula\csname text@\ST at temp@formula\endcsname% alias pour la zone texte distante
- \StrDel[1]\ST at current@formula\STnumericfieldmarker[\ST at current@formula]% on enl\`eve le := si besoin
+ \edef\ST at stackcall{(#1,#2)\ST at stackcall}% puis, on \xE9value \xE0 nouveau cette cellule
+ \else% il y a une r\xE9f\xE9rence dans l'argument de la fontion
+ \ifnum\csname code@\ST at temp@formula\endcsname=\z@% si la r\xE9f\xE9rence est une cellule texte
+ \ST at cslet\ST at current@formula{text@\ST at temp@formula}% alias pour la zone texte distante
+ \StrDel[1]\ST at current@formula\STnumericfieldmarker[\ST at current@formula]% on enl\xE8ve le := si besoin
\ST at Ifinstr\ST at current@formula{\@empty\multicolumn}% on ne prend que le texte s'il y a un \multicolumn qui traine
{\ST at thirdarg@after\ST at current@formula\multicolumn\ST at current@formula}
{}%
@@ -1006,11 +1119,11 @@
\let\ST at tobereplaced\ST at function@namefound
\ST at expadd@tomacro\ST at tobereplaced{\expandafter(\ST at function@argfound)}%
\ST at subst\ST at tobereplaced|{}%
- \csname ST at func@\ST at function@namefound\endcsname\ST at current@formula\ST at result@func% puis on \'evalue la fonction
+ \csname ST at func@\ST at function@namefound\endcsname\ST at current@formula\ST at result@func% puis on \xE9value la fonction
\expandafter\ST at expsubst\csname formula@#1@#2\endcsname\ST at tobereplaced\ST at result@func
- \edef\ST at stackcall{(#1,#2)\ST at stackcall}% puis, on \'evalue \'a nouveau cette cellule
+ \edef\ST at stackcall{(#1,#2)\ST at stackcall}% puis, on \xE9value \xE0 nouveau cette cellule
\else
- \PackageError\STname{Macro function \ST at function@namefound\space requires a reference to a text cell!}\ST at seedoc@i
+ \PackageError\STname{Macro function \ST at function@namefound\space requires a reference to a text cell!}\STseedoc at i
\fi
\fi
\fi
@@ -1020,18 +1133,18 @@
}
% On regarde s'il y a des appels de calcul de cellules en attente
-% Si oui, on enl\`eve le 1er appel de la pile lifo et on l'ex\'ecute
+% Si oui, on enl\xE8ve le 1er appel de la pile lifo et on l'ex\xE9cute
\def\ST at next@onstack{%
\unless\ifx\ST at stackcall\@empty
\ST at split\ST at stackcall)\ST at temp@a\ST at stackcall
- \ST at add@tomacro\ST at temp@a)%
+ \STadd at tomacro\ST at temp@a)%
\ST at sanitize@stack
- \expandafter\def\expandafter\ST at temp@a\expandafter{\expandafter\ST at eval@cell at i\ST at temp@a}%
+ \expandafter\def\expandafter\ST at temp@a\expandafter{\expandafter\STeval at cell@i\ST at temp@a}%
\expandafter\ST at temp@a
\fi
}
-\def\ST at sanitize@stack{% enl\`eve de \ST at stackcall toutes les occurrences de \ST at temp@a
+\def\ST at sanitize@stack{% enl\xE8ve de \ST at stackcall toutes les occurrences de \ST at temp@a
\ST at Ifinstr\ST at stackcall\ST at temp@a
{\expandafter\ST at subst\expandafter\ST at stackcall\expandafter{\ST at temp@a}{}%
\ST at sanitize@stack
@@ -1043,39 +1156,14 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Macro-fonctions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% liste des fonctions dont l'argument est num\'erique
-\def\ST at functions@with at num@arg{%
- id,fact,ifeq,ifgt,iflt,numtofrshortdate,numtoengshortdate,numtofrlongdate,gcd,lcm,%
- numtoenglongdate,numtofrmonth,numtoengmonth,numtofrday,numtoengday}
-
-% liste des fonctions dont l'argument est une plage ou est vide
-\def\ST at functions@with at range@arg{sum,rand,randint,sumprod}
-
-% liste des fonctions dont l'argument est un texte
-\def\ST at functions@with at text@arg{frshortdatetonum,engshortdatetonum,englongdatetonum,frlongdatetonum,scitodec,tag,row,col,cell,value}
-
-% liste des fonctions dont l'argument ne doit pas \^etre calcul\'e
-\def\ST at functions@no at calc@arg{ifeq,ifgt,iflt,gcd,lcm,value}
-
-% liste des fonctions dont l'argument est une variable -> il ne faut donc pas aller chercher des r\'ef\'erences dans l'argument
-\def\ST at functions@with at assign@argument{tag,row,col,cell,value}
-
-% liste des fonctions dont le r\'esultat est un texte
-\def\ST at functions@with at textresult{%
- numtofrshortdate,numtoengshortdate,numtofrlongdate,numtoenglongdate,%
- numtofrmonth,numtoengmonth,numtofrday,numtoengday}
-
-% liste totale des fonctions
-\edef\ST at functions@list{\ST at functions@with at range@arg,\ST at functions@with at num@arg,\ST at functions@with at text@arg}
-
-\def\ST at for#1#2{% \ST at for{#1}{code} -> ex\'ecute le code pour toutes les cellules des plages pass\'ees en argument #1
+\def\ST at for#1#2{% \ST at for{#1}{code} -> ex\xE9cute le code pour toutes les cellules des plages pass\xE9es en argument #1
\def\ST at forcode{#2}%
\expandafter\def\expandafter\ST at for@rangelist\expandafter{#1;}%
\ST at for@i
}
-\def\ST at for@loopcode{% #2 est le code \'a ex\'ecuter dans la boucle for
- \ST at forcode% on ex\'ecute le code
+\def\ST at for@loopcode{% #2 est le code \xE0 ex\xE9cuter dans la boucle for
+ \ST at forcode% on ex\xE9cute le code
\let\ST at nextfor\ST at for@loopcode
\advance\ST at colcount@i\@ne
\ifnum\ST at colcount@i>\ST at for@col at end
@@ -1117,9 +1205,9 @@
\ST at nextfor
}
-% Cette macro cherche dans la sc #1 la premi\`ere fonction qu'elle trouve ne contenant pas d'autre fonction dans son argument
-% En sortie, \ST at function@namefound contient le nom de la fonction trouv\'ee et \ST at function@argfound son argument.
-% Si aucune fonction mot-cl\'e n'est trouv\'e, ces 2 derni\`eres s\'equences de contr\^oles sont vides.
+% Cette macro cherche dans la sc #1 la premi\xE8re fonction qu'elle trouve ne contenant pas d'autre fonction dans son argument
+% En sortie, \ST at function@namefound contient le nom de la fonction trouv\xE9e et \ST at function@argfound son argument.
+% Si aucune fonction mot-cl\xE9 n'est trouv\xE9, ces 2 derni\xE8res s\xE9quences de contr\xF4les sont vides.
\def\ST at find@firST at func#1{%
\let\ST at function@namefound\@empty\let\ST at function@argfound\@empty
\let\ST at function@namefound@\@empty\let\ST at function@argfound@\@empty
@@ -1128,17 +1216,17 @@
}
\def\ST at find@firST at func@i{%
- \edef\ST at tempfunctions@list{\ST at functions@list,}% r\'einitialise la liste
- \let\ST at tempfunc@\ST at tempfunc% sauveagrde pour restauration ult\'erieure
- \let\ST at function@namefound\@empty% initialise avant appel \'a la macro
- \ST at Ifinstr\ST at tempfunc(% s'il y a une parenth\`ese
+ \edef\ST at tempfunctions@list{\ST at functions@list,}% r\xE9initialise la liste
+ \let\ST at tempfunc@\ST at tempfunc% sauveagrde pour restauration ult\xE9rieure
+ \let\ST at function@namefound\@empty% initialise avant appel \xE0 la macro
+ \ST at Ifinstr\ST at tempfunc(% s'il y a une parenth\xE8se
{\ST at find@firST at func@ii% cherche la 1ere fonction dans l'argument
\ifx\ST at function@namefound\@empty% elle n'existe pas ?
- \let\ST at function@namefound\ST at function@namefound@\let\ST at function@argfound\ST at function@argfound@% on restaure les valeurs pr\'ec\'edentes
+ \let\ST at function@namefound\ST at function@namefound@\let\ST at function@argfound\ST at function@argfound@% on restaure les valeurs pr\xE9c\xE9dentes
\else% si il y a une fonction dans l'argument
- \ST at right\ST at tempfunc@\ST at function@namefound\ST at tempfunc% prend ce qui est apr\`es le nom de la fonction
- \ST at seekfunc@arg\ST at tempfunc\ST at function@argfound% isole l'argument entre parenth\`eses
- \let\ST at function@namefound@\ST at function@namefound\let\ST at function@argfound@\ST at function@argfound% met \'a jour les valeurs pr\'ec\'edentes
+ \ST at right\ST at tempfunc@\ST at function@namefound\ST at tempfunc% prend ce qui est apr\xE8s le nom de la fonction
+ \ST at seekfunc@arg\ST at tempfunc\ST at function@argfound% isole l'argument entre parenth\xE8ses
+ \let\ST at function@namefound@\ST at function@namefound\let\ST at function@argfound@\ST at function@argfound% met \xE0 jour les valeurs pr\xE9c\xE9dentes
\let\ST at tempfunc\ST at function@argfound% recommence avec l'argument
\expandafter\ST at find@firST at func@i
\fi}%
@@ -1147,11 +1235,11 @@
\def\ST at find@firST at func@ii{%
\unless\ifx\ST at tempfunc\@empty% tant que le contenu n'est pas vide
- \unless\ifx\ST at tempfunctions@list\@empty% et tant que tous les noms de fonctions n'ont pas \'et\'e explor\'es
+ \unless\ifx\ST at tempfunctions@list\@empty% et tant que tous les noms de fonctions n'ont pas \xE9t\xE9 explor\xE9s
\ST at split\ST at tempfunctions@list,\ST at current@funcname\ST at tempfunctions@list
\ST at Ifinstr\ST at tempfunc{\ST at current@funcname(}% si l'argument contient le nom de fonction courant
{\let\ST at function@namefound\ST at current@funcname
- \ST at left\ST at tempfunc{\ST at current@funcname(}\ST at tempfunc% on r\'eduit l'argument \'a ce qui est avant ce nom
+ \ST at left\ST at tempfunc{\ST at current@funcname(}\ST at tempfunc% on r\xE9duit l'argument \xE0 ce qui est avant ce nom
}%
{}%
\expandafter\expandafter\expandafter\ST at find@firST at func@ii
@@ -1159,25 +1247,25 @@
\fi
}
-% la sc #1 commence normalement (sinon, ça va gueuler) par une parenth\`ese
-% La macro trouve l'argument se trouvant entre les parenth\`eses les plus ext\'erieures
-% et l'assigne \'a la sc #2
+% la sc #1 commence normalement (sinon, \xE7a va gueuler) par une parenth\xE8se
+% La macro trouve l'argument se trouvant entre les parenth\xE8ses les plus ext\xE9rieures
+% et l'assigne \xE0 la sc #2
\def\ST at seekfunc@arg#1#2{%
\begingroup
- \everyeof{\ST at nil}% met un \@nil \`a la fin du fichier virtuel
+ \everyeof{\ST at nil}% met un \@nil \xE0 la fin du fichier virtuel
\endlinechar\m at ne
\catcode\z at 12
\catcode`(=1 \catcode`)=2
\afterassignment\ST at gobble@remain
- \expandafter\def\expandafter\ST at temp@a\scantokens\expandafter{#1}% Attentionn !!! Il peut rester des ) non équilibrées
+ \expandafter\def\expandafter\ST at temp@a\scantokens\expandafter{#1}% Attentionn !!! Il peut rester des ) non \xE9quilibr\xE9es
\catcode`(=12 \catcode`)=12
\def\ST at assign@result##1\ST at nil{\endgroup\def#2{##1}}%
\expandafter\ST at assign@result\scantokens\expandafter{\ST at temp@a}% on fait l'assignation
}
-\def\ST at func@sum#1#2{% #1 est la sc contenant la plage de valeurs, #2 est la sc recevant le r\'esultat
- \def#2{0}% r\'esultat nul pour l'instant
- \let\ST at temp@stack\@empty% pile d'appel temporaire vide aussi au d\'ebut
+\def\ST at func@sum#1#2{% #1 est la sc contenant la plage de valeurs, #2 est la sc recevant le r\xE9sultat
+ \def#2{0}% r\xE9sultat nul pour l'instant
+ \let\ST at temp@stack\@empty% pile d'appel temporaire vide aussi au d\xE9but
\ST at for{#1}% on parcourt la <plage de cellules>
{\ifnum\numexpr10000*(\ST at colcount@i-\ST at current@colnumber)+\ST at rowcount@i-\ST at current@rownumber=\z@
\ST at invalid@range% si la cellule courante est dans la plage, erreur
@@ -1186,21 +1274,21 @@
\or% code=1
\edef\ST at temp@stack{\ST at temp@stack(\number\ST at colcount@i,\number\ST at rowcount@i)}%
\or% code=2
- \ifx\ST at temp@stack\@empty% on ne prend la peine d'additionner que si toutes les cellules sont calcul\'ees
- \expandafter\FPadd\expandafter#2\expandafter#2\csname formula@\number\ST at colcount@i @\number\ST at rowcount@i\endcsname
- \edef\ST at dependance@tree{\ST at dependance@tree(\number\ST at colcount@i,\number\ST at rowcount@i)}% mise \'a jour de l'arbre des d\'ependances
+ \ifx\ST at temp@stack\@empty% on ne prend la peine d'additionner que si toutes les cellules sont calcul\xE9es
+ \expandafter\STadd\expandafter#2\expandafter#2\csname formula@\number\ST at colcount@i @\number\ST at rowcount@i\endcsname
+ \edef\ST at dependance@tree{\ST at dependance@tree(\number\ST at colcount@i,\number\ST at rowcount@i)}% mise \xE0 jour de l'arbre des d\xE9pendances
\fi
\fi
}%
- \ifx\ST at temp@stack\@empty% toutes les cellules dans la plage \'etaient calcul\'ees ?
- \FPclip#2#2% on \^ote les 0 inutiles si le calcul a \'et\'e men\'e au bout
+ \ifx\ST at temp@stack\@empty% toutes les cellules dans la plage \xE9taient calcul\xE9es ?
+ \STclip#2#2% on \xF4te les 0 inutiles si le calcul a \xE9t\xE9 men\xE9 au bout
\else
\let#2\@empty
- \edef\ST at stackcall{\ST at temp@stack(\ST at current@colnumber,\ST at current@rownumber)\ST at stackcall}% on met \'a jour la pile d'appel
+ \edef\ST at stackcall{\ST at temp@stack(\ST at current@colnumber,\ST at current@rownumber)\ST at stackcall}% on met \xE0 jour la pile d'appel
\fi
}
-\def\ST at func@sumprod#1#2{% #1 est la sc contenant la plage de valeurs, #2 est la sc recevant le r\'esultat
+\def\ST at func@sumprod#1#2{% #1 est la sc contenant la plage de valeurs, #2 est la sc recevant le r\xE9sultat
\ST at left{#1;};\ST at firstmat
\ST at right#1;\ST at othermat
\ST at left\ST at firstmat{\@empty:}\ST at temp@a
@@ -1212,7 +1300,7 @@
\edef\ST at matcol{\number\numexpr\ST at distant@colnumber-\ST at mat@firstcol}%
\edef\ST at matrow{\number\numexpr\ST at distant@rownumber-\ST at mat@firstrow}%
\ST at count\@ne
- \loop% regarde si toutes les matrices ont la m\^eme dimension que la 1ere et pour chacune, calcule les vecteurs de d\'ecalage par rapport \'a la premi\`ere
+ \loop% regarde si toutes les matrices ont la m\xEAme dimension que la 1ere et pour chacune, calcule les vecteurs de d\xE9calage par rapport \xE0 la premi\xE8re
\unless\ifx\ST at othermat\@empty
\ST at left{\ST at othermat;};\ST at currentmat
\ST at right{\ST at othermat;};\ST at othermat
@@ -1230,137 +1318,114 @@
\unless\ifnum\ST at matrow=\ST at currentmatrow\ST at unmatch@matrixdim\fi% la dimension verticale ne correspond pas
\advance\ST at count\@ne
\repeat
- \let\ST at temp@stack\@empty% pile d'appel temporaire vide au d\'ebut
- \edef\ST at numbermat{\number\ST at count}% c'est le nombre de matrices \'a multiplier
- \def#2{0}% r\'esultat nul pour l'instant
+ \let\ST at temp@stack\@empty% pile d'appel temporaire vide au d\xE9but
+ \edef\ST at numbermat{\number\ST at count}% c'est le nombre de matrices \xE0 multiplier
+ \def#2{0}% r\xE9sultat nul pour l'instant
\ST at for{\ST at firstmat}% pour chaque cellule de la 1ere matrice
- {\def\ST at inter@result{0}% r\'esultat partiel nul pour l'instant
+ {\def\ST at inter@result{0}% r\xE9sultat partiel nul pour l'instant
\ifcase\csname code@\number\ST at colcount@i @\number\ST at rowcount@i\endcsname
\or% code =1
\edef\ST at temp@stack{\ST at temp@stack(\number\ST at colcount@i,\number\ST at rowcount@i)}%
- \edef\ST at dependance@tree{\ST at dependance@tree(\number\ST at colcount@i,\number\ST at rowcount@i)}% mise \'a jour de l'arbre des d\'ependances
+ \edef\ST at dependance@tree{\ST at dependance@tree(\number\ST at colcount@i,\number\ST at rowcount@i)}% mise \xE0 jour de l'arbre des d\xE9pendances
\or% code=2
- \expandafter\let\expandafter\ST at inter@result\csname formula@\number\ST at colcount@i @\number\ST at rowcount@i\endcsname
+ \ST at cslet\ST at inter@result{formula@\number\ST at colcount@i @\number\ST at rowcount@i}%
\fi
\ST at count\@ne
\loop% on multiplie tous les nombres qui se correspondent dans les matrices
\edef\ST at tempcoord{\number\numexpr\ST at colcount@i+\csname ST at vectorcol@\romannumeral\ST at count\endcsname @\number\numexpr\ST at rowcount@i+\csname ST at vectorrow@\romannumeral\ST at count\endcsname}%
\ifcase\csname code@\ST at tempcoord\endcsname
- \def\ST at inter@result{0}% code =0 -> on met le r\'esultat partiel \'a 0
+ \def\ST at inter@result{0}% code =0 -> on met le r\xE9sultat partiel \xE0 0
\or% code =1
\ST at subst\ST at tempcoord @,%
\edef\ST at temp@stack{\ST at temp@stack(\ST at tempcoord)}%
- \edef\ST at dependance@tree{\ST at dependance@tree(\ST at tempcoord)}% mise \'a jour de l'arbre des d\'ependances
+ \edef\ST at dependance@tree{\ST at dependance@tree(\ST at tempcoord)}% mise \xE0 jour de l'arbre des d\xE9pendances
\or% code=2
- \expandafter\FPmul\expandafter\ST at inter@result\expandafter\ST at inter@result\csname formula@\ST at tempcoord\endcsname
+ \expandafter\STmul\expandafter\ST at inter@result\expandafter\ST at inter@result\csname formula@\ST at tempcoord\endcsname
\else
- \def\ST at inter@result{0}% code = autre -> on met le r\'esultat partiel \'a 0
+ \def\ST at inter@result{0}% code = autre -> on met le r\xE9sultat partiel \xE0 0
\fi
\advance\ST at count\@ne
\ifnum\ST at count<\ST at numbermat
\repeat
- \FPadd#2#2\ST at inter@result
+ \STadd#2#2\ST at inter@result
}%
- \ifx\ST at temp@stack\@empty% toutes les cellules dans la plage \'etaient calcul\'ees ?
- \FPclip#2#2% on \^ote les 0 inutiles si le calcul a \'et\'e men\'e au bout
+ \ifx\ST at temp@stack\@empty% toutes les cellules dans la plage \xE9taient calcul\xE9es ?
+ \STclip#2#2% on \xF4te les 0 inutiles si le calcul a \xE9t\xE9 men\xE9 au bout
\else
\let#2\@empty
- \edef\ST at stackcall{\ST at temp@stack(\ST at current@colnumber,\ST at current@rownumber)\ST at stackcall}% on met \'a jour la pile d'appel
+ \edef\ST at stackcall{\ST at temp@stack(\ST at current@colnumber,\ST at current@rownumber)\ST at stackcall}% on met \xE0 jour la pile d'appel
\fi
}
\def\ST at func@id#1#2{\expandafter\def\expandafter#2\expandafter{#1}}
-% Calcule la factorielle du nombre #1 et met le r\'esultat dans la sc #2
-\def\ST at func@fact#1#2{%
- \FPifint{#1}%
- \FPifgt{#1}{18}%
- \ST at fact@outofrange
- \else
- \FPifpos{#1}%
- \edef#2{%
- \ifcase#1 1\or1\or2\or6\or24\or120\or720\or5040\or40320\or362880\or3628800\or39916800\or479001600\or
- 6227020800\or87178291200\or1307674368000\or20922789888000\or355687428096000\or6402373705728000\fi}%
- \else
- \ST at fact@outofrange
- \fi
- \fi
- \else
- \ST at fact@outofrange
- \fi
-}
-
\newif\ifST at gcd
-\def\ST at arithmetic#1#2{% #1 est une liste de nombres s\'epar\'es par des virgules, #2 la sc qui reçoit leur pgcd ou ppcm selon \ifST at gcd
+\def\ST at arithmetic#1#2{% #1 est une liste de nombres s\xE9par\xE9s par des virgules, #2 la sc qui re\xE7oit leur pgcd ou ppcm selon \ifST at gcd
\ST at split{#1},#2\ST at argB
\ST at Ifinstr\ST at argB,{\ST at split\ST at argB,\ST at argB\ST at remain\let\ST at next\ST at arithmetic}{\let\ST at remain\@empty\let\ST at next\@gobbletwo}%
\let\ST at argA#2%
- \FPeval\ST at argA\ST at argA\FPeval\ST at argB\ST at argB% \'evalue les 2 nombres au cas o\`u il y ait des op\'erations
- \FPeval#2{trunc(abs(max(\ST at argB,\ST at argA)),0)}%
- \FPeval\ST at argB{trunc(abs(min(\ST at argB,\ST at argA)),0)}%
- \FPifzero\ST at argB\else% si 0, on ignore puisque tous les nombres divisent 0 ou en sont leur multiple
- \ifST at gcd\else\FPmul\ST at argC#2\ST at argB\fi
+ \STeval\ST at argA\ST at argA\STeval\ST at argB\ST at argB% \xE9value les 2 nombres au cas o\xF9 il y ait des op\xE9rations
+ \STeval#2{trunc(abs(max(\ST at argB,\ST at argA)),0)}%
+ \STeval\ST at argB{trunc(abs(min(\ST at argB,\ST at argA)),0)}%
+ \STifzero\ST at argB\else% si 0, on ignore puisque tous les nombres divisent 0 ou en sont leur multiple
+ \ifST at gcd\else\STmul\ST at argC#2\ST at argB\fi
\loop
\let\ST at argA\ST at argB
- \FPeval\ST at argB{trunc(#2-trunc(#2/\ST at argB,0)*\ST at argB,0)}% reste de la division #2/\ST at argB
+ \STeval\ST at argB{trunc(#2-trunc(#2/\ST at argB,0)*\ST at argB,0)}% reste de la division #2/\ST at argB
\let#2\ST at argA
- \FPifzero\ST at argB\else
+ \STifzero\ST at argB\else
\repeat
- \ifST at gcd\else\FPeval#2{trunc(\ST at argC/#2,0)}\fi
+ \ifST at gcd\else\STeval#2{trunc(\ST at argC/#2,0)}\fi
\fi
- \csname @\ifST at gcd firstofone\else gobble\fi\endcsname{\FPifeq#21\let\ST at next\@gobbletwo\fi}% pour le pgcd, inutile de continuer si le pgcd est 1
+ \csname @\ifST at gcd firstofone\else gobble\fi\endcsname{\STifeq#21\let\ST at next\@gobbletwo\fi}% pour le pgcd, inutile de continuer si le pgcd est 1
\expandafter\expandafter\expandafter\ST at next\expandafter\expandafter\expandafter{\expandafter#2\expandafter,\ST at remain}#2%
}
-\def\ST at func@gcd#1#2{% #1 est une liste de nombres s\'epar\'es par des virgules, #2 la sc qui reçoit leur pgcd
+\def\ST at func@gcd#1#2{% #1 est une liste de nombres s\xE9par\xE9s par des virgules, #2 la sc qui re\xE7oit leur pgcd
\ST at gcdtrue\ST at arithmetic{#1}#2%
}
-\def\ST at func@lcm#1#2{% #1 est une liste de nombres s\'epar\'es par des virgules, #2 la sc qui reçoit leur ppcm
+\def\ST at func@lcm#1#2{% #1 est une liste de nombres s\xE9par\xE9s par des virgules, #2 la sc qui re\xE7oit leur ppcm
\ST at gcdfalse\ST at arithmetic{#1}#2%
}
-% d\'etermine la graine pour fp en fonction de la date et de l'heure
-\def\ST at seed{\FPseed\number\time\number\day\number\month}
-
% la fonction randint
-\def\ST at func@randint#1#2{% #1=sc contenant l'argument #2: sc recevant le r\'esultat
+\def\ST at func@randint#1#2{% #1=sc contenant l'argument #2: sc recevant le r\xE9sultat
\ST at Ifinstr#1,% s'il y a 2 nombres -> intervalle [nb1;nb2]
{\ST at split#1,\ST at limita\ST at limitb
- \FPifeq\ST at limita\ST at limitb\PackageError\STname{Macro function randint require two different numbers}\ST at seedoc@i\fi
- \FPifgt\ST at limita\ST at limitb
+ \STifeq\ST at limita\ST at limitb\PackageError\STname{Macro function randint require two different numbers}\STseedoc at i\fi
+ \STifgt\ST at limita\ST at limitb
\let\ST at temp@a\ST at limitb\let\ST at limitb\ST at limita\let\ST at limita\ST at temp@a
\fi
- \FPifint\ST at limita\else\ST at intarg@required\fi
- \FPifint\ST at limitb\else\ST at intarg@required\fi
- \FPrandom#2%
- \FPeval#2{trunc(trunc(#2*(\ST at limitb-\ST at limita+1),0)+\ST at limita,0)}%
+ \STifint\ST at limita\else\ST at intarg@required\fi
+ \STifint\ST at limitb\else\ST at intarg@required\fi
+ \STrandom#2%
+ \STeval#2{trunc(trunc(#2*(\ST at limitb-\ST at limita+1),0)+\ST at limita,0)}%
}%
- {\FPifint#1\else\ST at intarg@required\fi
- \FPrandom#2% s'il n'y a qu'un nombre -> intervalle [0;nb2]
- \FPeval#2{trunc(#2*(#1+1),0)}%
+ {\STifint#1\else\ST at intarg@required\fi
+ \STrandom#2% s'il n'y a qu'un nombre -> intervalle [0;nb2]
+ \STeval#2{trunc(#2*(#1+1),0)}%
}%
}
-\def\ST at func@rand#1#2{\FPrandom#2}% #1=sc contenant l'argument (ignor\'e) #2: sc recevant le r\'esultat
+\def\ST at func@rand#1#2{\STrandom#2}% #1=sc contenant l'argument (ignor\xE9) #2: sc recevant le r\xE9sultat
\def\ST at genzeros#1{\if#1m0\expandafter\ST at genzeros\fi}
-\def\ST at powerten#1#2{% g\'en\`ere 10^abs(#1) dans la sc #2
+\def\ST at powerten#1#2{% g\xE9n\xE8re 10^abs(#1) dans la sc #2
\edef#2{1\expandafter\ST at genzeros\romannumeral\number\ifnum#1<\z at -\fi#1000\relax}%
}
-\def\ST at func@scitodec#1#2{% #1=sc contenant l'argument #2: sc recevant le r\'esultat
+\def\ST at func@scitodec#1#2{% #1=sc contenant l'argument #2: sc recevant le r\xE9sultat
\expandafter\lowercase\expandafter{\expandafter\def\expandafter#1\expandafter{#1}}%
\ST at Ifinstr#1{ee}% on regarde s'il y a "ee"
{\ST at split#1{ee}\ST at mantissa\ST at exposant
\ST at powerten\ST at exposant\ST at tenpow
- \csname FP\ifnum\ST at exposant<\z@ div\else mul\fi\endcsname#2\ST at mantissa\ST at tenpow}%
+ \csname ST\ifnum\ST at exposant<\z@ div\else mul\fi\endcsname#2\ST at mantissa\ST at tenpow}%
{\IfDecimal#1%
{\let#2#1}%
- {\PackageError\STname{Illegal number in scitodec argument}\ST at seedoc@i}}%
+ {\PackageError\STname{Illegal number in scitodec argument}\STseedoc at i}}%
}
-
% les fonctions de test
\def\ST at liST@offour#1,#2,#3,#4\@nil{%
\def\ST at argA{#1}\def\ST at argB{#2}\def\ST at argC{#3}\def\ST at argD{#4}%
@@ -1368,11 +1433,11 @@
\def\ST at def@funcif#1#2#3{%
\expandafter\ST at liST@offour#1\@nil
- \FPeval\ST at argA\ST at argA\FPeval\ST at argB\ST at argB
- \csname FPif#3\endcsname\ST at argA\ST at argB
- \FPset#2\ST at argC
+ \STeval\ST at argA\ST at argA\STeval\ST at argB\ST at argB
+ \csname STif#3\endcsname\ST at argA\ST at argB
+ \let#2\ST at argC
\else
- \FPset#2\ST at argD
+ \let#2\ST at argD
\fi
}
@@ -1381,25 +1446,25 @@
\def\ST at func@iflt#1#2{\ST at def@funcif#1#2{lt}}
% Transforme une date en nombre
-\def\STdatetonum#1#2#3#4{% #1=sc recevant le r\'esultat #2=jj #3=mm #4=aa
- \FPeval#1{#3+9-12*trunc((#3+9)/12,0)}%
- \FPeval\ST@@@year{#4-trunc(#1/10,0)}%
- \FPeval#1{365*\ST@@@year+trunc(\ST@@@year/4,0)-trunc(\ST@@@year/100,0)+trunc(\ST@@@year/400,0)+trunc((#1*306+5)/10,0)+#2-1}%
- \FPclip#1#1%
+\def\STdatetonum#1#2#3#4{% #1=sc recevant le r\xE9sultat #2=jj #3=mm #4=aa
+ \STeval#1{#3+9-12*trunc((#3+9)/12,0)}%
+ \STeval\ST@@@year{#4-trunc(#1/10,0)}%
+ \STeval#1{365*\ST@@@year+trunc(\ST@@@year/4,0)-trunc(\ST@@@year/100,0)+trunc(\ST@@@year/400,0)+trunc((#1*306+5)/10,0)+#2-1}%
+ \STclip#1#1%
}
% Transforme un nombre en une date
-\def\ST at numtodate#1#2#3#4{% #1=nombre repr\'esentant la date #2=jour #3=mois #4=ann\'ee
- \FPeval#4{trunc((10000*#1+14780)/3652425,0)}%
- \FPeval#2{#1-(365*#4+trunc(#4/4,0)-trunc(#4/100,0)+trunc(#4/400,0))}%
- \FPifneg#2%
- \FPadd#4#4{-1}%
- \FPeval#2{#1-(365*#4+trunc(#4/4,0)-trunc(#4/100,0)+trunc(#4/400,0))}%
+\def\ST at numtodate#1#2#3#4{% #1=nombre repr\xE9sentant la date #2=jour #3=mois #4=ann\xE9e
+ \STeval#4{trunc((10000*#1+14780)/3652425,0)}%
+ \STeval#2{#1-(365*#4+trunc(#4/4,0)-trunc(#4/100,0)+trunc(#4/400,0))}%
+ \STiflt{#2}0%
+ \STadd#4#4{-1}%
+ \STeval#2{#1-(365*#4+trunc(#4/4,0)-trunc(#4/100,0)+trunc(#4/400,0))}%
\fi
- \FPeval#3{trunc((100*#2+52)/3060,0)}%
- \FPeval#4{#4+trunc((#3+2)/12,0)}\FPclip#4#4%
- \FPeval#2{#2-trunc((#3*306+5)/10,0)+1}\FPclip#2#2%
- \FPeval#3{#3+2-12*trunc((#3+2)/12,0)+1}\FPclip#3#3%
+ \STeval#3{trunc((100*#2+52)/3060,0)}%
+ \STeval#4{#4+trunc((#3+2)/12,0)}\STclip#4#4%
+ \STeval#2{#2-trunc((#3*306+5)/10,0)+1}\STclip#2#2%
+ \STeval#3{#3+2-12*trunc((#3+2)/12,0)+1}\STclip#3#3%
}
\def\ST at parse@datefr#1/#2/#3\@nil{\def\ST@@@day{#1}\def\ST@@@month{#2}\def\ST@@@year{#3}}
@@ -1406,71 +1471,71 @@
\def\ST at 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 at func@frshortdatetonum#1#2{% #1=sc \'etant l'argument jj/mm/aaaa #2=sc recevant le r\'esultat
+% transforme une date fran\xE7aise courte du type jj/mm/aaaa en nombre
+\def\ST at func@frshortdatetonum#1#2{% #1=sc \xE9tant l'argument jj/mm/aaaa #2=sc recevant le r\xE9sultat
\expandafter\ST at 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 at func@numtofrshortdate#1#2{% % #1=nombre repr\'esentant la date #2=sc recevant le r\'esultat
+% Transforme un nombre en une date fran\xE7aise de type jj/mm/aaaa
+\def\ST at func@numtofrshortdate#1#2{% % #1=nombre repr\xE9sentant la date #2=sc recevant le r\xE9sultat
\ST at 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 at func@numtofrlongdate#1#2{% % #1=nombre repr\'esentant la date #2=sc recevant le r\'esultat
+% Transforme un nombre en une date longue fran\xE7aise du type \xAB14 juillet 1789\xBB
+\def\ST at func@numtofrlongdate#1#2{% % #1=nombre repr\xE9sentant la date #2=sc recevant le r\xE9sultat
\ST at numtodate#1\ST@@@day\ST@@@month\ST@@@year
\edef#2{\ST@@@day\space\ifcase\ST@@@month\or janvier\or f\'evrier\or mars\or avril\or mai\or
juin\or juillet\or ao\^ut\or septembre\or octobre \or novembre\or d\'ecembre\fi\space\ST@@@year}%
}
-% Extrait d'un nombre repr\'esentant une date le mois en toutes lettres en français
-\def\ST at func@numtofrmonth#1#2{% % #1=nombre repr\'esentant la date #2=sc recevant le r\'esultat
+% Extrait d'un nombre repr\xE9sentant une date le mois en toutes lettres en fran\xE7ais
+\def\ST at func@numtofrmonth#1#2{% % #1=nombre repr\xE9sentant la date #2=sc recevant le r\xE9sultat
\ST at numtodate#1\ST@@@day\ST@@@month\ST@@@year
\edef#2{\ifcase\ST@@@month\or janvier\or f\'evrier\or mars\or avril\or mai\or
juin\or juillet\or ao\^ut\or septembre\or octobre \or novembre\or d\'ecembre\fi}%
}
-% Extrait d'un nombre rep\'esentant une date le nom du jour en français
-\def\ST at func@numtofrday#1#2{% % #1=nombre repr\'esentant la date #2=sc recevant le r\'esultat
- \FPeval\ST@@@day{#1-7*trunc(#1/7,0)}\FPclip\ST@@@day\ST@@@day
+% Extrait d'un nombre rep\xE9sentant une date le nom du jour en fran\xE7ais
+\def\ST at func@numtofrday#1#2{% % #1=nombre repr\xE9sentant la date #2=sc recevant le r\xE9sultat
+ \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 at func@engshortdatetonum#1#2{% #1=sc \'etant l'argument aaaa/mm/jj #2=sc recevant le r\'esultat
+\def\ST at func@engshortdatetonum#1#2{% #1=sc \xE9tant l'argument aaaa/mm/jj #2=sc recevant le r\xE9sultat
\expandafter\ST at 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 at func@numtoengshortdate#1#2{% % #1=nombre repr\'esentant la date #2=sc recevant le r\'esultat
+\def\ST at func@numtoengshortdate#1#2{% % #1=nombre repr\xE9sentant la date #2=sc recevant le r\xE9sultat
\ST at 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 at func@numtoenglongdate#1#2{% % #1=nombre repr\'esentant la date #2=sc recevant le r\'esultat
+% Transforme un nombre en une date longue anglaise du type \xABJuly 14, 1789\xBB
+\def\ST at func@numtoenglongdate#1#2{% % #1=nombre repr\xE9sentant la date #2=sc recevant le r\xE9sultat
\ST at numtodate#1\ST@@@day\ST@@@month\ST@@@year
\edef#2{\ifcase\ST@@@month\or January\or February\or March\or April\or May\or
June\or July\or August\or September\or October\or November\or December\fi\space\ST@@@day,\space\ST@@@year}%
}
-% Extrait d'un nombre repr\'esentant une date le mois en toutes lettres en anglais
-\def\ST at func@numtoengmonth#1#2{% % #1=nombre repr\'esentant la date #2=sc recevant le r\'esultat
+% Extrait d'un nombre repr\xE9sentant une date le mois en toutes lettres en anglais
+\def\ST at func@numtoengmonth#1#2{% % #1=nombre repr\xE9sentant la date #2=sc recevant le r\xE9sultat
\ST at numtodate#1\ST@@@day\ST@@@month\ST@@@year
\edef#2{\ifcase\ST@@@month\or January\or February\or March\or April\or May\or
June\or July\or August\or September\or October\or November\or December\fi}%
}
-% Extrait d'un nombre rep\'esentant une date le nom du jour en anglais
-\def\ST at func@numtoengday#1#2{% % #1=nombre repr\'esentant la date #2=sc recevant le r\'esultat
- \FPeval\ST@@@day{#1-7*trunc(#1/7,0)}\FPclip\ST@@@day\ST@@@day
+% Extrait d'un nombre rep\xE9sentant une date le nom du jour en anglais
+\def\ST at func@numtoengday#1#2{% % #1=nombre repr\xE9sentant la date #2=sc recevant le r\xE9sultat
+ \STeval\ST@@@day{#1-7*trunc(#1/7,0)}\STclip\ST@@@day\ST@@@day
\edef#2{\ifcase\ST@@@day wednesday\or thursday\or friday\or saturday\or sunday\or monday\or tuesday\fi}
}
-% Teste si la date contenue dans les 3 sc #1 (jour) #2(mois) #3(ann\'ee) est valide. Sinon, envoie un message d'erreur
+% Teste si la date contenue dans les 3 sc #1 (jour) #2(mois) #3(ann\xE9e) est valide. Sinon, envoie un message d'erreur
\def\ST at teST@date at validity#1#2#3{%
\IfInteger#1{}\ST at invalid@date
\IfInteger#2{}\ST at invalid@date
@@ -1479,16 +1544,16 @@
\ifnum#2>12 \ST at invalid@date\fi
\ifnum#1<\@ne\ST at invalid@date\fi
\ifnum#1>\ifcase#2\or31\or29\or31\or30\or31\or30\or31\or31\or30\or31\or30\or31\fi\ST at invalid@date\fi
- \ifnum#3<\@ne\ST at invalid@date\fi% on va s'arr\^eter \'a JC quand m\^eme :-)
+ \ifnum#3<\@ne\ST at invalid@date\fi% on va s'arr\xEAter \xE0 JC quand m\xEAme :-)
}
-% Transforme une date anglaise longue du type «July 14, 1789» en un nombre
-\def\ST at func@englongdatetonum#1#2{% #1=sc contenant la date longue #2=sc recevant le r\'esultat
+% Transforme une date anglaise longue du type \xABJuly 14, 1789\xBB en un nombre
+\def\ST at func@englongdatetonum#1#2{% #1=sc contenant la date longue #2=sc recevant le r\xE9sultat
\ST at analyse@text at engdate#1\ST@@@day\ST@@@month\ST@@@year
\STdatetonum#2\ST@@@day\ST@@@month\ST@@@year
}
-\def\ST at analyse@text at engdate#1#2#3#4{% #1=texte repr\'esentant la date #2=jour #3=n° mois #4=ann\'ee
+\def\ST at analyse@text at engdate#1#2#3#4{% #1=texte repr\xE9sentant la date #2=jour #3=n\xB0 mois #4=ann\xE9e
\ST at remove@firST at spaces#1%
\def\ST at today{\today}%
\ifx#1\ST at today
@@ -1519,8 +1584,8 @@
\fi
}
-% Transforme une date anglaise longue du type «14 juillet 1789» en un nombre
-\def\ST at func@frlongdatetonum#1#2{% #1=sc contenant la date longue #2=sc recevant le r\'esultat
+% Transforme une date anglaise longue du type \xAB14 juillet 1789\xBB en un nombre
+\def\ST at func@frlongdatetonum#1#2{% #1=sc contenant la date longue #2=sc recevant le r\xE9sultat
\ST at analyse@text at frdate#1\ST@@@day\ST@@@month\ST@@@year
\STdatetonum#2\ST@@@day\ST@@@month\ST@@@year
}
@@ -1527,7 +1592,7 @@
\def\ST at utfencoding{utf8}
-\def\ST at analyse@text at frdate#1#2#3#4{% #1=texte repr\'esentant la date #2=jour #3=n° mois #4=ann\'ee
+\def\ST at analyse@text at frdate#1#2#3#4{% #1=texte repr\xE9sentant la date #2=jour #3=n\xB0 mois #4=ann\xE9e
\ST at remove@firST at spaces#1%
\def\ST at today{\today}%
\ifx#1\ST at today
@@ -1537,9 +1602,9 @@
\IfInteger#2{}{\edef#2{\number\integerpart}}%
\ST at split#3{ }#3#4%
\ST at removespaces#3%
- \def\ST at e{^^e9}\def\ST at u{^^fb}% \'e et û en latin1
+ \def\ST at e{^^e9}\def\ST at u{^^fb}% \xE9 et \xFB en latin1
\ifdefined\inputencodingname\ifx\ST at utfencoding\inputencodingname
- \def\ST at e{^^c3^^a9}\def\ST at u{^^c3^^bb}% \'e et û en utf8
+ \def\ST at e{^^c3^^a9}\def\ST at u{^^c3^^bb}% \xE9 et \xFB en utf8
\fi\fi
\expandafter\ST at subst\expandafter#3\expandafter{\ST at e}e\ST at subst#3\'{}%
\expandafter\ST at subst\expandafter#3\expandafter{\ST at u}u\ST at subst#3\^{}%
@@ -1586,7 +1651,7 @@
\def\ST at func@value#1#2{%
\ifcsname ST at celltag@\detokenize\expandafter{#1}\endcsname
- \expandafter\let\expandafter#2\csname ST at celltag@\detokenize\expandafter{#1}\endcsname
+ \ST at cslet#2{ST at celltag@\detokenize\expandafter{#1}}%
\else
\PackageWarning\ST at package@name{The tag "\detokenize\expandafter{#1}" does not exists, have you defined it?}%
\def#2{0}% use 0 if tag undefined
@@ -1600,14 +1665,14 @@
% \ST at left\ST at nb@min:\ST at nb@min
% }%
% {\def\ST at nb@sec{0}}%
-% \FPeval#2{\ST at nb@sec+60*\ST at nb@min+3600*\ST at nb@hours}%
-% \FPclip#2#2%
+% \STeval#2{\ST at nb@sec+60*\ST at nb@min+3600*\ST at nb@hours}%
+% \STclip#2#2%
% }
%
% \def\ST at func@sectotime#1#2{%
-% \FPeval\ST at nb@hours{trunc(#1/3600,0)}\FPclip\ST at nb@hours\ST at nb@hours
-% \FPeval\ST at nb@min{trunc((#1-\ST at nb@hours*3600)/60,0)}\FPclip\ST at nb@min\ST at nb@min
-% \FPeval\ST at nb@sec{#1-3600*\ST at nb@hours-60*\ST at nb@min}\FPclip\ST at nb@sec\ST at nb@sec
+% \STeval\ST at nb@hours{trunc(#1/3600,0)}\STclip\ST at nb@hours\ST at nb@hours
+% \STeval\ST at nb@min{trunc((#1-\ST at nb@hours*3600)/60,0)}\STclip\ST at nb@min\ST at nb@min
+% \STeval\ST at nb@sec{#1-3600*\ST at nb@hours-60*\ST at nb@min}\STclip\ST at nb@sec\ST at nb@sec
% \edef#2{%
% \ST at nb@hours
% :\ifnum\ST at nb@min<10 0\fi\ST at nb@min
@@ -1615,9 +1680,9 @@
% }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%% Construction du tableau \'a afficher %%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%% Construction du tableau \xE0 afficher %%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\ST at search@lastshowcol{% cherche le num\'ero de la derni\`ere colonne non masqu\'ee
+\def\ST at search@lastshowcol{% cherche le num\xE9ro de la derni\xE8re colonne non masqu\xE9e
\ST at colcount\ST at total@colnumber% on commence par la fin
\ST at search@lastshowcol at i
}
@@ -1628,20 +1693,20 @@
{\edef\ST at lastshowcol{\number\ST at colcount}}%
}
-% cherche "<<ref>>" dans la sc #1 et remplace toutes ces occurences par le champ num\'erique de "ref"
+% cherche "<<ref>>" dans la sc #1 et remplace toutes ces occurences par le champ num\xE9rique de "ref"
\def\ST at displaynumfields#1{%
\StrBehind#1\ST at startdisplay[\ST at dipslaycell]%
\StrBefore\ST at dipslaycell\ST at enddisplay[\ST at dipslaycell]%
- \let\ST at next\@gobble% \'a priori, on ne reboucle pas
+ \let\ST at next\@gobble% \xE0 priori, on ne reboucle pas
\unless\ifx\@empty\ST at dipslaycell% si ce qui a entre les marqueurs n'est pas vide
\edef\ST at current@colnumber{\number\ST at colcount}\edef\ST at current@rownumber{\number\ST at rowcount}%
- \ST at ifref\ST at dipslaycell% et si c'est une r\'ef\'erence valide
+ \ST at ifref\ST at dipslaycell% et si c'est une r\xE9f\xE9rence valide
{\let\ST at next\ST at startdisplay
\ST at expadd@tomacro\ST at next\ST at dipslaycell
\ST at expadd@tomacro\ST at next\ST at enddisplay
- \expandafter\let\expandafter\ST at dipslaycell\csname formula@\ST at temp@formula\endcsname% alias pour la formule distante
- \unless\ifx\ST at decsep\ST at decsepfp\ST at substdecsep\ST at dipslaycell\fi% subsitution du s\'eparateur d\'ecimal s'il y a lieu
- \StrSubstitute#1\ST at next\ST at dipslaycell[#1]% on substitue <<ref>> par le champ num\'erique de la formule distante
+ \ST at cslet\ST at dipslaycell{formula@\ST at temp@formula}% alias pour la formule distante
+ \unless\ifx\ST at decsep\ST at decsepfp\ST at substdecsep\ST at dipslaycell\fi% subsitution du s\xE9parateur d\xE9cimal s'il y a lieu
+ \StrSubstitute#1\ST at next\ST at dipslaycell[#1]% on substitue <<ref>> par le champ num\xE9rique de la formule distante
\let\ST at next\ST at displaynumfields
}
{}%
@@ -1651,17 +1716,17 @@
\def\ST at build@tab{%
\ST at rowcount\@ne\ST at colcount\@ne
- \expandafter\ST at expadd@tomacro\expandafter\ST at tab\csname endrow at 0\endcsname% la (ou les) \'eventuelle ligne sup\'erieure du tableau
+ \expandafter\ST at expadd@tomacro\expandafter\ST at tab\csname endrow at 0\endcsname% la (ou les) \xE9ventuelle ligne sup\xE9rieure du tableau
\ST at build@tab at i
}
-\def\ST at build@tab at i{% reconstitue le tableau \'a partir des valeurs calcul\'ees et des cellules
+\def\ST at build@tab at i{% reconstitue le tableau \xE0 partir des valeurs calcul\xE9es et des cellules
\ifnum\ST at rowcount>\ST at total@rownumber
\let\ST at nextcell\relax
\else
\let\ST at nextcell\ST at build@tab at i
\ST at Ifinstr\ST at row@skiplist{\expandafter(\number\ST at rowcount)}% la ligne fait partie de la skiplist ?
- {\advance\ST at rowcount\@ne}% on passe \'a la ligne suivante
+ {\advance\ST at rowcount\@ne}% on passe \xE0 la ligne suivante
{%
\ST at Ifinstr\ST at col@skiplist{\expandafter(\number\ST at colcount)}% la colonne fait partie de la skiplist ?
\ST at hiddencoltrue
@@ -1668,34 +1733,34 @@
{%
\ST at hiddencolfalse
\ST at ifvalid@csname{text@\number\ST at colcount @\number\ST at rowcount}% si la cellule existe
- {\expandafter\let\expandafter\ST at temp@b\csname text@\number\ST at colcount @\number\ST at rowcount\endcsname% on cr\'e\'e un alias pour le texte
+ {\ST at cslet\ST at temp@b{text@\number\ST at colcount @\number\ST at rowcount}% on cr\xE9\xE9 un alias pour le texte
\exploregroups
- \ifnum\csname code@\number\ST at colcount @\number\ST at rowcount\endcsname=\tw@% si la cellule contient un champ num\'erique
- \expandafter\let\expandafter\ST at temp@a\csname formula@\number\ST at colcount @\number\ST at rowcount\endcsname% alias pour la valeur
- \unless\ifx\ST at decsep\ST at decsepfp\ST at substdecsep\ST at temp@a\fi% et si le "." doit \^etre remplac\'e par "," on substitue
- \StrSubstitute[1]\ST at temp@b\STnumericfieldmarker{\expandafter\STprintnum\expandafter{\ST at temp@a}}[\ST at temp@a]% on remplace le flag de formule par la valeur calcul\'ee
- \else% si la cellule ne contient pas de champ num\'erique
- \StrDel[1]\ST at temp@b\STnumericfieldmarker[\ST at temp@a]% on enl\`eve l'\'eventuel marqueur
+ \ifnum\csname code@\number\ST at colcount @\number\ST at rowcount\endcsname=\tw@% si la cellule contient un champ num\xE9rique
+ \ST at cslet\ST at temp@a{formula@\number\ST at colcount @\number\ST at rowcount}% alias pour la valeur
+ \unless\ifx\ST at decsep\ST at decsepfp\ST at substdecsep\ST at temp@a\fi% et si le "." doit \xEAtre remplac\xE9 par "," on substitue
+ \StrSubstitute[1]\ST at temp@b\STnumericfieldmarker{\expandafter\STprintnum\expandafter{\ST at temp@a}}[\ST at temp@a]% on remplace le flag de formule par la valeur calcul\xE9e
+ \else% si la cellule ne contient pas de champ num\xE9rique
+ \StrDel[1]\ST at temp@b\STnumericfieldmarker[\ST at temp@a]% on enl\xE8ve l'\xE9ventuel marqueur
\fi
- \ST at displaynumfields\ST at temp@a% affiche les champs num\'eriques des cellules entre << et >>
+ \ST at displaynumfields\ST at temp@a% affiche les champs num\xE9riques des cellules entre << et >>
\noexploregroups
\ST at expadd@tomacro\ST at tab\ST at temp@a% on ajoute la cellule au tableau
}
{}%
}%
- \advance\ST at colcount\@ne% on passe \'a la colonne suivante !
- \ST at ifvalid@csname{code@\number\ST at colcount @\number\ST at rowcount}% y a t-il encore un code d\'efini ensuite ?
+ \advance\ST at colcount\@ne% on passe \xE0 la colonne suivante !
+ \ST at ifvalid@csname{code@\number\ST at colcount @\number\ST at rowcount}% y a t-il encore un code d\xE9fini ensuite ?
{\ifnum\csname code@\number\ST at colcount @\number\ST at rowcount\endcsname<\z@% on est dans une cellule contenant \multicol ?
- \expandafter\ST at firstarg@after\csname text@\number\numexpr\ST at colcount-1@\number\ST at rowcount\endcsname\multicolumn\ST at multicol@number% combien de cellules ?
- \advance\ST at colcount\ST at multicol@number% on va voir apr\`es le multicol en sautant toutes les valeurs des colonnes interm\'ediaires
+ \expandafter\ST at firstarg@after\csname text@\number\numexpr\ST at colcount-1@\number\ST at rowcount\endcsname\multicolumn\STmulticol at number% combien de cellules ?
+ \advance\ST at colcount\STmulticol at number% on va voir apr\xE8s le multicol en sautant toutes les valeurs des colonnes interm\xE9diaires
\advance\ST at colcount\m at ne
- \ST at ifvalid@csname{code@\number\ST at colcount @\number\ST at rowcount}% y a t-il un code d\'efini apr\`es le multicol ?
- {\ST at add@tomacro\ST at tab&}% on ajoute la tabulation
+ \ST at ifvalid@csname{code@\number\ST at colcount @\number\ST at rowcount}% y a t-il un code d\xE9fini apr\xE8s le multicol ?
+ {\STadd at tomacro\ST at tab&}% on ajoute la tabulation
{}%
\else% pas de \multicolumn
- \unless\ifST at hiddencol% si la cellule n'est pas masqu\'ee
- \unless\ifnum\ST at colcount>\ST at lastshowcol% si ce n'est pas la derni\`ere cellule affich\'ee
- \ST at add@tomacro\ST at tab&%on ajoute la tabulation
+ \unless\ifST at hiddencol% si la cellule n'est pas masqu\xE9e
+ \unless\ifnum\ST at colcount>\ST at lastshowcol% si ce n'est pas la derni\xE8re cellule affich\xE9e
+ \STadd at tomacro\ST at tab&%on ajoute la tabulation
\fi
\fi
\fi}%
@@ -1702,8 +1767,8 @@
{\ST at ifvalid@csname{endrow@\number\ST at rowcount}%
{\expandafter\ST at expadd@tomacro\expandafter\ST at tab\csname endrow@\number\ST at rowcount\endcsname}% ajoute la fin de la ligne
{}%
- \ST at colcount\@ne% on remet la colonne \'a 1
- \advance\ST at rowcount\@ne% on passe \'a la ligne suivante
+ \ST at colcount\@ne% on remet la colonne \xE0 1
+ \advance\ST at rowcount\@ne% on passe \xE0 la ligne suivante
}%
}%
\fi
@@ -1710,16 +1775,16 @@
\ST at nextcell
}
-% format des lettres et nombres repr\'esentant les coordonn\'ees (helvetica gras tr\`es petit)
+% format des lettres et nombres repr\xE9sentant les coordonn\xE9es (helvetica gras tr\xE8s petit)
\def\ST at debugformat@headers{\usefont{T1}{phv}{b}{n}}
-% format utilis\'e pour les cellules
+% format utilis\xE9 pour les cellules
\def\ST at debug@format at cells{\usefont{T1}{lmtt}{m}{n}}
\def\ST at colorcell{\ifST at colortblloaded\noexpand\cellcolor[gray]{.6}\fi}
\def\STdebug#1{%
- \ST at debugmodetrue% on se met en mode d\'ebogage
+ \ST at debugmodetrue% on se met en mode d\xE9bogage
\begingroup
\def\ST at debuginfo{#1}%
\ifmmode\scriptscriptstyle\else\scriptsize\fi
@@ -1740,11 +1805,11 @@
\ST at edefadd@tomacro\ST at debugtab{\noexpand\multicolumn1c{\ST at colorcell\noexpand\ST at debugformat@headers\@Alph\ST at colcount}}%
\ifnum\ST at colcount<\ST at lastshowcol
\advance\ST at colcount\@ne
- \ST at add@tomacro\ST at debugtab&%
+ \STadd at tomacro\ST at debugtab&%
\repeat
\ST at colcount\@ne
\ST at edefadd@tomacro\ST at debugtab{%
- &% passe \'a la derni\`ere colonne de la premi\`ere ligne
+ &% passe \xE0 la derni\xE8re colonne de la premi\xE8re ligne
\noexpand\multicolumn1l{%
\ifx\ST at temp@a\ST at debuginfo
\ST at ifvalid@csname{endrow@\number\ST at rowcount}%
@@ -1756,11 +1821,11 @@
\ST at debug@tab at i
}
-\def\ST at debug@tab at i{% affiche le tableau de d\'ebobage
+\def\ST at debug@tab at i{% affiche le tableau de d\xE9bobage
\ifnum\ST at rowcount>\ST at total@rownumber
\ST at edefadd@tomacro\ST at debugtab{\noexpand\cline{2-\number\numexpr\ST at lastshowcol+1}\noexpand\end{tabular}}%
- \ST at debugtab% affichage du tableau de d\'ebogage
- \ifmmode\\[0.5ex]\else\par\smallskip\fi% retour \'a la ligne
+ \ST at debugtab% affichage du tableau de d\xE9bogage
+ \ifmmode\\[0.5ex]\else\par\smallskip\fi% retour \xE0 la ligne
\expandafter\endgroup
\else
\ifnum\ST at colcount=\@ne
@@ -1767,14 +1832,14 @@
\ST at edefadd@tomacro\ST at debugtab{%
\noexpand\multicolumn1{c|}{\ST at colorcell\noexpand\ST at debugformat@headers\number\ST at rowcount}&}%
\fi
- \ifcsname\ST at debuginfo @\number\ST at colcount @\number\ST at rowcount\endcsname% si l'info existe pour la cellule concern\'ee
+ \ifcsname\ST at debuginfo @\number\ST at colcount @\number\ST at rowcount\endcsname% si l'info existe pour la cellule concern\xE9e
\ifx\ST at temp@a\ST at debuginfo
\expandafter\ST at subst\csname\ST at debuginfo @\number\ST at colcount @\number\ST at rowcount\endcsname|{}%
\fi
- \ST at edefadd@tomacro\ST at debugtab{\detokenize\expandafter\expandafter\expandafter{\csname\ST at debuginfo @\number\ST at colcount @\number\ST at rowcount\endcsname}}% on ajoute la cellule au tableau que l'on a detokenis\'ee au pr\'ealable
+ \ST at edefadd@tomacro\ST at debugtab{\detokenize\expandafter\expandafter\expandafter{\csname\ST at debuginfo @\number\ST at colcount @\number\ST at rowcount\endcsname}}% on ajoute la cellule au tableau que l'on a detokenis\xE9e au pr\xE9alable
\fi
- \advance\ST at colcount\@ne% on passe \'a la colonne suivante !
- \ifnum\ST at colcount>\ST at lastshowcol% si c'est la derni\`ere cellule affich\'ee
+ \advance\ST at colcount\@ne% on passe \xE0 la colonne suivante !
+ \ifnum\ST at colcount>\ST at lastshowcol% si c'est la derni\xE8re cellule affich\xE9e
\ST at edefadd@tomacro\ST at debugtab{%
&\noexpand\multicolumn1l{%
\ifx\ST at temp@a\ST at debuginfo
@@ -1783,10 +1848,10 @@
{}%
\fi}%
\noexpand\\\noexpand\cline{2-\number\numexpr\ST at lastshowcol+1}}%
- \ST at colcount\@ne% on remet la colonne \'a 1
- \advance\ST at rowcount\@ne% on passe \'a la ligne suivante
+ \ST at colcount\@ne% on remet la colonne \xE0 1
+ \advance\ST at rowcount\@ne% on passe \xE0 la ligne suivante
\else% il reste encore des cellules dans la ligne
- \ST at add@tomacro\ST at debugtab&% on ajoute la tabulation
+ \STadd at tomacro\ST at debugtab&% on ajoute la tabulation
\fi
\expandafter\ST at debug@tab at i
\fi
@@ -1796,16 +1861,16 @@
%%%%%%%%%%%%%%%%%% Environnement spreadtab et macros publiques %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% d\'efinit quelle sera le s\'equence de conytr\^ole qui finira les lignes
+% d\xE9finit quelle sera le s\xE9quence de conytr\xF4le qui finira les lignes
% dans les tableaux de spreadtab
\def\STeol#1{\def\ST at eol{#1}}
\STeol\\
-% renvoie la valeur num\'erique de la cellule de tag #1
+% renvoie la valeur num\xE9rique de la cellule de tag #1
\def\STtag#1{%
\ifcsname ST at celltag@\detokenize\expandafter{#1}\endcsname\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{\csname ST at celltag@\detokenize\expandafter{#1}\endcsname}
- {\PackageError\STname{Tag "#1" is unknown, have you defined it?}\ST at seedoc@i
+ {\PackageError\STname{Tag "#1" is unknown, have you defined it?}\STseedoc at i
}%
}
@@ -1821,7 +1886,7 @@
\global\expandafter\let\csname ST at celltag@\detokenize\expandafter{#1}\expandafter\endcsname
\csname ST at celltag@\detokenize\expandafter{#1}\endcsname
\else
- \PackageError\STname{Tag "#1" is unknown, have you defined it?}\ST at seedoc@i
+ \PackageError\STname{Tag "#1" is unknown, have you defined it?}\STseedoc at i
\fi
\fi
\expandafter\STmakegtag at i
@@ -1828,24 +1893,24 @@
\fi
}
-% d\'efinit le s\'eparateur d\'ecimal
+% d\xE9finit le s\xE9parateur d\xE9cimal
\def\STsetdecimalsep#1{\def\ST at decsep{#1}}
-\def\ST at decsepfp{.}% le s\'eparateur d\'ecimal donn\'e par fp
-\STsetdecimalsep.% le point par d\'efaut
+\def\ST at decsepfp{.}% le s\xE9parateur d\xE9cimal donn\xE9 par fp
+\STsetdecimalsep.% le point par d\xE9faut
-\STmessage{true}% affiche les messages par d\'efaut
+\STmessage{true}% affiche les messages par d\xE9faut
\newif\ifST at clipround
\def\STautoround{\@ifstar{\ST at cliproundfalse\ST at autoround}{\ST at cliproundtrue\ST at autoround}}
-\def\ST at autoround#1{\def\ST at rounddigit{#1}}
-\STautoround{}% pas d'arrondi par d\'efaut
+\def\ST at autoround#1{\def\STrounddigit{#1}}
+\STautoround{}% pas d'arrondi par d\xE9faut
-\def\STsavecell#1#2{% met dans la sc #1 la valeur du champ num\'erique de la cellule sp\'ecifi\'ee par sa r\'ef\'erence ABSOLUE
+\def\STsavecell#1#2{% met dans la sc #1 la valeur du champ num\xE9rique de la cellule sp\xE9cifi\xE9e par sa r\xE9f\xE9rence ABSOLUE
\def\ST at temp@ref{#2}%
\ST at ifref\ST at temp@ref{}\ST at illegal@ref
\ST at Ifinstr\ST at temp@ref[\ST at illegal@ref{}%
- \expandafter\let\expandafter#1\csname formula@\ST at temp@formula\endcsname% le nombre est assign\'e \'a #1
- \unless\ifx\ST at decsep\ST at decsepfp\ST at substdecsep#1\fi% et si le "." doit \^etre remplac\'e par "," on substitue
+ \ST at cslet#1{formula@\ST at temp@formula}% le nombre est assign\xE9 \xE0 #1
+ \unless\ifx\ST at decsep\ST at decsepfp\ST at substdecsep#1\fi% et si le "." doit \xEAtre remplac\xE9 par "," on substitue
\global\let#1#1% on rend l'assignation globale
}
@@ -1856,7 +1921,7 @@
\ifx\ST at temp@a\STname
\expandafter\spreadtab at i
\else
- \ST at add@tomacro\ST at tab{\end{#1}}%
+ \STadd at tomacro\ST at tab{\end{#1}}%
\expandafter\ST at get@body at env
\fi
}
@@ -1871,12 +1936,12 @@
\let\ST at get@body\ST at get@body at cs
\fi
\let\ST at FPmessages\ifFPmessages
- \ifST at message\FPmessagesfalse\fi% pas de message de calcul de FP
- \saveexpandmode\expandarg% 1-d\'eveloppement des arguments (r\'eglages de xstring)
- \saveexploremode\noexploregroups% pas d'exploration des groupes (r\'eglages de xstring)
+ \if at STfpactive\ifST at message\FPmessagesfalse\fi\fi% pas de message de calcul de FP
+ \saveexpandmode\expandarg% 1-d\xE9veloppement des arguments (r\xE9glages de xstring)
+ \saveexploremode\noexploregroups% pas d'exploration des groupes (r\xE9glages de xstring)
\edef\ST at catocde@saved{\catcode`:=\the\catcode`:\relax\catcode`;=\the\catcode`;\relax}%
- \@makeother\:\@makeother\;% changer les catcodes pour \'eviter les incompatibilit\'es avec frenchb
- \def\ST at tab@preamble{#2}% pr\'eambule du tableau
+ \@makeother\:\@makeother\;% changer les catcodes pour \xE9viter les incompatibilit\xE9s avec frenchb
+ \def\ST at tab@preamble{#2}% pr\xE9ambule du tableau
\StrChar{\@empty#2}\@ne[\ST at tab@name]%
\def\ST at optcode{#1}%
\let\ST at copylist\@empty
@@ -1883,8 +1948,10 @@
\let\ST at row@skiplist\@empty
\let\ST at col@skiplist\@empty
\def\ST at laST@skipcol{0}%
- \edef\ST at previous@seed{\number\FPseed}% sauvegarde de la graine
- \ST at seed% graine variable
+ \if at STfpactive
+ \edef\ST at previous@seed{\number\FPseed}% sauvegarde de la graine
+ \STseed% graine variable
+ \fi
\ST at emit@message{^^JNew spreadtab: \string\begin\detokenize{#2}^^J* reading tab:}%
\let\ST at tab\@empty
\ST at get@body% met le code du tableau dans \ST at tab
@@ -1895,12 +1962,12 @@
\let\ST at ref@found\@empty
\ST at read@tab% analyse le tableau contenu dans \ST at tab
\ST at emit@message{ok^^J}%
- \ST at search@lastshowcol% cherche la derni\`ere colonne affich\'ee
- \ST at debugmodefalse% \'a priori, on n'est pas en mode d\'ebogage
+ \ST at search@lastshowcol% cherche la derni\xE8re colonne affich\xE9e
+ \ST at debugmodefalse% \xE0 priori, on n'est pas en mode d\xE9bogage
\let\ST at savecell\STsavecell
\let\STsavecell\@gobbletwo
\let\STdisplaytab\relax
- \ST at optcode% ex\'ecute l'argument optionnel en ne tenant compte que de \STdebug
+ \ST at optcode% ex\xE9cute l'argument optionnel en ne tenant compte que de \STdebug
\let\STdebug\@gobble
\def\STdisplaytab{%
\ST at debugmodefalse
@@ -1907,12 +1974,12 @@
\ST at emit@message{\space\space\space\space\space Debug mode: display final tab^^J}%
\let\STdisplaytab\relax
}%
- \ST at optcode% ex\'ecute l'argument optionnel en ne tenant compte que de \STdisplaytab s'il y figure
+ \ST at optcode% ex\xE9cute l'argument optionnel en ne tenant compte que de \STdisplaytab s'il y figure
\unless\ifST at debugmode% si on doit afficher le tableau, on fait le boulot
\ST at emit@message{* computing formulas:^^J}%
- \ST at eval@tab
+ \STeval at tab
\let\STsavecell\ST at savecell
- \ST at optcode% ex\'ecute l'argument optionnel en ne tenant compte que de \STsavecell
+ \ST at optcode% ex\xE9cute l'argument optionnel en ne tenant compte que de \STsavecell
\expandafter\def\expandafter\ST at tab\expandafter{\expandafter\begin\ST at tab@preamble}%
\ST at emit@message{* building tab:}%
\ST at build@tab
@@ -1921,7 +1988,7 @@
\expandafter\ST at tab% affiche le tableau
\fi
\ST at emit@message{End of spreadtab: \string\end\detokenize\expandafter{\ST at tab@name}^^J^^J}%
- \FPseed\ST at previous@seed% restauration de la graine
+ \if at STfpactive\FPseed\ST at previous@seed\fi% restauration de la graine
\let\ifFPmessages\ST at FPmessages
\restoreexpandmode\restoreexploremode
\ST at catocde@saved
@@ -1952,6 +2019,7 @@
}
\def\ST at undef@content{\ST at undef@content}
+
\endinput
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1962,161 +2030,164 @@
v0.1beta1 2009/06/06
-------------------------------------------------------------------------------
v0.1beta2 2009/06/07
- 1 Une valeur n\'egative dans une cellule provoque un bug.
- Les valeurs n\'egatives sont d\'esormais mises entre parenth\`eses
- 2 Espaces supprim\'es en d\'ebut de formules.
+ 1 Une valeur n\xE9gative dans une cellule provoque un bug.
+ Les valeurs n\xE9gatives sont d\xE9sormais mises entre parenth\xE8ses
+ 2 Espaces supprim\xE9s en d\xE9but de formules.
-------------------------------------------------------------------------------
v0.1beta3 2009/06/12
- 1 Espaces laiss\'es dans les formules pour pouvoir utiliser la notation
- postfix\'ee de fp.
- 2 Les r\'ef\'erences ne sont plus «@(B4)» mais indiff\'eremment «b4» ou
- «B4».
- 3 R\'ef\'erences relatives possibles par [x,y] ou x et y sont les
- d\'ecalages de la colonne et de la ligne par rapport \'a la cellule
- o\`u est la formule.
- 4 Bugs corrig\'es pour rendre le package compatible avec tabularx ou
+ 1 Espaces laiss\xE9s dans les formules pour pouvoir utiliser la notation
+ postfix\xE9e de fp.
+ 2 Les r\xE9f\xE9rences ne sont plus \xAB@(B4)\xBB mais indiff\xE9remment \xABb4\xBB ou
+ \xABB4\xBB.
+ 3 R\xE9f\xE9rences relatives possibles par [x,y] ou x et y sont les
+ d\xE9calages de la colonne et de la ligne par rapport \xE0 la cellule
+ o\xF9 est la formule.
+ 4 Bugs corrig\xE9s pour rendre le package compatible avec tabularx ou
tabulary (entre autres).
-------------------------------------------------------------------------------
v0.1beta4 2009/06/21
- 1 Les espaces sont supprim\'es au d\'ebut de chaque cellule, cela
- cr\'eait un bug lorsque la cellule commençait par un nombre n\'egatif.
- 2 Mise en place de la compatibilit\'e avec la commande
- \multicolumn{nbre}{type}{contenu} du package \'eponyme
- 3 Possibilit\'e de masquer des lignes ou des colonnes enti\`eres avec les
+ 1 Les espaces sont supprim\xE9s au d\xE9but de chaque cellule, cela
+ cr\xE9ait un bug lorsque la cellule commen\xE7ait par un nombre n\xE9gatif.
+ 2 Mise en place de la compatibilit\xE9 avec la commande
+ \multicolumn{nbre}{type}{contenu} du package \xE9ponyme
+ 3 Possibilit\xE9 de masquer des lignes ou des colonnes enti\xE8res avec les
commandes \SThiderow et \SThidecol
- Seule condition : aucune colonne masqu\'ee ne doit se trouver dans les
- colonnes impliqu\'ees dans un \multicolum \'a moins de prendre de
- grandes pr\'ecautions et savoir les cons\'equences que cela occasionne.
+ Seule condition : aucune colonne masqu\xE9e ne doit se trouver dans les
+ colonnes impliqu\xE9es dans un \multicolum \xE0 moins de prendre de
+ grandes pr\xE9cautions et savoir les cons\xE9quences que cela occasionne.
-------------------------------------------------------------------------------
v0.1beta5 2009/06/29
- 1 Am\'elioration des messages d'erreur et d'information
+ 1 Am\xE9lioration des messages d'erreur et d'information
2 Suppression de tests superflus
- 3 Red\'efinition de \STtextcell en «@» qui est plus simple
- 4 Impl\'ementation de \STsavecell
- 5 \'Ecriture de la documentation provisoire en français
+ 3 Red\xE9finition de \STtextcell en \xAB@\xBB qui est plus simple
+ 4 Impl\xE9mentation de \STsavecell
+ 5 \xE9criture de la documentation provisoire en fran\xE7ais
-------------------------------------------------------------------------------
v0.1beta6 2009/08/23
- 1 Correction d'un bug : dans une cellule, on ne pouvait pas \'ecrire
- plusieurs fois la m\^eme r\'ef\'erence.
- 2 Correction d'un bug avec \multicolumn : cette commande \'etait mal
- g\'er\'ee lorsqu'employ\'ee avec une cellule de texte.
- 3 Impl\'ementation de macro-fonctions avec diff\'erenciation selon le
- type d'argument et le type de donn\'ee renvoy\'ee.
- 4 Possibilit\'e d'imbrication des macro-fonctions.
- 5 Mise en place d'un environnement « spreadtab »
- 6 Nombreuses optimisations pour une meilleure vitesse d'ex\'ecution
+ 1 Correction d'un bug : dans une cellule, on ne pouvait pas \xE9crire
+ plusieurs fois la m\xEAme r\xE9f\xE9rence.
+ 2 Correction d'un bug avec \multicolumn : cette commande \xE9tait mal
+ g\xE9r\xE9e lorsqu'employ\xE9e avec une cellule de texte.
+ 3 Impl\xE9mentation de macro-fonctions avec diff\xE9renciation selon le
+ type d'argument et le type de donn\xE9e renvoy\xE9e.
+ 4 Possibilit\xE9 d'imbrication des macro-fonctions.
+ 5 Mise en place d'un environnement \xAB spreadtab \xBB
+ 6 Nombreuses optimisations pour une meilleure vitesse d'ex\xE9cution
-------------------------------------------------------------------------------
v0.1pre 2009/09/02
- 1 Mise au point des messages d'erreurs et des arr\^ets de compilation
- selon les erreurs rencontr\'ees.
+ 1 Mise au point des messages d'erreurs et des arr\xEAts de compilation
+ selon les erreurs rencontr\xE9es.
2 Correction d'un bug dans \ST at coord@toref
3 Les cellules vides, textuelles ou jointes par un \multicolumn sont
- ignor\'ees dans les plages de cellules concern\'ees par les fonctions
+ ignor\xE9es dans les plages de cellules concern\xE9es par les fonctions
sum et sumprod
- 4 Les noms de mois accentu\'es et \today sont d\'esormais permis en
+ 4 Les noms de mois accentu\xE9s et \today sont d\xE9sormais permis en
argument de la fonction frlongdatetonum
- 5 somprod corrig\'e en sumprod, plus anglais !
- 6 La macro fonction rnd, trop complexe est supprim\'ee au profit de rand
+ 5 somprod corrig\xE9 en sumprod, plus anglais !
+ 6 La macro fonction rnd, trop complexe est supprim\xE9e au profit de rand
et randint
- 7 Am\'eliorations et optimisations
+ 7 Am\xE9liorations et optimisations
-------------------------------------------------------------------------------
-v0.1 2009/11/03 Premi\`ere version publique sur le CTAN
+v0.1 2009/11/03 Premi\xE8re version publique sur le CTAN
-------------------------------------------------------------------------------
v0.2 2010/01/24
- 1 On peut d\'efinir le s\'eparateur d\'ecimal par la macro
- \STsetdecimalsep{<caract\`ere>}
- 2 Il est possible de copier une formule dans le tableau \'a l'aide de
- \STcopy{>a,vb}{formule} o\`u a et b sont les nombres de cellules
- horizontaux et verticaux vers lesquels la formule sera copi\'ee.
- 3 D\'esormais, spreadtab est enti\`erement compatible avec toutes les
+ 1 On peut d\xE9finir le s\xE9parateur d\xE9cimal par la macro
+ \STsetdecimalsep{<caract\xE8re>}
+ 2 Il est possible de copier une formule dans le tableau \xE0 l'aide de
+ \STcopy{>a,vb}{formule} o\xF9 a et b sont les nombres de cellules
+ horizontaux et verticaux vers lesquels la formule sera copi\xE9e.
+ 3 D\xE9sormais, spreadtab est enti\xE8rement compatible avec toutes les
commandes du package booktabs
4 La commande \noalign et son argument est prise en compte lorsqu'elle se
- trouve apr\`es un \\
- 5 Suppression d'espaces ind\'esirables
- 6 Mise en place d'un mode d\'ebogage o\`u l'on peut visualiser les champs
- num\'eriques, les champs textuels ou les codes des cellules du tableau
+ trouve apr\xE8s un \\
+ 5 Suppression d'espaces ind\xE9sirables
+ 6 Mise en place d'un mode d\xE9bogage o\xF9 l'on peut visualiser les champs
+ num\xE9riques, 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\xE7aise.
2 Implementation beta et donc non visible des macros fonctions gcd, lcm
- Ces macro-fonctions ne sont pas encore document\'ees.
+ Ces macro-fonctions ne sont pas encore document\xE9es.
-------------------------------------------------------------------------------
v0.3 2010/03/28
- 1 La macro \STautoround{x} admet une version \'etoil\'ee pour laquelle
- les nombres sont arrondis et format\'es pour avoir x chiffres apr\`es
+ 1 La macro \STautoround{x} admet une version \xE9toil\xE9e pour laquelle
+ les nombres sont arrondis et format\xE9s pour avoir x chiffres apr\xE8s
la virgule en rajoutant des 0 inutiles si besoin
- 2 La valeur sauvegard\'ee par \STsavecell tient d\'esormais compte du
- s\'eparateur d\'ecimal
+ 2 La valeur sauvegard\xE9e par \STsavecell tient d\xE9sormais compte du
+ s\xE9parateur d\xE9cimal
3 Macro fonctions "gcd" (PGCD), "lcm" (PPCM) et "scitodec" pour convertir
- une \'ecriture scientifique en une \'ecriture d\'ecimale
- 4 Dans le champ textuel d'une cellule, on peut d\'esormais afficher le
- champ num\'erique d'une cellule avec <<ref>>
- 5 Am\'elioration de l'algorithme pour \STcopy : enleve une formule de
- \ST at copylist lorsqu'on a d\'epass\'e la derni\`ere ligne de la plage
- o\`u elle doit \^etre copi\'ee
+ une \xE9criture scientifique en une \xE9criture d\xE9cimale
+ 4 Dans le champ textuel d'une cellule, on peut d\xE9sormais afficher le
+ champ num\xE9rique d'une cellule avec <<ref>>
+ 5 Am\xE9lioration de l'algorithme pour \STcopy : enleve une formule de
+ \ST at copylist lorsqu'on a d\xE9pass\xE9 la derni\xE8re ligne de la plage
+ o\xF9 elle doit \xEAtre copi\xE9e
6 Correction d'un bug lorsque la macro-fonction admettant un argument
- textuel a un argument faisant r\'ef\'erence \'a une autre cellule :
+ textuel a un argument faisant r\xE9f\xE9rence \xE0 une autre cellule :
enlever ":=" si besoin
7 Correction d'un bug dans xstring qui changeait les catcodes des tokens
de \@xs at afterinteger lorsqu'on appelle \IfInteger
8 Correction d'un bug dans \ST at build@tab at i pour prendre en compte les
- cellules de code 0 dans lesquelles ":=" doit \^etre supprim\'e
+ cellules de code 0 dans lesquelles ":=" doit \xEAtre supprim\xE9
-------------------------------------------------------------------------------
v0.3a 2010/05/15
- 1 Correction d'un bug dans \ST at gobble@remain : ce qui reste \'a manger
+ 1 Correction d'un bug dans \ST at gobble@remain : ce qui reste \xE0 manger
peut contenir des tokens de catcode 1 ou 2 ce qui fait que
- l'utilisation d'arguments d\'elimit\'es ne fonctionnerait pas dans ces
+ l'utilisation d'arguments d\xE9limit\xE9s ne fonctionnerait pas dans ces
cas.
-------------------------------------------------------------------------------
v0.3b 2010/06/06
1 Correction d'un bug concernant les macro-fonctions renvoyant un texte.
- Lorsque leur argument contenait une r\'ef\'erence, celle-ci devenait
+ Lorsque leur argument contenait une r\xE9f\xE9rence, celle-ci devenait
une cellule texte.
2 Correction d'un bug sur la macro \ST at stackcall : il faut y enlever
- toutes les occurrences de la cellule en train d'\^etre calcul\'ee
- 3 Modification de l'ordre de calcul des cellules concern\'ees par les
+ toutes les occurrences de la cellule en train d'\xEAtre calcul\xE9e
+ 3 Modification de l'ordre de calcul des cellules concern\xE9es 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\xE7on dont sont produites les skiplist
\ST at row@skiplist et \STcol at skiplist
- 5 Impl\'ementation de la macro fonction "id"
+ 5 Impl\xE9mentation de la macro fonction "id"
-------------------------------------------------------------------------------
v0.3c 2011/04/08
- 1 Correction d'un gros bug lors de la substitution d'une r\'ef\'erence de
- type <lettre><nbre> lorsque nbre>10 : a10 \'etait vu comme "a1" suivi
- de 0, et m\^eme pour tous les nbre>10 !
+ 1 Correction d'un gros bug lors de la substitution d'une r\xE9f\xE9rence de
+ type <lettre><nbre> lorsque nbre>10 : a10 \xE9tait vu comme "a1" suivi
+ de 0, et m\xEAme pour tous les nbre>10 !
2 Macro \STprintnum
-------------------------------------------------------------------------------
v0.4 2011/07/04
- 1 Les calculs se font en dehors d'un groupe pour \'eviter l'erreur de
+ 1 Les calculs se font en dehors d'un groupe pour \xE9viter l'erreur de
save-satck
- 2 Possibilit\'e d'\'ecrire aussi \spreadtab<code tableau>\endspreadtab
+ 2 Possibilit\xE9 d'\xE9crire aussi \spreadtab<code tableau>\endspreadtab
3 Macros fonctions tag, cell, row, col et la macro \STtag qui permet de
- faire appel \`a la valeur de la cellule marqu\'ee par la macro fonction
+ faire appel \xE0 la valeur de la cellule marqu\xE9e par la macro fonction
tag. \STmakegtag rend les sauvegardes globales.
4 La commande \STeol permet de choisir quel est le marqueur de
fin de ligne dans les tableau de spreadtab
5 dans une cellule mixte, les macro fonctions renvoyant du texte ont leur
- r\'esultat qui prend la place de :={<formule>}
+ r\xE9sultat qui prend la place de :={<formule>}
-------------------------------------------------------------------------------
v0.4a 2011/08/11
- 1 Un bug corrig\'e dans \ST at search@hline at i
+ 1 Un bug corrig\xE9 dans \ST at search@hline at i
-------------------------------------------------------------------------------
v0.4b 2012/05/13
- 1 Un bug corrig\'e dans \ST at func@sum
+ 1 Un bug corrig\xE9 dans \ST at func@sum
-------------------------------------------------------------------------------
v0.4c 2014/11/06
- 1 Un bug corrig\'e dans \ST at analyse@text at frdate et
- \ST at analyse@text at engdate : si #1 commence par un espace parasite,
- celui-ci est d\'esormais retir\'e.
- 2 Bug corrig\'e dans \ST at displaynumfields : les macros
- \ST at current@colnumber et \ST at current@rownumber sont d\'efinies avant
- d'appeler \ST at ifref
+ 1 Un bug corrig\xE9 dans \ST at analyse@text at frdate et
+ \ST at analyse@text at engdate : si #1 commence par un espace parasite,
+ celui-ci est d\xE9sormais retir\xE9.
+ 2 Bug corrig\xE9 dans \ST at displaynumfields : les macros
+ \ST at current@colnumber et \ST at current@rownumber sont d\xE9finies avant
+ d'appeler \ST at ifref
-------------------------------------------------------------------------------
v0.4d 2018/01/02
- 1 Bug corrig\'e dans \ST at eval@cell : le \edef\ST at dependance@tree corrige
- le \def !
- 2 Ajout d'un message d'erreur si une la fonction sum a une plage qui
- contient la cellule courante elle-m\^eme
- 3 Nouvelle macro fonction "value"
- 4 Nettoyage du code
\ No newline at end of file
+ 1 Bug corrig\xE9 dans \STeval at cell : le \edef\ST at 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\xEAme
+ 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
More information about the tex-live-commits
mailing list