diff options
author | Karl Berry <karl@freefriends.org> | 2009-11-17 17:56:07 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2009-11-17 17:56:07 +0000 |
commit | 8caf232ea678d2a7c51b476be84aec1fc9e17423 (patch) | |
tree | f8edaa58283c01188f78d5126dd2821abef7c107 /Master/texmf-dist/doc/latex/spreadtab/spreadtab_doc_fr.tex | |
parent | 7c18d8c655e3ec05cb6c9479f08abcc7a98c28ac (diff) |
new latex package spreadtab 0.1 (3nov09)
git-svn-id: svn://tug.org/texlive/trunk@16050 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/latex/spreadtab/spreadtab_doc_fr.tex')
-rw-r--r-- | Master/texmf-dist/doc/latex/spreadtab/spreadtab_doc_fr.tex | 1060 |
1 files changed, 1060 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/spreadtab/spreadtab_doc_fr.tex b/Master/texmf-dist/doc/latex/spreadtab/spreadtab_doc_fr.tex new file mode 100644 index 00000000000..1067308e3f1 --- /dev/null +++ b/Master/texmf-dist/doc/latex/spreadtab/spreadtab_doc_fr.tex @@ -0,0 +1,1060 @@ +% ____________________________________________________________________________ +% | | +% | | +% | spreadtab v0.1 | +% | | +% | November 3 2009 | +% | | +% |___________________________________________________________________________| +% +% Ce fichier est spreadtab_doc_fr.tex, le code source de la documentation en +% français du package spreadtab. +% +% Copyright Christian Tellechea 2009 +% email : unbonpetit@gmail.com +% +% ------------------------------------------------------------------- +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% +% http://www.latex-project.org/lppl.txt +% +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% ------------------------------------------------------------------- +\documentclass[a4paper,10pt]{article} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{lmodern} +\usepackage[a4paper,margin=2.5cm]{geometry} +\usepackage{amsmath,amssymb} +\usepackage{array} +\usepackage{colortbl} +\usepackage{tabularx} +\usepackage{xcolor} +\usepackage{listings} +\usepackage{numprint} +\usepackage{xspace} +\usepackage[bottom]{footmisc} +\usepackage{spreadtab} +\usepackage{fancyhdr} + \fancyhead[L]{} + \fancyhead[C]{\small\bfseries\ST} + \fancyhead[R]{\scriptsize\slshape \leftmark} + \fancyfoot[l]{\tiny Compilé par Christian \textsc{Tellechea}, le \today.} + \fancyfoot[c]{} + \fancyfoot[r]{\thepage} +\usepackage[frenchb]{babel} + +\makeatletter +\definecolor{ST@bckgcolor}{rgb}{0.87,0.9,1} +\definecolor{ST@codebckgcolor}{rgb}{0.9,0.9,0.9} +\definecolor{ST@keywordstc}{rgb}{0.7,0,0} +\definecolor{ST@keywordslatex}{rgb}{0,0,1} +\definecolor{ST@arguments}{rgb}{0,0,0} +\definecolor{ST@comments}{rgb}{0.5,0.5,0.5} +\lstset{% + language=[AlLaTeX]TeX,float=hbp,basicstyle=\footnotesize\ttfamily,identifierstyle=\color{ST@arguments},% + keywordstyle=\color{ST@keywordslatex},commentstyle=\itshape\color{ST@comments},% + columns=fixed,tabsize=4,frame=single,extendedchars=false,% + showspaces=false,showstringspaces=false,numbers=left,numberstyle=\tiny\ttfamily,% + breaklines=true,breakindent=3em,backgroundcolor=\color{ST@bckgcolor},breakautoindent=true,% + captionpos=t,xleftmargin=1em,xrightmargin=1em,lineskip=0pt,% + numbersep=1em,classoffset=1,% + morekeywords={% les macros et commandes de spreadtab + spreadtab,SThiderow,SThidecol,STsavecell,STautoround,STmessage,% + STnumericfieldmarker,STtextcell,fact,ifeq,ifgt,iflt,numtofrshortdate,% + numtoengshortdate,numtofrlongdate,numtoenglongdate,numtofrmonth,% + numtoengmonth,numtofrday,numtoengday,sum,rand,randint,sumprod,% + frshortdatetonum,engshortdatetonum,englongdatetonum,frlongdatetonum},% + keywordstyle=\color{ST@keywordstc},classoffset=0} +\makeatother + +\newcommand\verbinline{\lstinline[breaklines=false,basicstyle=\normalsize\ttfamily]} +\newcommand\ST{\textsf{spreadtab}\xspace} +\newcommand\falseverb[1]{\texttt{\detokenize{#1}}} + +\usepackage[a4paper,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} + +\begin{document} +\parindent0pt\pagestyle{fancy} +\begin{titlepage} + \null\par\vfill + \begin{center} + \begin{minipage}{0.75\linewidth} + \begin{center} + \Huge\bfseries\ST\par\vspace{5pt} + \small v\csname ST@ver\endcsname\par\vspace{35pt} + \normalsize Manuel de l'utilisateur + \end{center} + \end{minipage} + \end{center} + \vspace{1cm} + \begin{center} + Christian {\sc Tellechea}\par\small + \href{mailto:unbonpetit@gmail.com}{\texttt{\textbf{unbonpetit@gmail.com}}}\par\vspace{5pt} + \csname ST@fr@date\endcsname + \end{center} + \vfill + \begin{center} + \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 + 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} + \end{center} + \vfill{} +\end{titlepage} + +\tableofcontents\newpage +\parskip\medskipamount +\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. + +Ce package nécessite $\varepsilon$-\TeX, \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 \falseverb{v1.5c [2009/06/05]}. + +J'ai souhaité dès 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 de façon à ce 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. + +Par conséquent, \ST procède en 3 étapes :\parindent2em\smallskip +\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 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}\parindent0pt\medskip +La syntaxe est la suivante :\par\nobreak +\begin{lstlisting}[backgroundcolor=\color{ST@codebckgcolor}] +\begin{spreadtab}{{<nom de l'environnement>}<parametres de l'environnement>} + tableau avec formules et nombres +\end{spreadtab} +\end{lstlisting} +et après le travail de \ST, on obtient un affichage comme si l'on avait écrit :\par\nobreak +\begin{lstlisting}[backgroundcolor=\color{ST@codebckgcolor}] +\begin{<nom de l'environnement>}<parametres de l'environnement> + tableau avec nombres +\end{<nom de l'environnement>} +\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. + +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. + +\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. + +En effet, l'algorithme principal contenu dans \ST qui détermine l'ordre dans lequel ces cellules doivent être calculées est assez généraliste et n'est pas spécifique à \LaTeX. D'autres algorithmes plus \LaTeX iens analysent les cellules et les formules pour y trouver les références à d'autres cellules. L'exercice est intéressant car en matière de programmation, \TeX{} n'offre rien qui ressemble à un pointeur pour construire des listes chaînées de cellules à calculer. Rien n'est disponible non plus pour attacher à une \og variable\fg{} des champs \og enfants\fg{} dont on peut choisir le type. + +La route a été longue avant d'arriver à cette première 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 à Huu~Dien~Khue \textsc{Le} pour la traduction de ce manuel en viet-namien. + +\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. + +\subsection{Références absolues} +Dans le tableau, les cellules sont repérées par leur références absolues de cette façon :\parindent2em\smallskip +\begin{itemize} + \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}\parindent0pt\medskip +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.}. + +Voici un exemple où l'on calcule la somme de chaque ligne et de chaque colonne puis, la somme totale :\par\nobreak +\begin{minipage}{0.75\linewidth} +\begin{lstlisting} +\begin{spreadtab}{{tabular}{rr|r}} +22 & 54 & a1+b1 \\ +43 & 65 & a2+b2 \\ +49 & 37 & a3+b3 \\ +\hline +a1+a2+a3 & b1+b2+b3 & a4+b4 +\end{spreadtab} +\end{lstlisting} +\end{minipage}% +\begin{minipage}{0.25\linewidth} +\centering +\begin{spreadtab}{{tabular}{rr|r}} +22 & 54 & a1+b1 \\ +43 & 65 & a2+b2 \\ +49 & 37 & a3+b3 \\ +\hline +a1+a2+a3 & b1+b2+b3 & a4+b4 +\end{spreadtab} +\end{minipage}% + +Pour les matheux, voici un autre exemple où l'on calcule quelques lignes du triangle de Pascal :\par\nobreak +\begin{minipage}{0.75\linewidth} +\begin{lstlisting} +\begin{spreadtab}{{tabular}{ccccc}} +1 & & & & \\ +a1 & a1 & & & \\ +a2 & a2+b2 & b2 & & \\ +a3 & a3+b3 & b3+c3 & c3 & \\ +a2 & a4+b4 & b4+c4 & c4+d4 & d4 +\end{spreadtab} +\end{lstlisting} +\end{minipage}% +\begin{minipage}{0.25\linewidth} +\centering +\begin{spreadtab}{{tabular}{ccccc}} +1 & & & & \\ +a1 & a1 & & & \\ +a2 & a2+b2 & b2 & & \\ +a3 & a3+b3 & b3+c3 & c3 & \\ +a2 & a4+b4 & b4+c4 & c4+d4 & d4 +\end{spreadtab} +\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. + +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 +\begin{minipage}{0.82\linewidth} +\begin{lstlisting} +$ +\begin{spreadtab}{{matrix}{}} +1\\ +[0,-1] & [-1,-1]\\ +[0,-1] & [-1,-1]+[0,-1] & [-1,-1]\\ +[0,-1] & [-1,-1]+[0,-1] & [-1,-1]+[0,-1] & [-1,-1]\\ +[0,-1] & [-1,-1]+[0,-1] & [-1,-1]+[0,-1] & [-1,-1]+[0,-1] & [-1,-1] +\end{spreadtab} +$ +\end{lstlisting} +\end{minipage}\hfill +\begin{minipage}{0.15\linewidth} +\centering +$ +\begin{spreadtab}{{matrix}{}} +1\\ +[0,-1] & [-1,-1]\\ +[0,-1] & [-1,-1]+[0,-1] & [-1,-1]\\ +[0,-1] & [-1,-1]+[0,-1] & [-1,-1]+[0,-1] & [-1,-1]\\ +[0,-1] & [-1,-1]+[0,-1] & [-1,-1]+[0,-1] & [-1,-1]+[0,-1] & [-1,-1] +\end{spreadtab} +$ +\end{minipage}% + +On remarque que les références relatives sont plus adaptées ici puisque seulement 2 références différentes sont utilisées : \falseverb{[0,-1]} qui se réfère à la cellule de dessus et \falseverb{[-1,-1]} qui se réfère à la cellule au Nord-Ouest de la cellule où se trouve la formule. + +On peut utiliser dans une même formule un mélange de références absolues et relatives. + +\subsection{Des 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 \pageref{datetonum}.} de faire référence nulle part ailleurs dans le tableau. + +Voici un exemple :\par\nobreak +\begin{lstlisting} +\begin{spreadtab}{{tabular}{|r|ccc|}} +\hline +@ valeurs de $x$ & -5 & -1 & 4 \\ +@ $f(x)=2x$ & 2*[0,-1] & 2*[0,-1] & 2*[0,-1] \\\hline +\end{spreadtab} +\end{lstlisting} +\begin{center} +\begin{spreadtab}{{tabular}{|r|ccc|}} +\hline +@ valeurs de $x$ & -5 & -1 & 4 \\ +@ $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{\celltext}- fera qu'une cellule contenant \verb=\celltext= 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{Des 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 :\parindent2em\smallskip +\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 + \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 + \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}\parindent0pt\bigskip +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. + +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}-. + +Pour fixer les idées, voici un exemple très simple :\par\nobreak +\begin{lstlisting} +\begin{spreadtab}{{tabular}{|c|c||c|}}\hline +valeur 1 : :={50} & valeur 2 : :={29} & moyenne : \textbf{:={(a1+b1)/2}}\\\hline +\end{spreadtab} +\end{lstlisting} +\begin{center} +\begin{spreadtab}{{tabular}{|c|c||c|}}\hline +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, est équivalent à \og\verb-@-\fg dans une cellule : celle-ci est comprise comme cellule de texte. + +\section{Mise en forme du tableau} +\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>]-. + +Pour les filets horizontaux, on peut utiliser autant de fois que l'on veut:\parindent2em\smallskip +\begin{itemize} + \item \verb-\hline-; + \item \verb=\cline{x-y}= où \falseverb x et \falseverb y sont les numéro des colonnes de départ et d'arrivée du filet; + \item \verb=\hhline{<type>}= où \verb=<type>= est le type de ligne désirée (voir la documentation du package \href{http://www.ctan.org/tex-archive/macros/latex/required/tools/}{\texttt{\textbf{hhline}}}). +\end{itemize}\parindent0pt\medskip +Voici le triangle de Pascal inversé, et massacré pour l'exemple :\par\nobreak +\begin{lstlisting} +\begin{spreadtab}{{tabular}{*5c}} +[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]\\[1em] +[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1] & \\ +[0,1] & [-1,1]+[0,1] & [-1,1] & & \\ \hline\hline +[0,1] & [-1,1] & & & \\ \cline{2-4} +1 & & & & \\ \hline +\end{spreadtab} +\end{lstlisting} +\begin{center} +\begin{spreadtab}{{tabular}{*5c}} +[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]\\[1em] +[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1] & \\ +[0,1] & [-1,1]+[0,1] & [-1,1] & & \\ \hline\hline +[0,1] & [-1,1] & & & \\ \cline{2-4} +1 & & & & \\ \hline +\end{spreadtab} +\end{center} + +\subsection{Masquer une ligne ou une colonne} +Parfois, une colonne ou une ligne entière est destinée à recevoir des calculs intermédiaires qui n'ont pas à être affichés dans le tableau final. Pour cela \ST dispose de deux séquences de contrôle \verbinline=\SThiderow= et \verbinline=\SThidecol= qui, lorsqu'elles sont placées dans une cellule, masquent la ligne ou la colonne dans laquelle se trouve cette cellule. + +Voici un exemple :\par\nobreak +\begin{lstlisting} +\begin{spreadtab}{{tabular}{|r|ccc|}} +\hline +@ valeurs de $x$ & -1 & 0\SThidecol & 2 & 3 \\\hline +@$f(x)=2x-1$ & 2*[0,-1]-1 & 2*[0,-1]-1 & 2*[0,-1]-1 & 2*[0,-1]-1 \\ +@$g(x)=x-10$\SThiderow & [0,-2]-10 & [0,-2]-10 & [0,-2]-10 & [0,-2]-10 \\ +@$h(x)=1-x$ & 1-[0,-3] & 1-[0,-3] & 1-[0,-3] & 1-[0,-3] \\\hline +\end{spreadtab} +\end{lstlisting} +\begin{center} +\begin{spreadtab}{{tabular}{|r|ccc|}} +\hline +@ valeurs de $x$ & -1 & 0\SThidecol & 2 & 3 \\\hline +@$f(x)=2x-1$ & 2*[0,-1]-1 & 2*[0,-1]-1 & 2*[0,-1]-1 & 2*[0,-1]-1 \\ +@$g(x)=x-10$\SThiderow & [0,-2]-10 & [0,-2]-10 & [0,-2]-10 & [0,-2]-10 \\ +@$h(x)=1-x$ & 1-[0,-3] & 1-[0,-3] & 1-[0,-3] & 1-[0,-3] \\\hline +\end{spreadtab} +\end{center} +On peut observer comment on masque la ligne contenant $g(x)$ et la colonne correspondant à la valeur 0. + +Il faut se souvenir que les lignes et les colonnes masquées sont \emph{invisibles} pour l'environnement tableau choisi par l'utilisateur, ce qui explique que dans le préambule du tableau, seules 4 colonnes (\falseverb{|r|ccc|}) aient été définies et non 5 comme le voit \ST. + +Pour voir la différence, voici le tableau obtenu en définissant 5 colonnes et en ne masquant aucune ligne ni colonne :\par\nobreak +\begin{center} +\begin{spreadtab}{{tabular}{|r|cccc|}} +\hline +@ valeurs de $x$ & -1 & 0 & 2 & 3 \\\hline +@$f(x)=2x-1$ & 2*[0,-1]-1 & 2*[0,-1]-1 & 2*[0,-1]-1 & 2*[0,-1]-1 \\ +@$g(x)=x-10$ & [0,-2]-10 & [0,-2]-10 & [0,-2]-10 & [0,-2]-10 \\ +@$h(x)=1-x$ & 1-[0,-3] & 1-[0,-3] & 1-[0,-3] & 1-[0,-3] \\\hline +\end{spreadtab} +\end{center} + +\subsection{Sauvegarder la valeur d'une cellule} +On peut être amené à avoir besoin de la valeur numérique d'une cellule dans le tableau pour l'afficher en dehors d'une formule ou même à l'extérieur du tableau. On doit alors utiliser la commande :\par\nobreak +\begin{center} +\verbinline-\STsavecell{<sequence de controle>}{<reference absolue>}- +\end{center} +Avec un \verbinline-\global\def-\footnote{La commande \texttt{\string\def} ne vérifie pas si la macro qu'elle définit existe déjà.}, cette commande a pour effet de sauvegarder de façon globale dans \falseverb{<sequence de controle>} le résultat de la formule contenue dans la cellule \falseverb{<reference absolue>}. + +On ne peut utiliser que des références \emph{absolues}; les références relatives ne sont pas acceptées car cette commande doit se placer dans l'argument optionnel de l'environnement \verbinline-spreadtab-. + +Exemple :\par\nobreak +\begin{lstlisting} +\begin{spreadtab}[\STsavecell\result{c1}]{{tabular}{|c|c|c|c|c|}} +\hline +10 & a1+10 & b1+10 & a1+b1+c1 & @cell c1 : \result\\\hline +\end{spreadtab} +\par\medskip +Voici la cellule c1 : \result +\end{lstlisting} +\begin{center} +\begin{spreadtab}[\STsavecell\result{c1}]{{tabular}{|c|c|c|c|c|}} +\hline +10 & a1+10 & b1+10 & a1+b1+c1 & @cell c1 : \result\\\hline +\end{spreadtab} +\par\medskip +Voici la cellule c1 : \result +\end{center} +Si l'on veut sauvegarder plusieurs cellules, on peut mettre autant de fois que l'on veut la commande \verbinline-\STsavecell- dans l'argument optionnel. + +Exemple :\par\nobreak +\begin{lstlisting} +\begin{spreadtab}[\STsavecell\hhh{b3}\STsavecell\mmm{c3}\STsavecell\sss{d3}]{{tabular}{|rc|}}\hline +@Vitesse (km/h) &\SThidecol&\SThidecol&\SThidecol& 35 \\ +@distance (km) & & & & 180\\\hline +@Temps (h min s) & trunc(e2/e1,0) & trunc(60*(e2/e1-b3),0) & trunc(3600*(e2/e1-b3)-60*c3,1) &@\hhh\ h \mmm\ min \sss\ s\\\hline +\end{spreadtab}\par\medskip +On met au moins \hhh\ heures +\end{lstlisting} +\begin{center} +\begin{spreadtab}[\STsavecell\hhh{b3}\STsavecell\mmm{c3}\STsavecell\sss{d3}]{{tabular}{|rc|}}\hline +@Vitesse (km/h) &\SThidecol&\SThidecol&\SThidecol& 35 \\ +@distance (km) & & & & 180\\\hline +@Temps (h min s) & trunc(e2/e1,0) & trunc(60*(e2/e1-b3),0) & trunc(3600*(e2/e1-b3)-60*c3,1) &@\hhh\ h \mmm\ min \sss\ s\\\hline +\end{spreadtab}\par\medskip +On met au moins \hhh\ heures +\end{center} + +\subsection{Utiliser \ttfamily\textbackslash multicolumn} +Le package \ST est compatible avec la syntaxe \verbinline=\multicolumn{<nombre>}{<type>}{<contenu>}= qui fusionne \falseverb{<nombre>} cellules en une cellule de type et de contenu spécifiés dans les arguments. + +En utilisant \verbinline=\multicolumn=, \ST permet même de conserver une certaine cohérence au niveau du référencement des cellules. Sur ce tableau où des cellules sont fusionnées, les cases du tableau contiennent les références absolues vues par \ST :\par\nobreak +\begin{center} +\ttfamily +\begin{tabular}{|*7{c|}}\hline +a1&b1&c1&d1&e1&f1&g1\\\hline +a2&\multicolumn{2}{l|}{b2}&d2&e2&f2&g2\\\hline +\multicolumn{3}{|l|}{a3}&d3&\multicolumn{2}{l|}{e3}&g3\\\hline +\end{tabular} +\end{center} +Ainsi, quelque soit le nombre de cellules fusionnées, la cellule suivante porte un numéro de colonne qui tient compte du nombre de cellules fusionnées. + +Sur la dernière ligne, les cellules \falseverb{a3}, \falseverb{b3} et \falseverb{c3} sont fusionnées, et si la cellule \falseverb{a3 }contient une formule, les cellules \falseverb{b3} et \falseverb{c3} \emph{n'existent pas} pour \ST : on ne peut nulle part faire référence à ces cellules. + +Voici un exemple où chaque nombre de la ligne du haut est le produit des 2 nombres se trouvant au dessous de lui :\par\nobreak +\begin{lstlisting} +\newcolumntype{K}[1]{@{}>{\centering\arraybackslash}p{#1cm}@{}} +\begin{spreadtab}{{tabular}{*6{K{0.5}}}} +\cline{2-5} +&\multicolumn{2}{|K{1}|}{:={a2*c2}} & \multicolumn{2}{K{1}|}{:={c2*e2}} &\\\hline +\multicolumn{2}{|K{1}}{:=8}&\multicolumn{2}{|K{1}}{:=7}&\multicolumn{2}{|K{1}|}{:=6}\\\hline +\end{spreadtab} +\end{lstlisting} +\begin{center} +\newcolumntype{K}[1]{@{}>{\centering\arraybackslash}p{#1cm}@{}} +\begin{spreadtab}{{tabular}{*6{K{0.5}}}} +\cline{2-5} +&\multicolumn{2}{|K{1}|}{:={a2*c2}} & \multicolumn{2}{K{1}|}{:={c2*e2}} &\\\hline +\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-. En effet, si ce marquer n'existait pas la totalite de la cellule, c'est-à-dire \verb-\multicolumn{2}{|c|}{<formule>}- serait considérée comme étant une formule. + +\subsection{Le package \ttfamily fp} +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. + +Pour se prémunir de ce problème, plusieurs solutions existent :\parindent2em\smallskip +\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. +\end{itemize}\parindent0pt\medskip +Voici un exemple simple des nombres de 1 à 7 et leurs inverses, arrondis à $10^{-6}$ :\par\nobreak +\begin{lstlisting} +\STautoround{6} +\begin{spreadtab}{{tabular}{|l|*7{>{\centering\arraybackslash}m{1.35cm}|}}} +\hline +@$x$ & 1 & 2 & 3 & 4 & 5 & 6 & 7 \\\hline +@$x^{-1}$& 1/b1 & 1/c1 & 1/d1 & 1/e1 & 1/f1 & 1/g1 & 1/h1\\\hline +\end{spreadtab} +\end{lstlisting} +\begin{center} +\STautoround{6} +\begin{spreadtab}{{tabular}{|l|*7{>{\centering\arraybackslash}m{1.35cm}|}}} +\hline +@$x$ & 1 & 2 & 3 & 4 & 5 & 6 & 7 \\\hline +@$x^{-1}$& 1/b1 & 1/c1 & 1/d1 & 1/e1 & 1/f1 & 1/g1 & 1/h1\\\hline +\end{spreadtab} +\end{center} + +\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. + +\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. + +Elle s'utilise ainsi : \verbinline=sum(<plage 1>;<plage 2>;...;<plage n>)=, où une plage de cellules est :\parindent2em\smallskip +\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{}. +\end{itemize}\parindent0pt\medskip +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-. + +Les références relatives et absolues peuvent être utilisées conjointement, comme bon semble à l'utilisateur. Voici un exemple où l'on fait la somme des coefficients du triangle de Pascal :\par\nobreak +\begin{minipage}{0.75\linewidth} +\begin{lstlisting} +\begin{spreadtab}{{tabular}{*5c}} +\multicolumn{5}{c}{somme=:={sum(a2:e6)}}\\ +[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1] \\ +[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1] & \\ +[0,1] & [-1,1]+[0,1] & [-1,1] & & \\ +[0,1] & [-1,1] & & & \\ +1 & & & & +\end{spreadtab} +\end{lstlisting} +\end{minipage}% +\begin{minipage}{0.25\linewidth} +\centering +\begin{spreadtab}{{tabular}{*5c}} +\multicolumn{5}{c}{somme=:={sum(a2:e6)}}\\ +[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1] \\ +[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1] & \\ +[0,1] & [-1,1]+[0,1] & [-1,1] & & \\ +[0,1] & [-1,1] & & & \\ +1 & & & & +\end{spreadtab} +\end{minipage}% + +\subsubsection{La factorielle} +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. + +Voici les factorielles de 0 à 8 :\par\nobreak +\begin{lstlisting} +\begin{spreadtab}{{tabular}{*9c}} + 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 &8\\\hline +fact(a1)&fact(b1)&fact(c1)&fact(d1)&fact(e1)&fact(f1)&fact(g1)&fact(h1)&fact(i1) +\end{spreadtab} +\end{lstlisting} +\begin{center} +\begin{spreadtab}{{tabular}{*9c}} + 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 &8\\\hline +fact(a1)&fact(b1)&fact(c1)&fact(d1)&fact(e1)&fact(f1)&fact(g1)&fact(h1)&fact(i1) +\end{spreadtab} +\end{center} + +\subsubsection{La macro-fonction \ttfamily sumprod} +La fonction \verbinline=sumprod= permet de multiplier les éléments correspondants de 2 plages ou plus et ensuite, additionner ces produits. + +Cette fonction s'utilise ainsi : \verbinline{sumprod(<plage 1>;<plage 2>;...;<plage n>)}. Toutes les plages rectangulaires doivent avoir les mêmes dimensions. + +Voici un exemple simple où l'on calcule l'âge moyen d'un groupe d'enfants âgés de 10 à 15 ans :\par\nobreak +\begin{lstlisting} +\begin{spreadtab}{{tabular}{r*6c}} +@\^Ages & 10 & 11 & 12 & 13 & 14 & 15\\ +@Nombre & 5 & 8 & 20 & 55 & 9 & 3\\\hline +@Moyenne&\multicolumn{6}{l}{:={sumprod(b1:g1;b2:g2)/sum(b2:g2)}} +\end{spreadtab} +\end{lstlisting} +\begin{center} +\begin{spreadtab}{{tabular}{r*6c}} +@\^Ages & 10 & 11 & 12 & 13 & 14 & 15\\ +@Nombre & 5 & 8 & 20 & 55 & 9 & 3\\\hline +@Moyenne&\multicolumn{6}{l}{:={sumprod(b1:g1;b2:g2)/sum(b2:g2)}} +\end{spreadtab} +\end{center} +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. + +À 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 faite à 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@seed- et définir une graine pour \verb-fp- :\par\nobreak +\begin{lstlisting}[backgroundcolor=\color{ST@codebckgcolor}] +\makeatletter +\renewcommand\ST@seed{}% redefinit la macro interne +\makeatletter +\FPseed=27% donne une graine (n'importe quel entier) a fp +\end{lstlisting} +La macro fonction \verbinline-randint- renvoie une nombre \emph{entier} qui dépend des paramètres. La syntaxe est la suivante : \verbinline=randint([<nombre1>,]<nombre2>)=, où \verb=<nombre1>= est un entier optionnel qui vaut 0 par défaut. L'entier aléatoire renvoyé est compris dans l'intervalle \verb=[<nombre1>;<nombre2>]=. + +La macro fonction \verbinline-rand()- renvoie un nombre aléatoire décimal compris entre 0 et 1 :\par\nobreak +\begin{lstlisting} +\STautoround{6} +\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)\\ +@nombres dans [0;20] &randint(20) &randint(20) &randint(20) &randint(20) \\ +\hline +\end{spreadtab} +\end{lstlisting} +\begin{center} +\STautoround{6} +\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)\\ +@nombres dans [0;20] &randint(20) &randint(20) &randint(20) &randint(20) \\ +\hline +\end{spreadtab} +\end{center} + +\subsection{Les macro-fonctions de test} +Elles sont au nombre de 3 et ont la syntaxe suivante :\par\nobreak +\begin{center} +\verbinline=ifeq(nombre1,nombre2,nombre3,nombre4>)=\par +\verbinline=ifgt(nombre1,nombre2,nombre3,nombre4=\par +\verbinline=iflt(nombre1,nombre2,nombre3,nombre4)= +\end{center} +La comparaison se fait entre \falseverb{nombre1} et \falseverb{nombre2} :\parindent2em\smallskip +\begin{itemize} + \item test d'égalité pour \verbinline-ifeq- : \falseverb{nombre1} = \falseverb{nombre2} ? + \item test de supériorité stricte pour \verbinline-ifgt- : \falseverb{nombre1} > \falseverb{nombre2} ? + \item test d'infériorité stricte pour \verbinline-iflt- : \falseverb{nombre1} < \falseverb{nombre2} ? +\end{itemize}\parindent0pt\medskip +Si le test est vrai, \falseverb{nombre3} est retourné, sinon c'est \falseverb{nombre4}. + +À titre d'exemple, voici quelques valeurs de la fonction +$f(x)=\begin{cases} +10 &\text{si }x<1\\ +0 &\text{si }x=1\\ +-10 &\text{si }x>1 +\end{cases} +$ +\begin{lstlisting} +\begin{spreadtab}{{tabular}{|*2c|}}\hline +@$x$ & @$f(x)$ \\\hline +-0.5 & iflt([-1,0],1,10,ifeq([-1,0],1,0,-10))\\ +[0,-1]+0.5 & iflt([-1,0],1,10,ifeq([-1,0],1,0,-10))\\ +[0,-1]+0.5 & iflt([-1,0],1,10,ifeq([-1,0],1,0,-10))\\ +[0,-1]+0.5 & iflt([-1,0],1,10,ifeq([-1,0],1,0,-10))\\ +[0,-1]+0.5 & iflt([-1,0],1,10,ifeq([-1,0],1,0,-10))\\ +[0,-1]+0.5 & iflt([-1,0],1,10,ifeq([-1,0],1,0,-10))\\ +[0,-1]+0.5 & iflt([-1,0],1,10,ifeq([-1,0],1,0,-10))\\\hline +\end{spreadtab} +\end{lstlisting} +\begin{center} +\begin{spreadtab}{{tabular}{|*2c|}}\hline +@$x$ & @$f(x)$ \\\hline +-0.5 & iflt([-1,0],1,10,ifeq([-1,0],1,0,-10))\\ +[0,-1]+0.5 & iflt([-1,0],1,10,ifeq([-1,0],1,0,-10))\\ +[0,-1]+0.5 & iflt([-1,0],1,10,ifeq([-1,0],1,0,-10))\\ +[0,-1]+0.5 & iflt([-1,0],1,10,ifeq([-1,0],1,0,-10))\\ +[0,-1]+0.5 & iflt([-1,0],1,10,ifeq([-1,0],1,0,-10))\\ +[0,-1]+0.5 & iflt([-1,0],1,10,ifeq([-1,0],1,0,-10))\\ +[0,-1]+0.5 & iflt([-1,0],1,10,ifeq([-1,0],1,0,-10))\\\hline +\end{spreadtab} +\end{center} + +\subsection{Les 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-@-\fg{} ou \og\verb-:={}-\fg{} + +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} +\begin{spreadtab}{{tabular}{cc}} +@14/7/1789 & frshortdatetonum(a1)\\ +1/1/2001 :={} & frshortdatetonum(a2)\\\hline +frshortdatetonum(1/3/0) & frshortdatetonum(\number\day/\number\month/\number\year) +\end{spreadtab} +\end{lstlisting} +\begin{center} +\begin{spreadtab}{{tabular}{cc}} +@14/7/1789 & frshortdatetonum(a1)\\ +1/1/2001 :={} & frshortdatetonum(a2)\\\hline +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 +\begin{lstlisting}[escapechar=Z] +\begin{spreadtab}{{tabular}{cc}} +frlongdatetonum(\today) & frlongdatetonum(25 dZéZcembre 2009)\\ +@1 juillet 1970 & frlongdatetonum(a2) +\end{spreadtab} +\end{lstlisting} +\begin{center} +\begin{spreadtab}{{tabular}{cc}} +frlongdatetonum(\today) & frlongdatetonum(25 décembre 2009)\\ +@1 juillet 1970 & frlongdatetonum(a2) +\end{spreadtab} +\end{center} + +\subsubsection{Passer d'un nombre à une date} +Plusieurs macro-fonctions permettent de traduire un nombre en une donnée de date. Toutes ces macro-fonctions ont en commun que leur résultat est du \emph{texte}. Par conséquent, \emph{la cellule les contenant deviendra une cellule textuelle} dont le texte sera le résultat de cette fonction : si un texte cohabitait avec la formule dans cette cellule, il sera écrasé par le résultat. Il en résulte que la cellule ne peut plus faire l'objet d'aucun traitement mathématique ensuite. + +Voici ces fonctions :\parindent2em\smallskip +\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-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}\parindent0pt\medskip +Voici un exemple où l'on se place 1000 jours avant puis 1000 jours après le 1/6/2009. Pour chacune de ces 2 dates, on calcule la date courte, la date longue, le mois et le jour de la semaine.\par\nobreak +\begin{lstlisting} +\begin{spreadtab}{{tabular}{cc}} \hline +\multicolumn{2}{|c|}{@1/6/2009} \\\hline\hline +1000 & numtofrshortdate(frshortdatetonum(a1)+[-1,0])\\ +1000 & numtofrlongdate(frshortdatetonum(a1)+[-1,0]) \\ +1000 & numtofrmonth(frshortdatetonum(a1)+[-1,0]) \\ +1000 & numtofrday(frshortdatetonum(a1)+[-1,0]) \\\hline +-1000 & numtofrshortdate(frshortdatetonum(a1)+[-1,0])\\ +-1000 & numtofrlongdate(frshortdatetonum(a1)+[-1,0]) \\ +-1000 & numtofrmonth(frshortdatetonum(a1)+[-1,0]) \\ +-1000 & numtofrday(frshortdatetonum(a1)+[-1,0]) +\end{spreadtab} +\end{lstlisting} +\begin{center} +\begin{spreadtab}{{tabular}{cc}} \hline +\multicolumn{2}{|c|}{@1/6/2009} \\\hline\hline +1000 & numtofrshortdate(frshortdatetonum(a1)+[-1,0])\\ +1000 & numtofrlongdate(frshortdatetonum(a1)+[-1,0]) \\ +1000 & numtofrmonth(frshortdatetonum(a1)+[-1,0]) \\ +1000 & numtofrday(frshortdatetonum(a1)+[-1,0]) \\\hline +-1000 & numtofrshortdate(frshortdatetonum(a1)+[-1,0])\\ +-1000 & numtofrlongdate(frshortdatetonum(a1)+[-1,0]) \\ +-1000 & numtofrmonth(frshortdatetonum(a1)+[-1,0]) \\ +-1000 & numtofrday(frshortdatetonum(a1)+[-1,0]) +\end{spreadtab} +\end{center} + +\section{Précautions particulières} +\subsection{Redéfinition des commandes de filets horizontaux} +On peut être tenté de définir une commande pour produire ---~par exemple~--- une double ligne horizontale :\par\nobreak +\begin{center} +\verbinline-\newcommand\dline{\hline\hline}- +\end{center} +puis essayer de l'utiliser dans un tableau pour produire ce simple exemple qui calcule à la seconde ligne les termes de la suite de Fibonnacci :\par\nobreak +\begin{center} +\newcommand\dline{\hline\hline} +\begin{spreadtab}{{tabular}{*7c}} +0 & 1 & 2 & 3 & 4 & 5 & 6 \\\dline +:={1} & 1 & a2+b2 & b2+c2 & c2+d2 & d2+e2 & e2+f2 +\end{spreadtab} +\end{center} +Mais en écrivant ce code, il y a un problème :\par\nobreak +\begin{lstlisting} +\newcommand\dline{\hline\hline} +\begin{spreadtab}{{tabular}{*7c}} +0 & 1 & 2 & 3 & 4 & 5 & 6 \\\dline +1 & 1 & a2+b2 & b2+c2 & c2+d2 & d2+e2 & e2+f2 +\end{spreadtab} +\end{lstlisting} +En effet la compilation échoue et dans le log, on peut lire que \verb-\FPeval- se plaint :\par +\hfill\falseverb{! Improper alphabetic constant.}\hfill\null + +La raison est simple, c'est que le \verb-\dline- de la ligne 4, n'est \emph{pas} reconnu par \ST comme un filet horizontal et \emph{il se retrouve donc dans la cellule de la ligne suivante}. Pour \ST, cette cellule \falseverb{b1} contient :\par +\hfill\falseverb{\dline 1}\hfill\null + +Comme il n'y a pas de \verb-@- ni de délimiteur de formule \verb-:={...}-, \verb-\FPeval- essaie vaillamment de calculer ce contenu et échoue évidemment ! + +Pour pouvoir compiler ce code sans erreur, la cellule \falseverb{a2} \emph{doir} contenir un marqueur de champ numérique :\par\nobreak +\begin{lstlisting} +\newcommand\dline{\hline\hline} +\begin{spreadtab}{{tabular}{*7c}} +0 & 1 & 2 & 3 & 4 & 5 & 6 \\\dline +:={1} & 1 & a2+b2 & b2+c2 & c2+d2 & d2+e2 & e2+f2 +\end{spreadtab} +\end{lstlisting} +\begin{center} +\newcommand\dline{\hline\hline} +\begin{spreadtab}{{tabular}{*7c}} +0 & 1 & 2 & 3 & 4 & 5 & 6 \\\dline +:={1} & 1 & a2+b2 & b2+c2 & c2+d2 & d2+e2 & e2+f2 +\end{spreadtab} +\end{center} + +\subsection{Cohabitation de {\ttfamily\textbackslash multicolumn} et \ttfamily\textbackslash SThidecol} +Tout d'abord, dans une utilisation normale, l'utilisation conjointe de \verbinline|\multicolumn| et \verbinline-\SThiderow- ne doit pas arriver, et la plupart des utilisateurs ne devrait pas rencontrer cette situation ni lire ce chapitre. + +Pour les courageux venons-en au c\oe ur du problème : tout d'abord, une colonne masquée ne doit \emph{jamais} contenir une cellule où se trouve la commande \verbinline-\multicolumn- ! Mais que se passe t-il si une colonne masquée cache des cellules fusionnées par \verbinline-\multicolumn-? + +Déjà, en général, il n'y a pas d'erreur de compilation ni message d'erreur, mais il y a quelques subtilités quant aux références qui sont un peu chamboulées dans la ligne concernée après le \verbinline-\multicolumn-\ldots + +Prenons un exemple, et mettons que dans le tableau suivant, on fusionne les cellules \falseverb{b2} à \falseverb{h2} et que l'on souhaite cacher les colonnes \falseverb{c}, \falseverb{d} et \falseverb{f}, ici en gris :\par\nobreak +\begin{center} +\ttfamily +\begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} +\hline + a1 & b1 & \cellcolor[gray]{0.6}c1 & \cellcolor[gray]{0.6}d1 & e1 & \cellcolor[gray]{0.6}f1 & g1 & h1 & i1 & j1\\\hline + a2 & \multicolumn1c{b2} & \multicolumn1{>{\cellcolor[gray]{0.6}}c}{} & \multicolumn1{>{\cellcolor[gray]{0.6}}c}{} & \multicolumn1c{} & \multicolumn1{>{\cellcolor[gray]{0.6}}c}{} & \multicolumn1{c}{} & \multicolumn1{c|}{} & i2 & j2\\\hline +\end{tabular} +\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 $a$ et $b$ dans le cas général. + +La règle est la suivante :\parindent2em\smallskip +\begin{itemize} + \item il faut rajouter $b$ 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 $a$ 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}). +\end{itemize}\parindent0pt\medskip +Voici un vrai exemple dont la structure est similaire au précédent : $a=2$ et $b=1$. Dans le code, remarquer le \og\textcolor{red}{\texttt{\&}}\fg{} qui a été ajouté puisque $b=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 +1 & 2 & \SThidecol3 & \SThidecol4 & 5& \SThidecol6 & 7& 8& 9 & 10 \\\hline +a1+1& \multicolumn4{l|}{:={b1+1}}Z\ttfamily\color{red}\rlap\&Z & i1+1 & j1+1\\\hline +a2+1& b2+1 & & & & & & & g2+1 & h2+1\\\hline +\end{spreadtab} +\end{lstlisting} +\begin{center} +\begin{spreadtab}{{tabular}{|*{7}{c|}}} +\hline +1 & 2 & \SThidecol3 & \SThidecol4 & 5& \SThidecol6 & 7& 8& 9 & 10 \\\hline +a1+1& \multicolumn4{l|}{:={b1+1}}& & i1+1 & j1+1\\\hline +a2+1& b2+1 & & & & & & & g2+1 & h2+1\\\hline +\end{spreadtab} +\end{center} +Voici encore un exemple similaire où une seule colonne est masquée (la colonne \falseverb d), et où $a=1$ et $b=0$ :\par\nobreak +\begin{lstlisting} +\begin{spreadtab}{{tabular}{|*{9}{c|}}} +\hline +1 & 2 & 3 & \SThidecol4 & 5 & 6 & 7 & 8 & 9 & 10 \\\hline +a1+1& \multicolumn6{l|}{:={b1+1}} & i1+1 & j1+1\\\hline +a2+1& b2+1 & & & & & & & h2+1 & i2+1\\\hline +\end{spreadtab} +\end{lstlisting} +\begin{center} +\begin{spreadtab}{{tabular}{|*{9}{c|}}} +\hline +1 & 2 & 3 & \SThidecol4 & 5 & 6 & 7 & 8 & 9 & 10 \\\hline +a1+1& \multicolumn6{l|}{:={b1+1}} & i1+1 & j1+1\\\hline +a2+1& b2+1 & & & & & & & h2+1 & i2+1\\\hline +\end{spreadtab} +\end{center} + +\subsection{Messages émis par \ST} +Le package émet des messages d'erreur et arrête la compilation dans ces cas :\parindent2em\smallskip +\begin{itemize} + \item Pour calculer une cellule, on calcule de proche en proche des cellules qui par le jeu des références, reviennent sur la cellule d'origine (références circulaires). Dans ce cas, l'arbre des dépendances est affiché dans le message d'erreur; + \item une formule nécessitant un nombre fait référence à une cellule vide ou ne contenant que du texte; + \item une cellule fait référence à une cellule non définie (hors limite du tableau); + \item une cellule fait référence à une cellule fusionnée par un \verbinline-\multicolumn-; + \item une référence relative entre crochets ne respecte pas la syntaxe. +\end{itemize}\parindent0pt\medskip + +Le package peut émettre des messages d'information (dans le fichier de log), ce qu'il fait par défaut. La commande \verbinline-\STmessage- permet ou pas l'émission de messages d'information. Pour chacune des ces altenatives, la syntaxe est la suivante : \verbinline-\STmessage{true}- ou \verbinline-\STmessage{false}-. + +Pour comprendre la signification des messages, prenons un tableau simple :\par\nobreak +\begin{minipage}{0.65\linewidth} +\begin{lstlisting} +\begin{spreadtab}{{tabular}{|cccc|c|}}\hline +b1+1 & c1+1 & d1+1 & 10 & a1+b1+c1+d1\\\hline +\end{spreadtab} +\end{lstlisting} +\end{minipage}% +\begin{minipage}{0.35\linewidth} +\centering +\begin{spreadtab}{{tabular}{|cccc|c|}}\hline +b1+1 & c1+1 & d1+1 & 10 & a1+b1+c1+d1\\\hline +\end{spreadtab} +\end{minipage} + +Le fonctionnement du tableau est ici très simple à comprendre. Voici les informations délivrées par \ST :\par\nobreak +\begin{lstlisting} +[spreadtab] New spreadtab {tabular}{|cccc|c|} +* reading tab: ok +* computing formulas: + cell A1-B1-C1 + cell B1 + cell C1 + cell D1 + cell E1 +* building tab: ok +[spreadtab] End of spreadtab +\end{lstlisting} +L'environnement spécifié par l'utilisateur est repris entre parenthèses (ici \verbinline-{tabular}{|cccc|c|}-). Précédées d'une étoile, on retrouve les 3 étapes nécessaires à \ST pour mener à bien sa mission : lecture du tableau, calcul des formules et construction du tableau final. + +Pour la seconde étape, les cellules sont évaluées de haut en bas, de gauche à droite : \ST indique qu'il commence par essayer de calculer la première cellule \falseverb{A1}. Pour cela, il indique qu'il doit d'abord évaluer \falseverb{B1} et avant cela encore, évaluer \falseverb{C1}. Comme il n'y a plus de cellule après \falseverb{C1}, c'est qu'elle peut être évaluée; en effet, elle ne dépend que de \falseverb{D1} qui est un nombre égal à 10. + +Pour chaque ligne suivante, il n'y a qu'une seule cellule ce qui signifie que lorsque \ST essaie de les évaluer, elles l'ont déjà été et sont des nombres ou alors, elles ne font références qu'à des cellules déjà calculées. + +\section{Des 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 ! + +\subsection{Encore un triangle de Pascal} +\begin{lstlisting} +\begin{spreadtab}{{tabular}{*7r}} +[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]\\ +[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1] & \\ +[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1] & & \\ +[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1] & & & \\ +[0,1] & [-1,1]+[0,1] & [-1,1] & & & & \\ +[0,1] & [-1,1] & & & & & \\ +\color{red}:={1}& & & & & & +\end{spreadtab} +\end{lstlisting} +\begin{center} +\begin{spreadtab}{{tabular}{*7r}} +[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]\\ +[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1] & \\ +[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1] & & \\ +[0,1] & [-1,1]+[0,1] & [-1,1]+[0,1] & [-1,1] & & & \\ +[0,1] & [-1,1]+[0,1] & [-1,1] & & & & \\ +[0,1] & [-1,1] & & & & & \\ +\color{red}:={1}& & & & & & +\end{spreadtab} +\end{center} + +\subsection{La convergence d'une série} +Pour les matheux, il s'agit du développement limité de la fonction exponentielle en \numprint{0.5}. En effet, +\[\forall x\in \mathbf{R}\qquad e^x=\sum_{k=0}^\infty\frac{x^k}{k!}\] +et le tableau illustre la rapidité de la convergence au fur et à mesure de l'ordre du développement limité.\par\nobreak +\begin{lstlisting} +\STautoround{15} +\begin{spreadtab}[\STsavecell\xvalue{a1}]{{tabular}{cN{2}{15}}} +\multicolumn{2}{c}{Convergence en $x=\color{red}{\numprint{:={0.5}}}$}\\[1.5ex] +@$n$ & e^a1\SThidecol & \hfill{@ $\displaystyle e^{\numprint\xvalue}-\sum_{k=0}^n\frac{\numprint\xvalue^k}{k!}$}\hfill\\[3ex]\hline +\color{red}:={0}& a1^[-1,0]/fact([-1,0]) & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\\hline +\end{spreadtab} +\end{lstlisting} +\begin{center} +\STautoround{15} +\begin{spreadtab}[\STsavecell\xvalue{a1}]{{tabular}{cN{2}{15}}} +\multicolumn{2}{c}{Convergence en $x=\color{red}{\numprint{:={0.5}}}$}\\[1.5ex] +@$n$ & e^a1\SThidecol & \hfill{@ $\displaystyle e^{\numprint\xvalue}-\sum_{k=0}^n\frac{\numprint\xvalue^k}{k!}$}\hfill\\[3ex]\hline +\color{red}:={0}& a1^[-1,0]/fact([-1,0]) & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\ + [0,-1]+1 & a1^[-1,0]/fact([-1,0])+[0,-1] & b2-[-1,0] \\\hline +\end{spreadtab} +\end{center} + +\subsection{Convergence vers le nombre d'or} +Voici la définition des nombres de Fibonacci : $F_0=1\qquad F_1=1\qquad F_{n+2}=F_{n+1}+F_n$ + +On va mettre ici en évidence que le quotient de 2 nombres de Fibonacci consécutifs $F_n$ et $F_{n-1}$ tend vers le nombre d'or $\varphi=\frac{1+\sqrt{5}}{2}$ de telle sorte que la suite $u_n=\varphi-\frac{F_n}{F_{n-1}}$ soit alternativement positive et négative.\par\nobreak +\begin{lstlisting} +\STautoround{9} +$ +\begin{spreadtab}{{matrix}{}} +@n & @F_n & @\dfrac{F_n}{F_{n-1}} & @\varphi-\dfrac{F_n}{F_{n-1}}\\[2ex]\hline +\color{red}:=1 & \color{red}:=1 & & \\ +[0,-1]+1 & \color{red}:=1 & [-1,0]/[-1,-1] & (1+5^0.5)/2-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\\hline +\end{spreadtab} +$ +\end{lstlisting} +\begin{center} +\STautoround{9} +$ +\begin{spreadtab}{{matrix}{}} +@n & @F_n & @\dfrac{F_n}{F_{n-1}} & @\varphi-\dfrac{F_n}{F_{n-1}}\\[2ex]\hline +\color{red}:=1 & \color{red}:=1 & & \\ +[0,-1]+1 & \color{red}:=1 & [-1,0]/[-1,-1] & (1+5^0.5)/2-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\ +[0,-1]+1 & [0,-1]+[0,-2] & [-1,0]/[-1,-1] & d3+1-[-1,0] \\\hline +\end{spreadtab} +$ +\end{center} + +\subsection{Un 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}. + +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} +\nprounddigits2 +\let\PC\% +\begin{spreadtab}{{tabularx}{0.8\linewidth}{|>{\rule[-1.2ex]{0pt}{4ex}}X>{{\color{red}}}N42>{\color{red}}cN42>{\color{red}}cN42|}} +\hline +@D\'esignation &@\multicolumn{1}{c}{Prix U}& @\multicolumn{1}{c}{Qt\'e} & @\multicolumn{1}{c}{Prix} & @\multicolumn{1}{c}{R\'eduction} & @\textbf{\`A payer}\\\hline +@Item 1 & 5.99 & 20 & [-2,0]*[-1,0] & $-:={20}\PC$ & [-2,0]*(1-[-1,0]/100)\\ +@Item 2 & 12 & 7 & [-2,0]*[-1,0] & $-:={10}\PC$ & [-2,0]*(1-[-1,0]/100)\\ +@Item 3 & 4.50 & 40 & [-2,0]*[-1,0] & $-:={35}\PC$ & [-2,0]*(1-[-1,0]/100)\\ +@Item 4 & 650 & 2 & [-2,0]*[-1,0] & $-:={15}\PC$ & [-2,0]*(1-[-1,0]/100)\\\hline +@\multicolumn{6}{c}{\vspace{-1.5ex}}\\\cline{4-6}% ligne vide et on remonte un peu ! +@\multicolumn{1}{c}{\rule[-1.2ex]{0pt}{4ex}}&@\multicolumn{2}{r|}{\textbf{Total}}& sum(d2:[0,-2]) & \multicolumn{1}{c}{$:={round(([1,0]/[-1,0]-1)*100,0)}\PC$} & {\fontseries{b}\selectfont}:={sum(f2:[0,-2])}\\ +\cline{4-6} +\end{spreadtab} +\end{lstlisting} +\begin{center} +\nprounddigits2 +\let\PC\% +\begin{spreadtab}{{tabularx}{0.8\linewidth}{|>{\rule[-1.2ex]{0pt}{4ex}}X>{{\color{red}}}N42>{\color{red}}cN42>{\color{red}}cN42|}} +\hline +@D\'esignation &@\multicolumn{1}{c}{Prix U}& @\multicolumn{1}{c}{Qt\'e} & @\multicolumn{1}{c}{Prix} & @\multicolumn{1}{c}{R\'eduction} & @\textbf{\`A payer}\\\hline +@Item 1 & 5.99 & 20 & [-2,0]*[-1,0] & $-:={20}\PC$ & [-2,0]*(1-[-1,0]/100)\\ +@Item 2 & 12 & 7 & [-2,0]*[-1,0] & $-:={10}\PC$ & [-2,0]*(1-[-1,0]/100)\\ +@Item 3 & 4.50 & 40 & [-2,0]*[-1,0] & $-:={35}\PC$ & [-2,0]*(1-[-1,0]/100)\\ +@Item 4 & 650 & 2 & [-2,0]*[-1,0] & $-:={15}\PC$ & [-2,0]*(1-[-1,0]/100)\\\hline +@\multicolumn{6}{c}{\vspace{-1.5ex}}\\\cline{4-6}% ligne vide et on remonte un peu ! +@\multicolumn{1}{c}{\rule[-1.2ex]{0pt}{4ex}}&@\multicolumn{2}{r|}{\textbf{Total}}& sum(d2:[0,-2]) & \multicolumn{1}{c}{$:={round(([1,0]/[-1,0]-1)*100,0)}\PC$} & {\fontseries{b}\selectfont}:={sum(f2:[0,-2])}\\ +\cline{4-6} +\end{spreadtab} +\end{center} + +\subsection{Un carré magique} +\begin{lstlisting} +\begin{spreadtab}{{tabular}{|*3{>{\hfill\rule[-0.4cm]{0pt}{1cm}$}m{0.7cm}<{$\hfill\null}|}}} +\hline +\color{red}:=2 & 5*b2-4*a1 & 3*a1-2*b2 \\\hline +2*a1-b2 & \color{red}:={-1} & 3*b2-2*a1 \\\hline +4*b2-3*a1 & 4*a1-3*b2 & 2*b2-a1 \\\hline +\end{spreadtab} +\end{lstlisting} +\begin{center} +\begin{spreadtab}{{tabular}{|*3{>{\hfill\rule[-0.4cm]{0pt}{1cm}$}m{0.7cm}<{$\hfill\null}|}}} +\hline +\color{red}:=2 & 5*b2-4*a1 & 3*a1-2*b2 \\\hline +2*a1-b2 & \color{red}:={-1} & 3*b2-2*a1 \\\hline +4*b2-3*a1 & 4*a1-3*b2 & 2*b2-a1 \\\hline +\end{spreadtab} +\end{center} + +\subsection{Une pyramide additive} +Chaque nombre est la somme des deux nombres se trouvant au dessous de lui.\par\nobreak +\begin{lstlisting} +\newlength\cellsize +\setlength\cellsize{1.5cm} +\newcolumntype{K}{@{}>{\rule{0pt}{2.5ex}\centering\arraybackslash$}p{\cellsize}<$@{}} +\begin{spreadtab}{{tabular}{*{8}{@{}p{.5\cellsize}@{}}}} +\cline{4-5} +&&&\multicolumn{2}{|K|}{:={[-1,1]+[1,1]}}&&&\\\cline{3-6} +&&\multicolumn{2}{|K}{:={[-1,1]+[1,1]}}&\multicolumn{2}{|K|}{:={[-1,1]+[1,1]}}&&\\\cline{2-7} +&\multicolumn{2}{|K}{:={[-1,1]+[1,1]}}&\multicolumn{2}{|K}{:={[-1,1]+[1,1]}}&\multicolumn{2}{|K|}{:={[-1,1]+[1,1]}}&\\\hline +\multicolumn{2}{|K}{\color{red}:={-5}}&\multicolumn{2}{|K}{\color{red}:={3}}&\multicolumn{2}{|K}{\color{red}:={-2}}&\multicolumn{2}{|K|}{\color{red}:={-3}}\\\hline +\end{spreadtab} +\end{lstlisting} +\begin{center} +\newlength\cellsize +\setlength\cellsize{1.5cm} +\newcolumntype{K}{@{}>{\rule{0pt}{2.5ex}\centering\arraybackslash$}p{\cellsize}<$@{}} +\begin{spreadtab}{{tabular}{*{8}{@{}p{.5\cellsize}@{}}}} +\cline{4-5} +&&&\multicolumn{2}{|K|}{:={[-1,1]+[1,1]}}&&&\\\cline{3-6} +&&\multicolumn{2}{|K}{:={[-1,1]+[1,1]}}&\multicolumn{2}{|K|}{:={[-1,1]+[1,1]}}&&\\\cline{2-7} +&\multicolumn{2}{|K}{:={[-1,1]+[1,1]}}&\multicolumn{2}{|K}{:={[-1,1]+[1,1]}}&\multicolumn{2}{|K|}{:={[-1,1]+[1,1]}}&\\\hline +\multicolumn{2}{|K}{\color{red}:={-5}}&\multicolumn{2}{|K}{\color{red}:={3}}&\multicolumn{2}{|K}{\color{red}:={-2}}&\multicolumn{2}{|K|}{\color{red}:={-3}}\\\hline +\end{spreadtab} +\end{center}\medskip +\parskip0pt +\begin{center} +$\star$\par +$\star\quad\star$ +\end{center} +C'est tout, j'espère que cette extension vous sera utile !\par\nobreak\medskip +Compte tenu de la jeunesse de ce package, soyez indulgent quant aux dysfonctionnements rencontrés : avec les remarques des utilisateurs, des versions plus abouties verront le jour. En effet, cette version n'est qu'un début et l'ensemble, quoique plutôt stable, reste encore imparfait. Il reste notamment beaucoup de macro-fonctions à écrire.\par\nobreak\medskip +Je vous remercie donc d'avance de me signaler par \href{mailto:unbonpetit@gmail.com}{\texttt{\textbf{email}}} tout bug, toute macro-fonction à implémenter que vous pensez utile ou toute proposition d'amélioration \emph{réaliste} : il ne faut pas oublier que cette extension doit rester modeste, que \ST n'est pas excel ou calc et qu'il est impossible d'implémenter toutes les fonctionnalités avancées de ces tableurs.\par\nobreak\bigskip +Christian \textsc{Tellechea} +\end{document}
\ No newline at end of file |