<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% !TeX TS-program = lualatex
% Documentation de l'extension "spreadtab"
\documentclass[french,a4paper,10pt]{article}
\usepackage[a4paper,margin=2.5cm]{geometry}
\usepackage[table]{xcolor}
\usepackage{amsmath,amssymb,array,longtable,arydshln,tabularx,xspace,fancyhdr,babel,siunitx,enumitem,spreadtab}
\frenchsetup{og=Â«,fg=Â»,StandardListSpacing=true}

\newlength\mylabelwidth
\settowidth\mylabelwidth\textemdash
\setlist[itemize]{label=\textemdash}
\setlist[1]{labelindent=2em}
\setlist{
	labelwidth=\mylabelwidth,
	leftmargin=!,
	itemsep=.6ex plus.3ex minus.3ex,
	parsep=.2ex plus.1ex minus.1ex,
	topsep=\glueexpr.7ex plus.3ex minus.3ex-\parskip\relax,
	partopsep=0ex
}

\usepackage[no-math]{fontspec}
\usepackage[libertine]{newtxmath}
\usepackage{libertineRoman}
\setmonofont[Scale=MatchLowercase]{DejaVu Sans Mono}

\fancyhead[L]{}\fancyhead[C]{}\fancyhead[R]{\scriptsize\slshape \leftmark}
\fancyfoot[l]{}\fancyfoot[c]{}\fancyfoot[r]{\thepage}
\renewcommand\headrulewidth{0pt}

\usepackage[bottom]{footmisc}
\usepackage[protrusion=true,final,verbose=false,babel=true]{microtype}

%-- environnement \exemple
\makeatletter
\newcommand\make@car@active[1]{%
	\catcode`#1\active
	\begingroup
		\lccode`\~`#1\relax
		\lowercase{\endgroup\def~}%
}
\newif\if@exstar
\newcommand\exemple{%
	\begingroup
		\parskip\z@
		\@makeother\;\@makeother\!\@makeother\?\@makeother\:% neutralise french
		\@ifstar
			{\@exstartrue\exemple@}
			{\@exstarfalse\exemple@}%
}

\newcommand\exemple@[1][65]{%
		\medbreak
		\noindent
		\begingroup
			\let\do\@makeother\dospecials
			\make@car@active\ {\space}%
			\make@car@active\^^M{\par\noexpand\color{black}\leavevmode\noexpand\normalshape}%
			\make@car@active\^^I{\space\space\space\space}%
			\make@car@active\,{\leavevmode\kern\z@\string,}%
			\make@car@active\-{\leavevmode\kern\z@\string-}%
			\make@car@active\&gt;{\leavevmode\kern\z@\string&gt;}%
			\make@car@active\&lt;{\leavevmode\kern\z@\string&lt;}%
			\make@car@active\%{\noexpand\itshape\noexpand\color{gray}\char37 }
			\exemple@@{#1}%
}

\newcommand\exemple@@[2]{%
			\def\@tempa##1#2{\exemple@@@{#1}{##1}}%
			\@tempa
}

\newcommand\exemple@@@[2]{%
			\xdef\the@code{#2}%
		\endgroup
		\vskip0.5ex
		\fboxsep5pt
		\fboxrule.4pt
		\if@exstar
			\fbox{%
				\vtop{%
					\hsize\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax
					\hbox{%
						\vtop{%
							\hsize\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax
							\parskip0pt
							\ttfamily
							\footnotesize
							\the@code
							}%
						}
					\kern5pt
					\hrule
					\kern5pt
					\hbox{%
						\vtop{%
							\hsize\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax
							\footnotesize
							\newlinechar`\^^M
							\everyeof{\noexpand}%
							\centering
							\scantokens{#2}%
						}%
					}
				}%
			}%
		\else
			\fbox{%
				$
				\vcenter{%
					\hsize\dimexpr0.#1\linewidth-\fboxsep-\fboxrule\relax
					\parskip0pt
					\ttfamily
					\footnotesize
					\the@code
				}%
				\vcenter{%
					\hsize\dimexpr\linewidth-0.#1\linewidth-\fboxsep-\fboxrule\relax
					\footnotesize
					\newlinechar`\^^M
					\everyeof{\noexpand}%
					\scantokens{#2}%
				}$%
			}%
		\fi
		\medbreak
	\endgroup
}

%%%%%%%%%%% environnement OOcalc
\newcount\cntlin
\newcount\cntcol
\newcommand*\tabfont{\sffamily\footnotesize}% police du tableau (helvetica ici)
\newcommand*\tableheadformat{\bfseries}% police des en-tÃªtes du tableau (en gras)
\colorlet{tabheadcolor}{gray!40}% couleur de font des en-tÃªtes du tableau
\newtoks\t@b
\long\def\ifremain@lines#1\\#2\@nil{%
	\csname @\ifx\@empty#2\@empty second\else first\fi oftwo\endcsname}
\long\def\subst@eol#1\\#2\@nil{\addtot@b{#1\\\cline{1-1}\hdashline}%
	\ifremain@lines#2\\\@nil{\addtot@b&amp;\subst@eol#2\@nil}{\addtot@b{#2\end{tabular}}}}
\long\def\collect@body#1\end{\subst@eol#1\@nil\end}

\newcommand\addtot@b[1]{\t@b\expandafter{\the\t@b#1}}
\newcommand\edftot@b[1]{\edef\temp@{#1}\expandafter\addtot@b\expandafter{\temp@}}

\newenvironment{OOocalc}[2][1.5cm]{% #1=largeur colonnes #2 = nombre de colonnes
	\arrayrulewidth0.4pt \dashlinedash0.4pt \relax\dashlinegap3pt
	\global\cntlin\m@ne\global\cntcol\z@
	\tabfont
	\tabcolsep0pt
	\t@b{\begin{tabular}{%
		|&gt;{\cellcolor{tabheadcolor}%
			\global\cntcol\z@\global\advance\cntlin\@ne
			\centering\arraybackslash
			\ifnum\cntlin&gt;\z@\tableheadformat\number\cntlin\fi}
		m{2em}|*{#2}{&gt;{\centering\arraybackslash}m{#1}:}}%
		\hline
		\rowcolor{tabheadcolor}}%
	\loop
		\ifnum\cntcol&lt;#2
			\advance\cntcol\@ne
			\addtot@b{&amp;\multicolumn{1}{&gt;\centering m{#1}|}}%
			\edftot@b{{\noexpand\tableheadformat\@Alph\cntcol}}%
	\repeat
	\addtot@b{\\\hline&amp;}%
	\collect@body}{\the\t@b}

\def\longfrdate@i#1/#2/#3\@nil{\number#3\relax\ifnum#3=1 \ier\fi\space\ifcase #2 \or janvier\or fÃ©vrier\or mars\or avril\or mai\or juin\or juillet\or aout\or septembre\or octobre\or novembre\or dÃ©cembre\fi\space#1}
\def\longfrdate{\expandafter\longfrdate@i\STdate\@nil}

\newif\ifchevrons \chevronstrue
\long\def\centerverb#1{%
	\def\centerverb@i##1#1{##1\smallbreak\egroup}%
	\bgroup
		\ttfamily\@noligs
		\parindent3em
		\par
		\smallskip\nobreak
		\parskip2pt
		\let\do\@makeother \dospecials
		\@vobeyspaces
		\obeylines
		\make@car@active\^^I{\leavevmode\space\space\space\space}%
		\ifchevrons
			\make@car@active\&lt;{\begingroup$\langle$\itshape}%
			\make@car@active\&gt;{\/$\rangle$\endgroup}%
		\fi
		\centerverb@i
}
\begingroup
	\catcode`\&lt;13
	\catcode`\&gt;13
	\gdef\Verb{%
		\relax\ifmmode\hbox\else\leavevmode\null\fi
		\bgroup
			\verb@eol@error
			\let\do\@makeother \dospecials
			\verbatim@font\@noligs
			\catcode`\&lt;13
			\catcode`\&gt;13
			\def&lt;{\begingroup$\langle$\itshape}%
			\def&gt;{\/$\rangle$\endgroup}%
			\@ifstar\@sverb\@verb
	}
\endgroup
\makeatother

\newcommand*\ST{\textsf{\STname}\xspace}
\newcommand*\xfp{\texttt{l3fp}\xspace}
\newcommand*\falseverb[1]{\texttt{\detokenize{#1}}}
\newcommand*\NEW{\marginpar{\vspace{-1.5ex}\itshape\color{red}New v\STver}}
\newcommand*\chevrons[1]{\textlangle\textit{#1}\textrangle}
\newcommand*\STkey[1]{{\color{teal}\texttt{\detokenize{#1}}}}
\newcommand*\STval[2][\itshape]{{\color{teal}\textlangle{\ttfamily#1#2}\textrangle}\if\relax\detokenize{#2}\relax\quad(vide)\fi}
\newcommand*\STkv[2]{\STkey{#1}{\color{teal}${}={}$}\STval{#2}}
\newcommand*\STmacro[1]{\texttt{#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}

\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\STver\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@netc.fr}{\texttt{\textbf{unbonpetit@netc.fr}}}\par\vspace{5pt}
		\longfrdate
	\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 Â«tableauÂ» avec \LaTeX{}.\par\smallskip
				La principale fonctionnalitÃ© Ã©tant de pouvoir Ã©crire des formules dans les cellules d'un tableau qui font rÃ©fÃ©rence Ã&nbsp; 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{PrÃ©sentation}
Ce manuel dÃ©crit l'extension \ST. Elle permet de construire des tableaux similaires Ã&nbsp; des feuilles de calcul. 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
\centerverb|\usepackage{spreadtab}|

Ce package nÃ©cessite le format \LaTeXe{} postÃ©rieur au 2022/06/01 ainsi que les packages \href{https://ctan.org/pkg/xstring}{\texttt{xstring}} et \href{https://ctan.org/pkg/simplekv}{\texttt{simplekv}}.

Ce package est censÃ© Ãªtre compatible avec \emph{tous} les environnements de tableaux, sous rÃ©serve que les sÃ©parateurs entre colonnes soient Â«\verb=&amp;=Â» et les retours Ã&nbsp; la ligne soient Â«\verb=\\=Â». \ST agit de 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. Si la macro \verb|\STxp| est prÃ©sente une ou plusieurs fois, son argument est dÃ©veloppÃ© au maximum. Le corps du tableau est ensuite divisÃ© en lignes puis en cellules;
	\item le calcul des formules contenues dans les cellules est ensuite effectuÃ©, en ayant pris soin pour chacune de calculer auparavant les cellules dÃ©pendantes;
	\item le corps du tableau est enfin reconstruit en ayant remplacÃ© chaque formule par la valeur numÃ©rique prÃ©alablement calculÃ©e et le tout est donnÃ© Ã&nbsp; l'environnement tableau spÃ©cifiÃ© par l'utilisateur.
\end{itemize}

La syntaxe est :
\centerverb/\begin{spreadtab}[&lt;options&gt;]{{&lt;tabname&gt;}{&lt;colspec&gt;}}
    tableau avec formules et nombres
\end{spreadtab}/

oÃ¹ \Verb-&lt;tabname&gt;- reprÃ©sente le nom de n'importe quel environnement de type tableau disponible avec \LaTeX{} ou avec un package. Il est possible de remplacer \verb|\begin{spreadtab}...\end{spreadtab}| par \verb|\spreadtab...\endspreadtab|.

Les \Verb|&lt;options&gt;| doivent se prÃ©senter sous la forme \STkv{clÃ©}{valeur} pour ne s'appliquer qu'au tableau en cours. Pour spÃ©cifier des \Verb|&lt;options&gt;| valables pour tous les tableaux Ã&nbsp; venir, on utilise
\centerverb|\STset{&lt;clÃ©&gt;=&lt;valeur&gt;}|
La liste des \STkey{clÃ©s} et des \STval{valeurs} associÃ©es est disponible Ã&nbsp; la page~\pageref{key/val}.

MÃªme si disposer de fonctionnalitÃ©s ressemblant Ã&nbsp; 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 Ã&nbsp; des temps de compilation \emph{beaucoup plus importants} qu'avec un tableau classique.

\section{Nouveau dans la version 0.61}
\subsection{Suppressions}
Les macro-fonctions \STmacro{ifeq}, \STmacro{iflt} et \STmacro{ilgt} sont supprimÃ©es puisque \xfp met Ã&nbsp; disposition l'opÃ©rateur ternaire
\centerverb|&lt;test&gt;?&lt;vrai&gt;:&lt;faux&gt;|

Les macros des versions prÃ©cÃ©dentes \verb|\STautoround|, \verb|\STsetdecimalsep|, \verb|\STeol|, \verb|\STsetdisplaymarks|, \verb|\STmessage|, \verb|\STnumericfieldmarker|, \verb|\STtextcell| et \verb|\STtranposechar| sont supprimÃ©es : tous les rÃ©glages se font dÃ©sormais par l'intermÃ©diaire de \Verb|\STset{&lt;clÃ©s&gt;=&lt;valeurs&gt;}|.

\subsection{La macro \texttt{\textbackslash STrep}}
Voir page~\pageref{STrep}.

\subsection{La macro fonction \STmacro{test}}
Voir page~\pageref{test}.

\section{FonctionnalitÃ©s courantes}
\subsection{Calcul}
Une cellule peut contenir tout calcul compris par \xfp : opÃ©rations courantes, trigonomÃ©trie et inverses, exponentielles et logarithmes, comparaisons, connecteurs logiques\footnote{Si l'on souhaite utiliser le connecteur logique Â«etÂ» de \xfp notÃ© Â«\texttt{\string&amp;\string&amp;}Â», il est \emph{obligatoire} de mettre cet opÃ©rateur entre accolades dans un tableau afin que les tokens \texttt{\string&amp;} 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 Ã&nbsp; un intervalle, on Ã©crira donc par exemple Â«\texttt{a1&gt;1 \string{\string&amp;\string&amp;\string} a1&lt;10}Â».}, factorielle, nombres alÃ©atoires, etc. Voir la documentation de \href{http://mirrors.ctan.org/macros/latex/required/l3kernel/interface3.pdf}{\texttt{interface3}}.

Par consÃ©quent, les macro-fonctions \STmacro{rand}, \STmacro{rnd} et \STmacro{fact} sont toujours utilisables, mais ne sont \emph{plus} des macro-fonctions de \ST : elles sont directement comprises par \xfp.

\subsection{Fins de ligne}
Par dÃ©faut, \ST considÃ¨re qu'une ligne se termine avec \verb-\\-, ce qui est habituel dans les tableaux. L'Ã©ventuel argument optionnel \Verb-\\[&lt;dimension&gt;]- qui le suit est pris en compte. Ce marqueur de fin de ligne peut Ãªtre modifiÃ© par la clÃ© \STkey{tabline sep}\label{tabline sep}. On peut par exemple Ã©crire
\centerverb|tabline sep = \tabularnewline|

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Ã©.

Juste aprÃ¨s le retour Ã&nbsp; la ligne, \ST reconnaÃ®t la plupart des filets horizontaux ainsi que leur Ã©ventuel argument : \verb|\hline|, \verb|\cline|, \verb|\hhline|, \verb|\noalign|, \verb|\toprule|, \verb|\midrule|, \verb|\bottomrule|, \verb|\cmidrule|, \verb|\addlinespace|, \verb|\morecmidrules| et \verb|\specialrule|.

Pour d'autres cas, voir page~\pageref{filets horizontaux} comment procÃ©der.

\subsection{RÃ©fÃ©rences absolues}
Dans le tableau, les cellules sont repÃ©rÃ©es par leur rÃ©fÃ©rences absolues de cette faÃ§on :
\begin{itemize}
	\item la colonne est une lettre, majuscule ou minuscule, de \falseverb a Ã&nbsp; \falseverb z oÃ¹ \falseverb a reprÃ©sente la 1\iere{} colonne de gauche : on est donc d'emblÃ©e limitÃ© Ã&nbsp; 26 colonnes, ce qui devrait suffire pour la grande majoritÃ© des cas;
	\item Ã&nbsp; 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 : Â«\falseverb{b4}Â», Â«\falseverb{C1}Â» ou Â«\falseverb{d13}Â». Visuellement, on peut illustrer ce fonctionnement par ce genre de tableau ressemblant Ã&nbsp; un tableur, ici volontairement limitÃ© Ã&nbsp; 5 lignes et 5 colonnes :
\begin{center}
\begin{OOocalc}[6em]{5}
&amp;&amp;&amp;&amp;\\&amp;&amp;&amp;&amp;\\&amp;&amp;&amp;&amp;\\&amp;&amp;&amp;&amp;\\&amp;&amp;&amp;&amp;\\
\end{OOocalc}
\end{center}
Dans cet exemple, on calcule la somme de chaque ligne et de chaque colonne puis, la somme totale :
\exemple/\begin{spreadtab}{{tabular}{rr|r}}
	22       &amp; 54         &amp; a1+b1 \\
	43       &amp; 65         &amp; a2+b2 \\
	49       &amp; 37         &amp; a3+b3 \\
	\hline
	a1+a2+a3 &amp; b1+b2+b3   &amp; a4+b4
\end{spreadtab}/

Dans cet autre exemple, on calcule quelques lignes du triangle de Pascal :
\exemple/\begin{spreadtab}{{tabular}{ccccc}}
	1  &amp;       &amp;       &amp;       &amp;    \\
	a1 &amp; a1    &amp;       &amp;       &amp;    \\
	a2 &amp; a2+b2 &amp; b2    &amp;       &amp;    \\
	a3 &amp; a3+b3 &amp; b3+c3 &amp; c3    &amp;    \\
	a2 &amp; a4+b4 &amp; b4+c4 &amp; c4+d4 &amp; d4
\end{spreadtab}/

\subsection{RÃ©fÃ©rences relatives}
Pour faire rÃ©fÃ©rence Ã&nbsp; une cellule, on peut spÃ©cifier sa position par rapport Ã&nbsp; la cellule oÃ¹ se trouve la formule. Ainsi, les coordonnÃ©es Â«relativesÂ» d'une cellule sont 2 nombres relatifs Ã©crits selon cette syntaxe : \Verb|[&lt;x&gt;,&lt;y&gt;]|, oÃ¹ \Verb|&lt;x&gt;| est le dÃ©calage horizontal par rapport Ã&nbsp; la cellule contenant la formule et \Verb|&lt;y&gt;| est le dÃ©calage vertical. Ainsi, \falseverb{[-2,3]} fait rÃ©fÃ©rence Ã&nbsp; la cellule se trouvant 2 colonnes avant (Ã&nbsp; gauche) et 3 lignes aprÃ¨s (plus bas) la cellule oÃ¹ se trouve la formule.

Voici Ã&nbsp; nouveau le triangle de Pascal vu ci-dessus, mais les rÃ©fÃ©rences sont relatives et l'environnement Â«\verb-matrix-Â» du package \href{https://ctan.org/pkg/amsmath}{\texttt{amsmath}} est utilisÃ© :
\exemple/$
\begin{spreadtab}{{matrix}{}}
	1\\
	[0,-1] &amp; [-1,-1]\\
	[0,-1] &amp; [-1,-1]+[0,-1] &amp; [-1,-1]\\
	[0,-1] &amp; [-1,-1]+[0,-1] &amp; [-1,-1]+[0,-1] &amp; [-1,-1]\\
	[0,-1] &amp; [-1,-1]+[0,-1] &amp; [-1,-1]+[0,-1] &amp; [-1,-1]+[0,-1] &amp; [-1,-1]
\end{spreadtab}
$/

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 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 Ã&nbsp; qui il n'est pas possible\footnote{Il y a une exception Ã&nbsp; cette rÃ¨gle, voir la page \protect\pageref{datetonum}.} de faire rÃ©fÃ©rence nulle part ailleurs dans le tableau.

La clÃ© \STkey{text mark}\label{text mark} permet de modifier le marqueur de texte. Par exemple
\centerverb/\STset{text mark=`}/
fera qu'une cellule contenant le caractÃ¨re Â«\verb=`=Â» sera comprise comme Ã©tant une cellule de texte. Il est cependant important de noter que la clÃ© \STkey{text mark} dÃ©tokenize sa valeur, ce qui rend le marqueur de texte constituÃ© de token(s) de catcode 12 : pour Ãªtre reconnus par \ST, ces tokens doivent avoir ce catcode 12 au moment de la lecture du tableau.
\exemple/\begin{spreadtab}{{tabular}{|r|ccc|}}\hline
	@ valeurs de $x$ &amp; -5                   &amp; -1 &amp; 4 \\
	@ $f(x)=2x$      &amp; \STcopy&gt;{2*[0,-1]}   &amp;    &amp;   \\\hline
\end{spreadtab}\medbreak
\STset{text mark=`}
\begin{spreadtab}{{tabular}{|r|ccc|}}\hline
	`valeurs de $x$ &amp; -5                   &amp; -1 &amp; 4 \\
	`$f(x)=2x$      &amp; \STcopy&gt;{2*[0,-1]}   &amp;    &amp;   \\\hline
\end{spreadtab}/

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 \chevrons{champ numÃ©rique} qui contient la formule et de l'autre le \chevrons{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 \chevrons{champ numÃ©rique}, et le \chevrons{champ textuel} est vide;
	\item si la cellule contient Â«\falseverb{@}Â», alors la totalitÃ© de la cellule est considÃ©rÃ©e comme Ã©tant le \chevrons{champ textuel}. Le \chevrons{champ numÃ©rique} est vide et inaccessible.
	\item si la cellule contient Â«\verb-:=-Â», alors l'argument entre accolades qui suit est le \chevrons{champ numÃ©rique}, et tout le reste est le \chevrons{champ textuel}. La cellule a cette structure :
		\centerverb|&lt;champ textuel&gt;:={&lt;champ numÃ©rique&gt;}&lt;champ textuel&gt;|
	Avec la clÃ© \STkey{numeric mark}\label{numeric mark}, on peut changer ce marqueur en Â«\verb-\=-Â» avec :
		\centerverb|numeric mark={\=}|
	Dans ce cas, la dÃ©finition 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 \chevrons{champ numÃ©rique} calculÃ©, lui seul et le marqueur Â«\verb-:=-Â» seront remplacÃ©s par la valeur numÃ©rique calculÃ©e.

Il faut noter que \chevrons{champ numÃ©rique} peut se trouver Ã&nbsp; l'intÃ©rieur d'accolades.

Pour fixer les idÃ©es, voici un exemple trÃ¨s simple :
\exemple!\begin{spreadtab}{{tabular}{|c|c||c|}}\hline
	val 1 : :={50} &amp; val 2 : :={29} &amp; moy : \textbf{:={(a1+b1)/2}}\\\hline
\end{spreadtab}!

Noter Ã©galement que Â«\verb-:={}-Â», qui dÃ©finit formule vide, a le mÃªme effet que Â«\verb-@-Â» dans une cellule : celle-ci est comprise comme cellule de texte. Cependant, Â«\verb-@-Â» 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-@-Â».

\subsection{Copier des formules}
Pour Ã©viter d'avoir Ã&nbsp; recopier des formules identiques dans des cellules voisines, \ST fournit l'instruction \verb-\STcopy-.

Cette commande se place dans une cellule selon la syntaxe \verb|\STcopy{&gt;|\Verb|&lt;x&gt;,v&lt;y&gt;}{&lt;formule&gt;}| oÃ¹ \Verb|&lt;x&gt;| et \Verb|&lt;y&gt;| sont des nombres positifs qui reprÃ©sentent des dÃ©calages horizontaux et verticaux par rapport Ã&nbsp; 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-&lt;formule&gt;-\footnote{La copie ne peut donc se faire que vers des cellules se trouvant Ã&nbsp; droite et plus bas que la cellule dans laquelle se trouve la commande.}. La commande \verb-\STcopy -\emph{ne doit pas} se trouver dans une cellule oÃ¹ un marqueur de champ numÃ©rique Â«\verb-:=-Â» est prÃ©sent.

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. 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 Â«\verb-!-Â» une coordonnÃ©e d'une rÃ©fÃ©rence, cette coordonnÃ©e reste inchangÃ©e lors de la copie. Le caractÃ¨re Â«\verb-!-Â» peut Ãªtre changÃ© avec \STkv{freeze char}{caractÃ¨re}\label{freeze char}. Il faut noter que le \STval{caractÃ¨re} est dÃ©tokÃ©nisÃ©.

Dans la syntaxe \verb|\STcopy{&gt;|\Verb|&lt;x&gt;,v&lt;y&gt;}{&lt;formule&gt;}|, si le nombre \Verb|&lt;x&gt;| est absent, la copie dans le sens horizontal se fait vers la droite jusqu'au bord droit du tableau. Si \Verb|&lt;y&gt;| est absent, la copie dans le sens vertical se fait jusqu'en bas du tableau.

On peut ainsi gÃ©nÃ©rer la table de multiplication de 1 Ã&nbsp; 10 :
\exemple*?\begin{spreadtab}{{tabular}{|c|*{10}{c}|}}
	\hline
	@$\times$        &amp; 1                     &amp; \STcopy{&gt;}{b1+1}  &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; \\\hline
	1                &amp; \STcopy{&gt;,v}{!a2*b!1} &amp;                   &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; \\
	\STcopy{v}{a2+1} &amp;                       &amp;                   &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; \\
	                 &amp;                       &amp;                   &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; \\
	                 &amp;                       &amp;                   &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; \\
	                 &amp;                       &amp;                   &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; \\
	                 &amp;                       &amp;                   &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; \\
	                 &amp;                       &amp;                   &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; \\
	                 &amp;                       &amp;                   &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; \\
	                 &amp;                       &amp;                   &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; \\
	                 &amp;                       &amp;                   &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; \\\hline
\end{spreadtab}?

Lors d'une copie de formule, si la cellule cible contient dÃ©jÃ&nbsp; un champ numÃ©rique non vide, celui-ci n'est pas Ã©crasÃ© et la copie ne se fait pas.

\subsection{Macros mises Ã&nbsp; disposition par \ST}
\subsubsection{Macro \texttt{\textbackslash STset}}
La macro \verb|\STset| admet dans son argument obligatoire une sÃ©rie de \STkv{clÃ©s}{valeurs} pour spÃ©cifier des rÃ©glages opÃ©rant pour le reste du document.

La liste des \STkey{clÃ©s} et des \STval{valeurs} associÃ©es est disponible Ã&nbsp; la page~\pageref{key/val}

\subsubsection{Les macros \texttt{\textbackslash STxp} et \texttt{\textbackslash STrep}}
La prÃ©sence\footnote{\ST teste sa \emph{prÃ©sence} et agit ensuite sur son argument : \texttt{\textbackslash STxp} tient lieu de marqueur et n'est pas exÃ©cutÃ©e lors de la lecture du tableau.} de \verb|\STxp{&lt;argument&gt;}| dans le corps du tableau a pour effet de dÃ©velopper au maximum l'\Verb|&lt;argument&gt;|. Si une ou plusieurs parties de l'\Verb|&lt;argument&gt;| ne sont pas dÃ©veloppables (macros non robustes notamment), il appartient Ã&nbsp; l'utilisateur de bloquer le dÃ©veloppement maximal avec, par exemple, les primitives \verb|\noexpand| ou \verb|\unexpanded|. La macro \verb|\STxp| ne doit pas se trouver dans des accolades : elle y serait ignorÃ©e  et exÃ©cutÃ©e bien plus tard en provoquant une erreur de compilation.
\bigbreak

La macro dÃ©veloppable \verb|\STrep|\label{STrep} rÃ©plique \Verb|&lt;n&gt;| fois un \Verb|&lt;code&gt;| arbitraire :
\centerverb!\STrep{&lt;n&gt;}{&lt;code&gt;}!

UtilisÃ©e dans l'argument de \verb|\STxp|, elle permet de gÃ©nÃ©rer des cellules vide ou des lignes identiques de faÃ§on concise.
\exemple*/\begin{spreadtab}{{tabular}{|c|*{10}{c}|}}
	\hline
	@$\times$        &amp; 1                     &amp; \STcopy{&gt;}{b1+1}  \STxp{\STrep8&amp;}\\\hline
	1                &amp; \STcopy{&gt;,v}{!a2*b!1} \STxp{\STrep9&amp;}\\
	\STcopy{v}{a2+1} \STxp{\STrep9{\STrep{10}&amp;\\}}
	\hline
\end{spreadtab}/

Si une ou plusieurs parties du \Verb|&lt;code&gt;| ne sont pas dÃ©veloppables (macros non robustes notamment), il appartient Ã&nbsp; l'utilisateur de bloquer le dÃ©veloppement maximal initiÃ© par \verb|\STxp| avec, par exemple, les primitives \verb|\noexpand| ou \verb|\unexpanded|.

\section{Mise en forme du tableau}
\subsection{Codes exÃ©cutÃ©s avant ou aprÃ¨s le tableau}
Les clÃ©s \STkv{pretab code}{code}\label{pretab code} et \STkv{posttab code}{code}\label{posttab code} dÃ©finissent des codes arbitraires exÃ©cutÃ©s juste avant et juste aprÃ¨s l'affichage du tableau.
\exemple!Une addition
\begin{spreadtab}[pretab code=\begingroup\color{red},
                  posttab code=\endgroup]{{tabular}[t]{r}}
	149\\
	287\\\hline
	a1+a2
\end{spreadtab} posÃ©e.!

\subsection{SÃ©parateur dÃ©cimal}
Comme \xfp donne 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 en tenaient compte.

La clÃ© \STkv{dec sep}{char} permet de changer le sÃ©parateur dÃ©cimal la virgule, mais ce choix n'est pas neutre dans le mode math. En effet, elle est considÃ©rÃ©e comme une ponctuation ce qui explique qu'elle est suivie d'une espace.

Pour Ã©viter cette faute typographique, on peut
\begin{itemize}
	\item dÃ©finir le sÃ©parateur dÃ©cimal entre accolades avec \verb|dec sep={{,}}|\label{dec sep}
	\item exÃ©cuter le code \verb|\mathcode`\,="013B\relax| avant d'afficher le tableau
\end{itemize}
Le plus Ã©lÃ©gant Ã©tant d'utiliser un package configurable et spÃ©cialisÃ© dans l'affichage des nombres comme \href{http://mirrors.ctan.org/macros/latex/contrib/siunitx/siunitx.pdf}{\texttt{siunitx}}.

\exemple[70]!\begin{spreadtab}[dec sep={,}]{{tabular}{|*3{&gt;{$}r&lt;{$}}|}}\hline
	@x   &amp; @y  &amp; @\text{Moyenne}\\\hline
	5    &amp; -4  &amp; (a2+b2)/2\\
	-6.1 &amp; -8  &amp; (a3+b3)/2\\
	9.85 &amp; 3.7 &amp; (a4+b4)/2\\\hline
\end{spreadtab}\par\smallskip
\begin{spreadtab}[dec sep={{,}}]{{tabular}{|*3{&gt;{$}r&lt;{$}}|}}\hline
	@x   &amp; @y  &amp; @\text{Moyenne}\\\hline
	5    &amp; -4  &amp; (a2+b2)/2\\
	-6.1 &amp; -8  &amp; (a3+b3)/2\\
	9.85 &amp; 3.7 &amp; (a4+b4)/2\\\hline
\end{spreadtab}\par\smallskip
\begin{spreadtab}[dec sep     ={,},
                  pretab code ={\begingroup\mathcode`\,="013B\relax},
                  posttab code={\endgroup}]{{tabular}{|*3{&gt;{$}r&lt;{$}}|}}\hline
	@x   &amp; @y  &amp; @\text{Moyenne}\\\hline
	5    &amp; -4  &amp; (a2+b2)/2\\
	-6.1 &amp; -8  &amp; (a3+b3)/2\\
	9.85 &amp; 3.7 &amp; (a4+b4)/2\\\hline
\end{spreadtab}!

\subsection{Arrondi automatique}
Le moteur \xfp donne jusqu'Ã&nbsp; 16 dÃ©cimales significatives. Si l'on ne souhaite pas autant de prÃ©cision, on peut arrondir automatiquement le rÃ©sultat de chaque calcul avec la clÃ© \STkey{autoround}\label{autoround}. Agir sur cette clÃ© implique donc une \emph{limitation dÃ©libÃ©rÃ©e} de la prÃ©cision des calculs internes.
\exemple*!\begin{spreadtab}{{tabular}{*4c}}       \hline
	@$x$           &amp; 3               &amp; 17 &amp; 751 \\\hline
	@$1/x$         &amp; \STcopy&gt;{1/b1}  &amp;    &amp;     \\\hline
	@$x\cdot(1/x)$ &amp; \STcopy&gt;{b2*b1} &amp;    &amp;     \\\hline
\end{spreadtab}
\bigbreak
\begin{spreadtab}[autoround=6]{{tabular}{*4c}}    \hline
	@$x$           &amp; 3               &amp; 17 &amp; 751 \\\hline
	@$1/x$         &amp; \STcopy&gt;{1/b1}  &amp;    &amp;     \\\hline
	@$x\cdot(1/x)$ &amp; \STcopy&gt;{b2*b1} &amp;    &amp;     \\\hline
\end{spreadtab}!

Pour revenir au comportement par dÃ©faut et ne faire aucun arrondi, il faut rendre la valeur vide :
\centerverb|autoround={}|

\subsection{Macro \texttt{\textbackslash STprintnum}}
Chaque nombre traitÃ© par \ST est donnÃ© Ã&nbsp; la macro \verb|\STprintnum| dans le tableau final. Par dÃ©faut, cette macro ne procÃ¨de Ã&nbsp; aucune modification de son argument et sa dÃ©finition est la suivante :
\centerverb|\def\STprintnum#1{#1}|

L'utilisateur peut, s'il le souhaite, la modifier selon sa convenance comme ci-dessous avec l'aide du package \href{http://mirrors.ctan.org/macros/latex/contrib/siunitx/siunitx.pdf}{\texttt{siunitx}} et sa macro \verb|\num| :
\exemple[60]!\def\STprintnum#1{\num[round-mode = places,
                       round-precision = 6,
                       drop-zero-decimal=true,
                       output-decimal-marker = {,}]{#1}%
}
\begin{spreadtab}{{tabular}{*4c}}                 \hline
	@$x$           &amp; 3               &amp; 17 &amp; 751 \\\hline
	@$1/x$         &amp; \STcopy&gt;{1/b1}  &amp;    &amp;     \\\hline
	@$x\cdot(1/x)$ &amp; \STcopy&gt;{b1*b2} &amp;    &amp;     \\\hline
\end{spreadtab}!
Aucune modification de la prÃ©cision des calculs internes n'est faite dans ce cas.

\subsection{Masquer une ligne ou une colonne}
Parfois, une colonne ou une ligne entiÃ¨re est destinÃ©e Ã&nbsp; recevoir des calculs intermÃ©diaires qui n'ont pas Ã&nbsp; Ãªtre affichÃ©s dans le tableau final. Pour cela \ST dispose de deux sÃ©quences de contrÃ´le \verb=\SThiderow= et \verb=\SThidecol= qui, lorsqu'elles sont placÃ©es dans une cellule, masquent la ligne ou la colonne dans laquelle se trouve cette cellule.
\exemple*!\begin{spreadtab}{{tabular}{|r|ccc|}}                                   \hline
	@ valeurs de $x$       &amp; -1         &amp; 0\SThidecol &amp; 2          &amp; 3          \\\hline
	@$f(x)=2x-1$           &amp; 2*[0,-1]-1 &amp; 2*[0,-1]-1  &amp; 2*[0,-1]-1 &amp; 2*[0,-1]-1 \\
	@$g(x)=x-10$\SThiderow &amp; [0,-2]-10  &amp; [0,-2]-10   &amp; [0,-2]-10  &amp; [0,-2]-10  \\
	@$h(x)=1-x$            &amp; 1-[0,-3]   &amp; 1-[0,-3]    &amp; 1-[0,-3]   &amp; 1-[0,-3]   \\\hline
\end{spreadtab}!

On peut observer comment on masque la ligne contenant $g(x)$ et la colonne correspondant Ã&nbsp; 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.

\subsection{Exporter la valeur d'une cellule}
On peut Ãªtre amenÃ© sauvegarder la valeur numÃ©rique d'une cellule dans une macro (l'assignation est globale) pour l'afficher dans un champ textuel\footnote{Il est plus facile d'utiliser \texttt{&lt;\kern0pt&lt;} et \texttt{&gt;\kern0pt&gt;}, voir section suivante.} ou mÃªme Ã&nbsp; l'extÃ©rieur du tableau. On doit alors utiliser la clÃ© \STkey{save list}\label{save list} :
\centerverb|save list={&lt;macroA&gt; = &lt;refA&gt;, &lt;macroB&gt; = &lt;refB&gt;,...}|

oÃ¹ chaque rÃ©fÃ©rence doit Ãªtre absolue.
\exemple!\STset{ save list = { \resultC = c1 , \resultB = b1 }}
\begin{spreadtab}{{tabular}{|c|c|c|c|c|}}\hline
	10 &amp; a1+10 &amp; b1+10 &amp; a1+b1+c1 &amp; @cell c1 : \resultC\\\hline
\end{spreadtab}
\par\medskip
Voici la cellule c1 : \resultC\ et b1 : \resultB!

Lorsque la clÃ© \STkey{aux save list}\label{aux save list} est utilisÃ©e avec la mÃªme syntaxe, tout se passe comme prÃ©cÃ©demment mais l'assignation est aussi Ã©crite dans le fichier auxiliaire. Ainsi, la valeur d'une cellule peut se transmettre entre compilations et on peut donc faire rÃ©fÃ©rence Ã&nbsp; cette valeur avant que le tableau ne soit rencontrÃ©.
\exemple!La valeur de d1 est \cellD.\par
\STset{ aux save list = { \cellD = d1 }}
\begin{spreadtab}{{tabular}{|c|c|c|c|}}\hline
	1 &amp; a1+10 &amp; b1+10 &amp; a1+b1+c1\\\hline
\end{spreadtab}!

Dans les deux cas, la valeur des clÃ©s \STkey{save cell} et \STkey{aux save cell} est vidÃ©e aprÃ¨s l'affichage du tableau qui suit \verb|\STset|.

Il est Ã©galement possible, avec la macro-fonction \STmacro{tag}, d'exporter une valeur dans le fichier auxiliaire, voir page~\pageref{tag}.

\subsection{Afficher la valeur d'une cellule}
Pour afficher simplement la valeur du champ numÃ©rique d'une cellule dans un champ textuel, on peut utiliser la syntaxe \verb-&lt;&lt;-\Verb-&lt;rÃ©fÃ©rence&gt;-\verb-&gt;&gt;- qui sera remplacÃ© par la valeur numÃ©rique de la cellule \Verb-&lt;rÃ©fÃ©rence&gt;- oÃ¹ la \Verb-&lt;rÃ©fÃ©rence&gt;- peut Ãªtre relative ou absolue. Si ce qui est entre \verb-&lt;&lt;- et \verb-&gt;&gt;- n'est pas une rÃ©fÃ©rence, alors rien n'est fait. La \Verb-&lt;rÃ©fÃ©rence&gt;- ne doit contenir aucun espace. Si on Ã©crit \verb-&lt;&lt; a1&gt;&gt;- alors, l'espace fait que la rÃ©fÃ©rence n'est pas reconnue.
\exemple!\begin{spreadtab}{{tabular}{|c|c||c|}}\hline
	23 &amp; 32 &amp; Moy $= \frac{&lt;&lt;a1&gt;&gt;+&lt;&lt;b1&gt;&gt;}{2} = :={(a1+b1)/2}$\\\hline
\end{spreadtab}!

Les caractÃ¨res qui dÃ©limitent la rÃ©fÃ©rence valent \verb-&lt;&lt;- et \verb-&gt;&gt;- par dÃ©faut. Ils peuvent Ãªtre modifiÃ©s avec la clÃ© \STkey{display marks}\label{display marks}. En Ã©crivant \verb-display marks={|;|}-, on devra Ã©crire \Verb-|&lt;rÃ©fÃ©rence&gt;|- :
\exemple!\begin{spreadtab}[display marks={|;|}]{{tabular}{|c|c||c|}}\hline
	23 &amp; 32 &amp; Moy $= \frac{|a1|+|b1|}{2} = :={(a1+b1)/2}$\\\hline
\end{spreadtab}!

\subsection{Utiliser \ttfamily\textbackslash multicolumn}
Le package \ST est compatible avec la syntaxe \Verb=\multicolumn{&lt;nombre&gt;}{&lt;type&gt;}{&lt;contenu&gt;}= qui fusionne \Verb-&lt;nombre&gt;- cellules en une cellule de type et de contenu spÃ©cifiÃ©s dans les arguments.

En utilisant \verb=\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 :
\begin{center}
\ttfamily
\begin{tabular}{|*7{c|}}\hline
a1&amp;b1&amp;c1&amp;d1&amp;e1&amp;f1&amp;g1\\\hline
a2&amp;\multicolumn{2}{l|}{b2}&amp;d2&amp;e2&amp;f2&amp;g2\\\hline
\multicolumn{3}{|l|}{a3}&amp;d3&amp;\multicolumn{2}{l|}{e3}&amp;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 Ã&nbsp; 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 :
\exemple*/\newcolumntype{K}[1]{@{}&gt;{\centering\arraybackslash}p{#1cm}@{}}
\begin{spreadtab}{{tabular}{*6{K{0.5}}}}
	\cline{2-5}
	&amp;\multicolumn{2}{|K{1}|}{:={a2*c2}} &amp; \multicolumn{2}{K{1}|}{:={c2*e2}} &amp;\\\hline
	\multicolumn{2}{|K{1}}{:=8}&amp;\multicolumn{2}{|K{1}}{:=7}&amp;\multicolumn{2}{|K{1}|}{:=6}\\\hline
\end{spreadtab}/
On remarque que le marqueur de champ numÃ©rique Â«\falseverb{:=}Â» est nÃ©cessaire dans chaque cellule oÃ¹ se trouve la commande \verb-\multicolumn-. On comprend en effet que si ce marqueur n'existait pas, la totalitÃ© de la cellule, c'est-Ã&nbsp;-dire \Verb-\multicolumn{2}{|c|}{&lt;formule&gt;}- serait considÃ©rÃ©e comme Ã©tant une formule.

\section{Macro-fonctions}
\subsection{Macro-fonctions mathÃ©matiques}
\subsubsection{Sommer des cellules}
La fonction \STmacro{sum} permet de faire la somme d'une ou plusieurs plages de cellules.

sa syntaxe est \Verb=sum(&lt;plage 1&gt;;&lt;plage 2&gt;;...;&lt;plage n&gt;)=, oÃ¹ une plage de cellules est :
\begin{itemize}
	\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=&lt;cellule 1&gt;:&lt;cellule 2&gt;=.
\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 \verb-\multicolumn-.

Les rÃ©fÃ©rences relatives et absolues peuvent Ãªtre utilisÃ©es conjointement, comme il semble bon Ã&nbsp; l'utilisateur. Voici un exemple oÃ¹ l'on fait la somme des coefficients du triangle de Pascal :
\exemple/\begin{spreadtab}{{tabular}{*5c}}
	\multicolumn{5}{c}{somme=:={sum(a2:e6)}}\\
	[0,1] &amp; [-1,1]+[0,1] &amp; [-1,1]+[0,1] &amp; [-1,1]+[0,1] &amp; [-1,1]\\
	[0,1] &amp; [-1,1]+[0,1] &amp; [-1,1]+[0,1] &amp; [-1,1]       &amp;       \\
	[0,1] &amp; [-1,1]+[0,1] &amp; [-1,1]       &amp;              &amp;       \\
	[0,1] &amp; [-1,1]       &amp;              &amp;              &amp;       \\
	1     &amp;              &amp;              &amp;              &amp;
\end{spreadtab}/

\subsubsection{Macro-fonction \ttfamily sumprod}
La fonction \STmacro{sumprod} permet de multiplier les Ã©lÃ©ments correspondants de 2 plages ou plus et ensuite, additionner ces produits.

Sa syntaxe est: \Verb|sumprod(&lt;plage 1&gt;;&lt;plage 2&gt;;...;&lt;plage n&gt;)|. 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 Ã&nbsp; 15 ans :
\exemple*!\begin{spreadtab}{{tabular}{r*6c}}
	@Ã‚ges   &amp; 10 &amp; 11 &amp; 12 &amp; 13 &amp; 14 &amp; 15\\
	@Nombre &amp; 5  &amp; 8  &amp; 20 &amp; 55 &amp; 9  &amp; 3 \\\hline
	\multicolumn{7}{c}{Moyenne = :={sumprod(b1:g1;b2:g2)/sum(b2:g2)}}
\end{spreadtab}!
De la mÃªme faÃ§on que pour la macro-fonction \verb-sum-, les cellules de texte, vides ou fusionnÃ©es par un \verb-\multicolumn- sont considÃ©rÃ©es comme contenant le nombre 0.

\subsubsection{PGCD et PPCM}
Les macros fonctions \STmacro{gcd} et \STmacro{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 :
\centerverb|gcd(&lt;nombre1&gt;,&lt;nombre2&gt;,...,&lt;nombreN&gt;)
lcm(&lt;nombre1&gt;,&lt;nombre2&gt;,...,&lt;nombreN&gt;)|

\exemple*!\begin{spreadtab}{{tabular}{|r|r|r||c|c|}}\hline
	\multicolumn3{|c||}{@Nombres}&amp; @PGCD &amp; @PPCM \\\hline
	24 &amp; 18 &amp; 12 &amp; \STcopy{v}{gcd(a2,b2,c2)} &amp; \STcopy{v}{lcm(a2,b2,c2)}\\
	15 &amp; 10 &amp; 25 &amp; &amp; \\
	16 &amp; 12 &amp; 15 &amp; &amp; \\\hline
\end{spreadtab}!

\subsubsection{Ã‰criture scientifique}
La macro fonction \STmacro{scitodec} permet de convertir un nombre Ã©crit en Ã©criture scientifique en nombre dÃ©cimal. La syntaxe est \Verb-scitodec(&lt;texte&gt;)-, oÃ¹ le \Verb-&lt;texte&gt;- est :
\begin{enumerate}
	\item une suite de caractÃ¨res se prÃ©sentant sous la syntaxe \Verb-&lt;mantisse&gt;EE&lt;exposant&gt;-, oÃ¹ la \Verb-&lt;mantisse&gt;- est un nombre dÃ©cimal et l'\Verb-&lt;exposant&gt;- est un entier relatif. Les Â«EÂ» peuvent Ãªtre majuscule ou minuscule;
	\item une rÃ©fÃ©rence au champ \emph{textuel} d'une cellule qui doit contenir des caractÃ¨res obÃ©issants Ã&nbsp; la syntaxe vue au point prÃ©cÃ©dent.
\end{enumerate}

\exemple[60]!\begin{spreadtab}{{tabular}{|r|r|}}\hline
	@Ã‰critures scientifiques &amp; @Ã‰critures dÃ©cimales \\\hline
	@4EE2                    &amp; \STcopy{v}{scitodec([-1,0])}\\
	@-3.1EE-3                &amp; \\
	@15ee5                   &amp; \\
	@-0.025ee7               &amp; \\
	@2.125EE0                &amp; \\
	@3.1575EE-4              &amp; \\\hline
\end{spreadtab}!

Le moteur \xfp est comprend nativement les nombres Ã©crits en notation scientifique sous la forme \Verb|&lt;a&gt;e&lt;b&gt;| mais l'utilisation de cette syntaxe est \emph{impossible} Ã&nbsp; 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 \STmacro{id} puisque \Verb=id(&lt;nombre&gt;)= renvoie le \Verb-&lt;nombre&gt;- qui se trouve entre parenthÃ¨ses. MathÃ©matiquement, elle ne sert pas Ã&nbsp; grand chose, mais avec \ST, elle permet de passer des expressions mathÃ©matiques Ã&nbsp; des macros qui n'en admettent pas. On peut ainsi s'en servir dans les plages de cellules de \STmacro{sum} par exemple.

Dans le code ci dessous, la macro \STmacro{id} est utilisÃ©e pour dÃ©terminer la plage de cellules Ã&nbsp; additionner avec \STmacro{sum}. Dans cet exemple, la valeur du champ numÃ©rique de la cellule \falseverb{a2} vaut 8. Et donc, \verb=sum([0,-1]:[id(a2-1),-1])/a2= est Ã©quivalent Ã&nbsp; \verb=sum([0,-1]:[7,-1])/8= :
\exemple*!\begin{spreadtab}{{tabular}{r*{10}c}}
	@Entiers de 1 Ã&nbsp; 10                 &amp; 1 &amp; 2 &amp; 3 &amp; 4 &amp; 5 &amp; 6 &amp; 7 &amp; 8 &amp; 9 &amp; 10\\
	Moyenne des :={8} premiers entiers &amp; sum([0,-1]:[id(a2-1),-1])/a2          \\
\end{spreadtab}!

\subsection{Macro-fonctions de test}
Il n'y a plus de macro-fonctions de comparaison qui renvoient un nombre puisque le moteur \xfp dispose d'un opÃ©rateur ternaire \Verb|&lt;a&gt;?&lt;b&gt;:&lt;c&gt;|. Si le test \Verb|&lt;a&gt;| est vrai, le nombre \Verb|&lt;b&gt;| est renvoyÃ© sinon, c'est le nombre \Verb|&lt;c&gt;|.

\ST offre en revanche la macro fonction \STmacro{test}\label{test} qui a une syntaxe particuliÃ¨re ayant 2 arguments :
\centerverb|test(csv de &lt;tests&gt;)&lt;espaces optionnels&gt;(csv de &lt;textes&gt;)|

Les \Verb|&lt;tests&gt;| sont effectuÃ©s de gauche Ã&nbsp; droite et au premier qui est \verb|vrai|, le \Verb|&lt;texte&gt;| correspondant est renvoyÃ©. S'il y a $n$ \Verb|&lt;test&gt;|, le \Verb|&lt;texte&gt;| d'index $n+1$ sera renvoyÃ© si tous les tests sont faux.

Si le nombre de \Verb|&lt;textes&gt;| est insuffisant par rapport au nombre de \Verb|&lt;tests&gt;|, les \Verb|&lt;textes&gt;| manquants sont considÃ©rÃ©s vides.

\exemple!\begin{spreadtab}{{tabular}{c|c}}
	\hline
	@Mois &amp; @Saison \\\hline
	1     &amp; \STcopy v{test("a2=1||a2&gt;10 , a2&lt;5 , a2&lt;8")
	                      (Hiver,Printemps,Ã‰tÃ©,Automne)} \\
	\STcopy v{a2+1} \STxp{\STrep{11}{&amp; \\}}% 11 lignes vides
	\hline
\end{spreadtab}!

La partie de la formule Ã&nbsp; copier se trouvant entre les caractÃ¨res Â«\verb|"|Â» indique quelle partie doit Ãªtre prise en compte pour le dÃ©calage lors de la copie. Il est modifiable avec la clÃ© \STkey{copy char}\label{copy char}.

Si l'on souhaite utiliser le connecteur logique \verb|&amp;&amp;|, il est \emph{nÃ©cessaire} de le mettre entre accolades. Ainsi, la cellule Ã&nbsp; copier aurait pu contenir les tests Ã©quivalents suivants\chevronsfalse
\centerverb|\STcopy v{test("a2&gt;2{&amp;&amp;}a2&lt;6,a2&gt;5{&amp;&amp;}a2&lt;9,a2&gt;8{&amp;&amp;}a2&lt;12")
              (Printemps,Ã‰tÃ©,Automne,Hiver)}|
\chevronstrue

\subsection{Macro-fonctions de date}
\subsubsection{Convertir une date en nombre avec \ttfamily frshortdatetonum}\label{datetonum}
La macro \STmacro{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 Ã&nbsp; une cellule, cette cellule \emph{doit} Ãªtre une cellule textuelle, c'est Ã&nbsp; dire contenant Â«\verb-@-Â» ou Â«\verb-:={}-Â»
\exemple!\begin{spreadtab}{{tabular}{cc}}
	@14/7/1789              &amp; frshortdatetonum(a1)\\
	1/1/2001 :={}           &amp; frshortdatetonum(a2)\\
\end{spreadtab}!

Une autre macro-fonction existe, elle transforme une date longue du type Â«25 dÃ©cembre 2024Â» en un nombre.
\exemple!\begin{spreadtab}{{tabular}{cc}}
	@1 janvier 2001   &amp; frlongdatetonum(a1)\\
	@25 dÃ©cembre 2024 &amp; frlongdatetonum(a2)
\end{spreadtab}!

\subsubsection{Passer d'un nombre Ã&nbsp; 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, immÃ©diatement aprÃ¨s l'Ã©valuation d'une macro-fonction nombre vers texte, tout autre Ã©valuation dans la cellule est stoppÃ©e et \emph{la cellule devient une cellule textuelle}. Si un texte cohabitait avec la formule dans cette cellule, le rÃ©sultat de la formule sera insÃ©rÃ© Ã&nbsp; la place de \Verb-:={&lt;formule&gt;}-. La cellule Ã©tant composÃ©e de texte seulement, ell ne peut plus faire l'objet d'aucun traitement mathÃ©matique ensuite.

Voici ces fonctions :
\begin{itemize}
	\item \STmacro{numtofrshortdate} transforme un nombre en une date courte du type 14/7/1789;
	\item \STmacro{numtofrlongdate} transforme un nombre en une date longue du type Â«14 juillet 1789Â»;
	\item \STmacro{numtofrmonth} extrait d'un nombre reprÃ©sentant une date le nom du mois correspondant;
	\item \STmacro{numtofrday} extrait d'un nombre reprÃ©sentant une date le nom du jour correspondant.
\end{itemize}
Voici un  exemple oÃ¹ l'on se place 30 jours avant puis 30 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.
\exemple!\begin{spreadtab}{{tabular}{cc}} \hline
	\multicolumn{2}{|c|}{@1/6/2009} \\\hline\hline
	-30 &amp; numtofrshortdate(frshortdatetonum(a1)+[-1,0])\\
	-30 &amp; numtofrlongdate(frshortdatetonum(a1)+[-1,0]) \\
	-30 &amp; numtofrmonth(frshortdatetonum(a1)+[-1,0])    \\
	-30 &amp; numtofrday(frshortdatetonum(a1)+[-1,0])      \\\hline
	30  &amp; numtofrshortdate(frshortdatetonum(a1)+[-1,0])\\
	30  &amp; numtofrlongdate(frshortdatetonum(a1)+[-1,0]) \\
	30  &amp; numtofrmonth(frshortdatetonum(a1)+[-1,0])    \\
	30  &amp; numtofrday(frshortdatetonum(a1)+[-1,0])
\end{spreadtab}!

\subsection{Macro fonctions de coordonnÃ©es}\label{tag}
\subsubsection{\falseverb{tag}, \falseverb{cell}, \falseverb{value} et \texttt{\textbackslash STtag}}
PlutÃ´t que de faire rÃ©fÃ©rence Ã&nbsp; une cellule par ses coordonnÃ©es qui sont difficiles Ã&nbsp; mÃ©moriser et qui changent si on insÃ¨re une ligne ou une colonne, il est parfois bien plus pratique de donner un nom Ã&nbsp; une cellule et d'y faire rÃ©fÃ©rence plus loin par ce nom.

La macro fonction \STmacro{tag} a pour syntaxe \Verb-tag(&lt;nom&gt;)-. Cela a pour effet de nommer la cellule dans laquelle elle se trouve. Il ne s'agit pas vraiment d'une macro fonction comme les autres puisque ce qu'elle retourne rien lorsqu'elle est mise dans une formule : elle disparait sans provoquer aucun effet sur le rÃ©sultat mathÃ©matique. On peut donc Ã©crire \Verb-tag(&lt;nom&gt;)- \emph{n'importe oÃ¹} dans le champ numÃ©rique d'une cellule. Le  \Verb-&lt;nom&gt;- peut Ãªtre n'importe quelle suite de caractÃ¨res alphanumÃ©riques, mais il est dÃ©conseillÃ© de mettre une lettre et un nombre, qui pourraient Ãªtre compris comme une rÃ©fÃ©rence Ã&nbsp; une cellule, et serait donc modifiÃ© lors d'une opÃ©ration de copie avec \verb-\STcopy-. Cette macro fonction a une action supplÃ©mentaire, elle sauvegarde globalement via un \verb-\gdef- la valeur numÃ©rique de la cellule dans laquelle elle se trouve de faÃ§on Ã&nbsp; pouvoir y faire appel plus tard \emph{en dehors du tableau} via la commande purement dÃ©veloppable \Verb-\STtag{&lt;nom&gt;}-.

Par la suite dans le tableau, au lieu de mettre les coordonnÃ©es de la cellule \Verb-&lt;nom&gt;-, on peut Ã©crire \Verb-cell(&lt;nom&gt;)- qui est une macro fonction qui renvoie les coordonnÃ©es de la cellule prÃ©cÃ©demment nommÃ©e. Par exemple si \Verb-tag(&lt;nom&gt;)- a Ã©tÃ© Ã©crit dans la cellule \verb-B3- si on a Ã©crit plus loin \Verb|cell(&lt;nom&gt;)|, cette macro fonction renvoit \verb-B3-.

Voici un exemple oÃ¹ l'on fait la somme de cellules et l'on donne le nom \verb-foo- au premier nombre et le nom \verb-bar- au dernier. On peut observer que \verb-tag(bar)- se trouve entre 1 et 9 et qu'au final, puisque cette macro fonction disparait, le champ numÃ©rique de la cellule contiendra 19 :
\exemple!\begin{spreadtab}{{tabular}{r@{}r}}
	   &amp; 15tag(foo)              \\
	@+ &amp; 37                      \\
	@+ &amp; 13                      \\
	@+ &amp; 48                      \\
	@+ &amp; 1tag(bar)9              \\\cline{2-2}
	   &amp; sum(cell(foo):cell(bar))tag(baz)
\end{spreadtab}

foo=\STtag{foo}, bar=\STtag{bar}, baz=\STtag{baz}!

Pour transmettre des valeurs entre tableaux calculÃ©s par \ST, il est possible de taguer la cellule dans le premier tableau Ã&nbsp; l'aide de la macro fonction \Verb|tag(&lt;nom&gt;)|, puis dans le 2\ieme{} tableau, de faire appel Ã&nbsp; la valeur \emph{via} tagguÃ©e par \Verb|value(&lt;nom&gt;)|
\exemple!\begin{spreadtab}{{tabular}{|c|c|c|}}\hline
	100 &amp; 75 &amp; a1+b1tag(ab:sum)\\\hline
\end{spreadtab}

\begin{spreadtab}{{tabular}{|c|c|}}\hline
	value(ab:sum) &amp; 1.20*value(ab:sum)\\\hline
\end{spreadtab}!

Si la clÃ© \STkey{tag to aux}\label{tag to aux} est \STval{true}, les assignations sont Ã©galement Ã©crites dans le fichier auxiliaire, ce qui les rend transmissibles d'une compilation Ã&nbsp; l'autre. Il devient alors possible de placer \Verb|\STtag{&lt;nom&gt;}| avant le tableau oÃ¹ \Verb|tag(&lt;nom&gt;)| est spÃ©cifiÃ©.

\subsubsection{\falseverb{row} et \falseverb{col}}
\ST fournit Ã©galement les macros fonctions \Verb-row(&lt;tagname&gt;)- et \Verb-col(&lt;tagname&gt;)- qui renvoient le numÃ©ro de la ligne ou de la colonne oÃ¹ se trouvait \Verb-tag(&lt;tagname&gt;)-. Voici par exemple une faÃ§on de dÃ©nombrer des valeurs pour en calculer la moyenne : on nomme \falseverb{first} la premiÃ¨re valeur et \falseverb{last} la derniÃ¨re, et le nombre de valeurs est donc \verb|row(last)-row(first)+1| :
\exemple!moyenne =
\begin{spreadtab}{{tabular}[b]{r}}
	7tag(first)\\9\\15\\6\\20\\13\\11\\55tag(last)\\
	\hline\hline
	sum(cell(first):cell(last))/(row(last)-row(first)+1)
\end{spreadtab}!

\section{PrÃ©cautions particuliÃ¨res}
\subsection{RedÃ©finition des commandes de filets horizontaux}\label{filets horizontaux}
On peut Ãªtre tentÃ© de dÃ©finir une commande pour produire ---~par exemple~--- une double ligne horizontale :
\centerverb|\newcommand\dline{\hline\hline}|

puis essayer de l'utiliser dans un tableau pour produire ce simple exemple qui calcule Ã&nbsp; la seconde ligne les termes de la suite de Fibonacci :
\begin{center}
\newcommand\dline{\hline\hline}
\def\xtracol{&amp;&amp;&amp;&amp;&amp;&amp;}
\begin{spreadtab}{{tabular}{*9c}}
	0     &amp; 1 &amp; \STcopy&gt;{b1+1} \STxp\xtracol\\\dline
	:={1} &amp; 1 &amp; \STcopy&gt;{a2+b2}\STxp\xtracol
\end{spreadtab}
\end{center}
Mais en Ã©crivant ce code, il y a un problÃ¨me :
\chevronsfalse\centerverb!\newcommand\dline{\hline\hline}
\def\xtracol{&amp;&amp;&amp;&amp;&amp;&amp;}
\begin{spreadtab}{{tabular}{*9c}}
	0     &amp; 1 &amp; \STcopy&gt;{b1+1} \STxp\xtracol\\\dline
	1     &amp; 1 &amp; \STcopy&gt;{a2+b2}\STxp\xtracol
\end{spreadtab}!\chevronstrue

En effet la compilation Ã©choue et dans le log, on lit Â«\falseverb{! Improper alphabetic constant.}Â»

La raison est que le \verb-\dline- 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, la cellule \falseverb{b1} contient :
\centerverb!\dline 1!

Pour pouvoir compiler ce code sans erreur, la cellule \falseverb{b1} \emph{doit} contenir un marqueur de champ numÃ©rique :
\exemple!\newcommand\dline{\hline\hline}
\def\xtracol{&amp;&amp;&amp;&amp;&amp;&amp;}
\begin{spreadtab}{{tabular}{*9c}}
	0     &amp; 1 &amp; \STcopy&gt;{b1+1} \STxp\xtracol\\\dline
	:={1} &amp; 1 &amp; \STcopy&gt;{a2+b2}\STxp\xtracol
\end{spreadtab}!

\subsection{Cohabitation de {\ttfamily\textbackslash multicolumn} et  \ttfamily\textbackslash SThidecol}
Tout d'abord, dans une utilisation normale, l'utilisation conjointe de \verb|\multicolumn| et \verb-\SThiderow- ne doit pas arriver, et la plupart des utilisateurs ne devrait pas rencontrer cette situation ni lire ce chapitre.

Tout d'abord, une colonne masquÃ©e ne doit \emph{jamais} contenir une cellule oÃ¹ se trouve la commande \verb-\multicolumn- ! Mais que se passe t-il si une colonne masquÃ©e cache des cellules fusionnÃ©es par \verb-\multicolumn-?

DÃ©jÃ&nbsp;, 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 \verb-\multicolumn-\ldots

Prenons un exemple, et mettons que dans le tableau suivant, on fusionne les cellules \falseverb{b2} Ã&nbsp; \falseverb{h2} et que l'on souhaite cacher les colonnes \falseverb{c}, \falseverb{d} et \falseverb{f}, ici en gris :
\begin{center}
\ttfamily
\begin{tabular}{|c|c|c|c|c|c|c|c|c|c|}
\hline
 a1 &amp; b1 &amp; \cellcolor[gray]{0.6}c1 &amp; \cellcolor[gray]{0.6}d1 &amp; e1 &amp; \cellcolor[gray]{0.6}f1 &amp; g1 &amp; h1 &amp; i1 &amp; j1\\\hline
 a2 &amp; \multicolumn1c{b2} &amp; \multicolumn1{&gt;{\cellcolor[gray]{0.6}}c}{} &amp; \multicolumn1{&gt;{\cellcolor[gray]{0.6}}c}{} &amp; \multicolumn1c{} &amp; \multicolumn1{&gt;{\cellcolor[gray]{0.6}}c}{} &amp; \multicolumn1{c}{} &amp; \multicolumn1{c|}{} &amp; i2 &amp; j2\\\hline
\end{tabular}
\end{center}
Il y a 4 cellules \emph{visibles} fusionnÃ©es, on Ã©crira donc \verb-\multicolumn{4}- car on ne tient \emph{jamais} compte des colonnes masquÃ©es dans le dÃ©compte du nombre de cellules Ã&nbsp; fusionner.

Maintenant, on compte 4 lettres Ã&nbsp; partir de la lettre \falseverb{b} en l'incluant dans le dÃ©compte. On arrive Ã&nbsp; 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 Â«\verb-&amp;-Â» aprÃ¨s le \verb-\multicolumn- (pour l'exemple, il en faudrait 1).
	\item les rÃ©fÃ©rences des colonnes des cellules qui suivent le \verb-\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 Ã&nbsp; 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 Â«\textcolor{red}{\texttt{\&amp;}}Â» qui a Ã©tÃ© ajoutÃ© puisque $y=1$. Par ailleurs, on reste simple avec les formules, on ajoute 1 au nombre du dessus :
\exemple*!\begin{spreadtab}{{tabular}{|*{7}{c|}}}\hline
	1   &amp; 2    &amp; \SThidecol3 &amp; \SThidecol4 &amp; 5&amp; \SThidecol6 &amp; 7&amp; 8&amp; 9    &amp; 10  \\\hline
	a1+1&amp; \multicolumn4{l|}{:={b1+1}}&amp;                            &amp; i1+1 &amp; j1+1\\\hline
	a2+1&amp; b2+1 &amp;             &amp;             &amp;  &amp;             &amp;  &amp;  &amp; g2+1 &amp; h2+1\\\hline
\end{spreadtab}!

\subsection{Messages Ã©mis par \ST}
Le package Ã©met des messages d'erreur et arrÃªte la compilation dans ces cas :
\begin{itemize}
	\item en cas de rÃ©fÃ©rence circulaire. 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 Ã&nbsp; une cellule vide ou ne contenant que du texte;
	\item une cellule fait rÃ©fÃ©rence Ã&nbsp; une cellule non dÃ©finie (hors limite du tableau);
	\item une cellule fait rÃ©fÃ©rence Ã&nbsp; une cellule fusionnÃ©e par un \verb-\multicolumn-;
	\item une rÃ©fÃ©rence relative entre crochets ne respecte pas la syntaxe.
\end{itemize}

Le package Ã©met par dÃ©faut des messages d'information (dans le fichier de log), sur ce qu'il est en train de faire. La clÃ© \STkey{messages}\label{messages}, selon qu'elle vaut \falseverb{true} ou \falseverb{false} permet ou pas l'Ã©mission de messages d'information.

Pour comprendre la signification des messages, prenons un tableau simple :
\exemple!\begin{spreadtab}{{tabular}{|cccc|c|}}\hline
	b1+1 &amp; c1+1 &amp; d1+1 &amp; 10 &amp; a1+b1+c1+d1\\\hline
\end{spreadtab}!

Le fonctionnement du tableau est ici trÃ¨s simple Ã&nbsp; comprendre. Voici les informations dÃ©livrÃ©es par \ST :
\centerverb!New spreadtab: \begin{tabular}{|cccc|c|}
* reading tab: ok
* computing formulas:
     cell A1-B1-C1
     cell B1
     cell C1
     cell D1
     cell E1
* building tab: ok
End of spreadtab: \end{tabular}!

L'environnement spÃ©cifiÃ© par l'utilisateur est repris (ici \verb-{tabular}{|cccc|c|}-). PrÃ©cÃ©dÃ©es d'une Ã©toile, on retrouve les 3 Ã©tapes nÃ©cessaires Ã&nbsp; \ST pour mener Ã&nbsp; 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 Ã&nbsp; 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 la ligne se termine par \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 Ã&nbsp; 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Ã&nbsp; Ã©tÃ© et sont des nombres ou bien, elles ne font rÃ©fÃ©rences qu'Ã&nbsp; des cellules dÃ©jÃ&nbsp; calculÃ©es.

\subsection{DÃ©bogage}
Pour faciliter l'utilisation de \ST, un mode de dÃ©bogage est disponible. Il est activÃ© lorsque la clÃ© \STkey{debug}\label{debug} n'est pas vide et contient au moins un des mots \STval{formula}, \STval{text} ou \STval{cellcode}, sÃ©parÃ©s par des virgules. Ces mots provoquent chacun l'affichage d'un tableau de dÃ©bogage :
\begin{itemize}
	\item \STval{formula} : affichage des champs numÃ©riques de toutes les cellules et les fins de ligne;
	\item \STval{text} : affichage des champs textuels de toutes les cellules;
	\item \STval{cellcode} : affichage du code interne que \ST affecte Ã&nbsp; chaque cellule. Ce code interne est assignÃ© Ã&nbsp; chaque cellule lors de la lecture du tableau. Il vaut :
	\begin{enumerate}
		\item $-1$ s'il s'agit d'une cellule fusionnÃ©e par une commande \verb-\multicolumn-;
		\item 0 si la cellule est vide ou purement textuelle;
		\item 1 si le champ numÃ©rique de la cellule contient une formule qui sera Ã&nbsp; Ã©valuer plus tard;
		\item 2 si la champ numÃ©rique de la cellule contient un nombre.
	\end{enumerate}
\end{itemize}
On peut ajouter la valeur \STval{show tab} pour forcer l'affichage du tableau obtenu qui sinon, n'est pas affichÃ©.

Voici un tableau pour lequel on affiche les 3 tableaux de dÃ©bogage et aussi le tableau final obtenu :
\exemple*!\STset{debug={text,formula,cellcode,show tab}}
\begin{spreadtab}{{tabular}{|rr|r|}}\hline
	@$x$              &amp;@$y$                &amp; @$x+y$\\\hline\hline
	22                &amp; 54                 &amp; \STcopy{v3}{a2+b2} \\
	43                &amp; 65                 &amp; \\
	49                &amp; 37                 &amp; \\\hline
	$Sx=:={a2+a3+a4}$ &amp; $Sy=:={b2+b3+b4}$  &amp; $Sx+Sy=:={}$\\\hline
	\multicolumn2{|r|}{$Sy-Sx=:={b5-a5}$}  &amp; @\multicolumn1c{}\\\cline{1-2}
\end{spreadtab}!

Ces 3 tableaux de dÃ©bogage peuvent aider Ã&nbsp; comprendre un peu mieux le fonctionnement interne de \ST. On peut observer dans le tableau 2 que toutes les cellules ayant un champ numÃ©rique ont un code interne de 1 ou 2 (voir tableau 3) et ont un marqueur de champ numÃ©rique Â«\verb-:=-Â» qui leur est associÃ© (voir tableau 1). Ce marqueur reprÃ©sente l'endroit oÃ¹ sera insÃ©rÃ© ---~par substitution~--- le rÃ©sultat du calcul du champ numÃ©rique. C'est donc Ã&nbsp; partir des contenus des champs textuels du tableau 1 et par simple substitution, qu'une fois les champs numÃ©riques calculÃ©s, les cellules sont reconstituÃ©es pour donner celles du tableau final.

Dans les tableaux de dÃ©bogage, les cellules contenant les coordonnÃ©es ne sont grisÃ©es que si le package \href{https://ctan.org/pkg/colortbl}{\texttt{colortbl}} a Ã©tÃ© chargÃ©.

\section{Liste des clÃ©s}\label{key/val}
Tous les rÃ©glages concernant \ST se font Ã&nbsp; partir de la version 0.6 par un systÃ¨me de \chevrons{clÃ©s}$=$\chevrons{valeur} qui peuvent se trouver :
\begin{enumerate}
	\item dans l'argument de \verb|\STset| auquel cas les rÃ©glages spÃ©cifiÃ©s concernent tous les tableaux Ã&nbsp; venir ;
	\item dans l'argument optionnel de \verb|\begin{spreadtab}| ou \verb|spreadtab| et dans ce cas, les rÃ©glages spÃ©cifiÃ©s ne concernent que le tableau en cours.
\end{enumerate}
Voici la liste des \chevrons{clÃ©s} et leurs valeurs par dÃ©faut :\renewcommand\arraystretch{1.33}%
\begin{longtable}{rlcp{9cm}}\hline
	\chevrons{clÃ©} &amp; \chevrons{valeur} &amp; voir page &amp; Description \\\hline\endhead\hline\endfoot
	\STkey{tabline sep} &amp; \STval[]{\string\\} &amp; \pageref{tabline sep} &amp;  sÃ©parateur entre les lignes du tableau \\
	\STkey{text mark} &amp; \STval[]{\string @} &amp; \pageref{text mark} &amp; la \chevrons{valeur} est dÃ©tokÃ©nisÃ©e : si elle est prÃ©sente dans une cellule, \ST la comprend comme une cellule de texte \\
	\STkey{numeric mark} &amp; \STval[]{:=} &amp; \pageref{numeric mark} &amp; l'argument entre accolades qui suit est le champ numÃ©rique de la cellule \\
	\STkey{freeze char} &amp; \STval[]{!} &amp; \pageref{freeze char} &amp; caractÃ¨re dÃ©tokÃ©nisÃ© qui, s'il est prÃ©sent devant la lettre ou le nombre d'une rÃ©fÃ©rence, ne l'incrÃ©mente pas lors de la copie de la formule \\
	\STkey{pretab code} &amp; \STval[]{} &amp; \pageref{pretab code} &amp; code exÃ©cutÃ© juste avant l'affichage du tableau\\
	\STkey{posttab code} &amp; \STval[]{} &amp; \pageref{posttab code} &amp; code exÃ©cutÃ© juste aprÃ¨s l'affichage du tableau \\
	\STkey{dec sep} &amp; \STval[]{.} &amp; \pageref{dec sep} &amp; sÃ©parateur dÃ©cimal des nombres aprÃ¨s calcul du tableau \\
	\STkey{autoround} &amp; \STval[]{} &amp; \pageref{autoround} &amp; Une absence de valeur est le comportement normal sinon, un \chevrons{entier} positif est attendu et indique le rang de l'arrondi des calculs internes\\
	\STkey{save list} &amp; \STval[]{} &amp; \pageref{save list} &amp; liste csv de la forme \chevrons{macro}$=$\chevrons{rÃ©fÃ©rence absolue} : chaque nombre contenu dans les cellules rÃ©fÃ©rencÃ©es est stockÃ©e (globalement) dans une macro. Cette clÃ© est rÃ©initialisÃ©e Ã&nbsp; vide aprÃ¨s chaque tableau \\
	\STkey{aux save list} &amp;\STval[]{} &amp; \pageref{aux save list} &amp; mÃªme syntaxe et comportement que ci-dessus, mais les assignations sont Ã©galement Ã©crites dans le fichier auxiliaire. Cette clÃ© est rÃ©initialisÃ©e Ã&nbsp; vide aprÃ¨s chaque tableau  \\
	\STkey{display marks} &amp; \STval[]{&lt;\kern0pt&lt;;&gt;\kern0pt&gt;} &amp; \pageref{display marks} &amp; marqueurs autour d'une rÃ©fÃ©rence absolue dans un champ textuel pour afficher le nombre contenu dans la cellule rÃ©fÃ©rencÃ©e \\
	\STkey{copy char} &amp; \STval{"} &amp; \pageref{copy char} &amp; dans l'argument de \verb|\STcopy|, indique le dÃ©but et la fin de la partie de la formule qui doit Ãªtre prise en compte pour les dÃ©calages lors de la copie \\
	\STkey{tag to aux} &amp; \STval{false} &amp; \pageref{tag to aux} &amp; lorsque \STval{true}, les assignations faites par la macro-fonction \STmacro{tag} sont Ã©galement Ã©crites dans le fichier auxiliaire \\
	\STkey{messages} &amp; \STval{false} &amp; \pageref{messages} &amp; permet Ã&nbsp; \ST d'Ã©mettre des messages dans le fichier log sur ce qu'il est en train de faire \\
	\STkey{debug} &amp; \STval[]{} &amp; \pageref{debug} &amp; doit contenir sous forme csv des mots parmi \STval{text}, \STval{formula} ou \STval{cellcode} pour afficher le tableau de dÃ©bogage correspondant. Si le mot \STval{show tab} est ajoutÃ©, le tableau est Ã©galement affichÃ©. Cette clÃ© est rÃ©initialisÃ©e Ã&nbsp; vide aprÃ¨s chaque tableau.\\
	\hline
\end{longtable}
Pour revenir aux valeurs par dÃ©faut, on peut Ã&nbsp; tout moment exÃ©cuter la macro \verb|\STreset|.
\bigbreak

\begin{center}
	\Large\parskip0pt \offinterlineskip
	*\kern0.33em *\par
	 *
\end{center}

Merci de me signaler par \href{mailto:unbonpetit@netc.fr}{\texttt{email}} tout bug, rÃ©gression ou toute nouvelle fonctionnalitÃ© Ã&nbsp; implÃ©menter que vous pensez utile.
\end{document}</pre></body></html>