summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/spreadtab/spreadtab-fr.tex
blob: 1eab8cb386467cf9a81c0f278ef0b3127799044a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
% Documentation de l'extension "spreadtab"
\documentclass[french,a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[a4paper,margin=2.6cm]{geometry}
\usepackage[table]{xcolor}
\usepackage{amsmath,amssymb,textcomp,array,arydshln,tabularx,numprint,xspace,fancyhdr,libertine,babel,enumitem,listings,bxtexlogo}
\bxtexlogoimport{*}\frenchsetup{og=«,fg=»}
\usepackage[xfp,fp]{spreadtab}\STusexfp
\usepackage[italic]{mathastext}
\usepackage[scaled=0.8]{luximono}
\fancyhead[L]{}
\fancyhead[C]{\small\bfseries\ST}
\fancyhead[R]{\scriptsize\slshape \leftmark}
\fancyfoot[l]{}
\fancyfoot[c]{}
\fancyfoot[r]{\thepage}
\usepackage[bottom]{footmisc}
\usepackage[protrusion=true,final,verbose=true,babel=true]{microtype}
\frenchbsetup{StandardLists=true}
\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,endspreadtab,SThiderow,SThidecol,STsavecell,STautoround,STmessage,STsetdecimalsep,STtransposecar,STdebug,STdisplaytab,STsetdisplaymarks,%
		STnumericfieldmarker,STprintnum,STtextcell,STcopy,STtag,STmakegtag,STeol,fact,id,ifeq,ifgt,iflt,numtofrshortdate,STusefp,STusexfp,%
		numtoengshortdate,numtofrlongdate,numtoenglongdate,numtofrmonth,%
		numtoengmonth,numtofrday,numtoengday,sum,rand,randint,sumprod,%
		frshortdatetonum,engshortdatetonum,englongdatetonum,frlongdatetonum,gcd,lcm,tag,cell,row,col,value},%
	keywordstyle=\color{ST@keywordstc},classoffset=0}

%%%%%%%%%%% environnement OOcalc
\newcount\cntlin
\newcount\cntcol

\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&\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
	\newcolumntype w{>{\centering\arraybackslash}m{#1}}%
	\arrayrulewidth0.4pt\dashlinedash0.4pt\relax\dashlinegap3pt
	\global\cntlin\m@ne\global\cntcol\z@
	\tabfont
	\tabcolsep0pt
	\t@b{\begin{tabular}{%
		|>{\cellcolor{tabheadcolor}%
			\global\cntcol\z@\global\advance\cntlin\@ne
			\centering\arraybackslash
			\ifnum\cntlin>\z@\tableheadformat\number\cntlin\fi}
		m{2em}|*{#2}{w:}}%
		\hline
		\rowcolor{tabheadcolor}}%
	\loop
		\ifnum\cntcol<#2
			\advance\cntcol\@ne
			\addtot@b{&\multicolumn{1}{>\centering m{#1}|}}%
			\edftot@b{{\noexpand\tableheadformat\@Alph\cntcol}}%
	\repeat
	\addtot@b{\\\hline&}%
	\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}
\makeatother

% commandes de personnalisation de OOcalc
\newcommand*\tabfont{\fontfamily{phv}\selectfont\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
\colorlet{palepink}{pink!80}
\colorlet{lightpink}{pink!30}
\colorlet{palegreen}{green!60}
\colorlet{lightgreen}{green!30}
\newcommand\CC[1]{\cellcolor{#1}}

\newcommand\verbinline[1][]{\lstinline[breaklines=false,basicstyle=\normalsize\ttfamily,#1]}
\newcommand\ST{\textsf{\STname}\xspace}
\newcommand\xfp{\texttt{\bfseries xfp}\xspace}
\newcommand\fp{\texttt{\bfseries fp}\xspace}
\newcommand\falseverb[1]{\texttt{\detokenize{#1}}}

\usepackage[bookmarks=true,bookmarksopen=true,colorlinks=true,hyperfootnotes=false,filecolor=black,linkcolor=blue,urlcolor=magenta,pdfauthor={Christian TELLECHEA},pdftitle={spreadtab},pdfsubject={Spreadtab permet d'utiliser des fonctionnalités de tableur dans un tableau avec LaTeX},pdfkeywords={spreadtab},pdfcreator={LaTeX}]{hyperref}

\begin{document}
\parindent0pt\pagestyle{fancy}\setitemize{leftmargin=3em,topsep=0pt,parsep=0pt,itemsep=0pt,label=--}\STsetdecimalsep{,}
\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é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 similaires à des feuilles de calculs. Les cellules du tableau ont des coordonnées (colonne et ligne) qui peuvent être utilisées dans des formules pour calculer des valeurs dans d'autres cellules. On charge le package en écrivant dans le préambule la syntaxe classique
\begin{center}
\verb-\usepackage[<options>]{spreadtab}-
\end{center}
où les options «\verb|fp|» ou «\verb|xfp|» spécifient le moteur de calcul choisi. Si aucune option n'est spécifiée, le moteur sera \fp. Si les deux options sont spécifiées, le moteur actif au début du document sera \fp, mais dans ce cas, on peut changer de moteur à tout moment en exécutant \verbinline|\STusefp| ou \verbinline|\STusexfp|. Cette documentation est compilée avec le moteur \xfp, sauf exemple où le contraire est spécifié. En règle générale, les deux moteurs de calcul doivent donner des résultats identiques, mais :
\begin{itemize}
	\item \fp est un moteur de calcul à virgule fixe (18 chiffres avant et 18 après) et donne donc davantage de chiffres après la virgule que \xfp qui effectue les calculs en virgule flottante avec 16 chiffres significatifs; en revanche, \xfp accepte nativement des tests, gère l'infini et \verb|NaN|, comprend la multiplication implicite par juxtaposition, etc.
	\item des différences existent entre les deux moteurs concernant les fonctions disponibles tant du point de vue de la syntaxe que de leur existence même. Ainsi, la fonction \verb|max(...)| n'admet que \emph{deux} nombres en argument avec \fp tandis que \xfp accepte autant d'arguments que l'on veut. De la même façon, l'exponentielle s'obtient avec \verb|e^x| ou \verb|pow(x,e)| avec \fp alors que la syntaxe avec \xfp est \verb|exp(x)|. Par ailleurs, les fonctions reconnues par les deux moteurs ne sont pas les mêmes, comme on peut le constater en lisant leurs documentations : \verb|ceil| par exemple, n'existe que pour \xfp. D'une manière générale, on peut considérer \xfp comme étant mieux doté en fonctionnalités que \fp;
	\item les fonctions \verbinline|rand| et \verbinline|randint| ne sont pas disponibles avec le moteur \xfp lorsqu'on compile avec une version de \XeLaTeX{} trop ancienne.
\end{itemize}

Ce package nécessite le moteur \eTeX, le format \LaTeXe{} ainsi que le package \href{https://www.ctan.org/pkg/fp}{\fp} ou \href{https://ctan.org/pkg/xfp}{\xfp} à qui sont confiés les calculs. Le package \href{https://www.ctan.org/pkg/xstring}{\texttt{\textbf{xstring}}} est également requis.

J'ai souhaité dès le départ de rendre ce package compatible avec \emph{tous} les environnements de tableaux, sous réserve que les séparateurs entre colonnes soient «\verb=&=» et les retours à la ligne soient «\verb=\\=». Cette contrainte forte sur la compatibilité m'a conduit à programmer \ST pour qu'il agisse d'une façon \emph{totalement indépendante} de l'environnement tableau. Ainsi, la lecture du tableau, le traitement et le calcul des formules se fait \emph{avant} que l'environnement tableau ne prenne la main et ne «voit» le corps du tableau.

Par conséquent, \ST procède en 3 étapes :
\begin{itemize}
	\item en premier lieu, \ST lit le corps du tableau et le divise en lignes puis en cellules en reconnaissant dans chacune la présence d'une  éventuelle formule;
	\item ensuite, il procède au calcul des formules contenues dans les cellules, en ayant pris soin pour chacune de calculer auparavant les cellules dépendantes. L'ordre dans lequel les cellules doivent être calculées est déterminé par \ST. Les calculs sont faits par le package \fp ou \xfp, sous réserve que les formules à évaluer dans les cellules soient compatibles avec les syntaxes des macros \verb|\FPeval| du package \fp ou \verb|\fpeval| du package \xfp\footnote{Si l'on souhaite utiliser le «ET» logique de \xfp noté «\texttt{\string&\string&}», il est \emph{obligatoire} de mettre cet opérateur entre accolades dans un tableau afin que les tokens \texttt{\string&} ne soient pas compris comme des séparateurs de colonnes. Dans une cellule d'un tableau, pour tester si le contenu de la cellule \texttt{a1} appartient à un intervalle, on écrira donc par exemple «\texttt{a1>1 \string{\string&\string&\string} a1<10}».};
	\item enfin, il faut reconstruire le tableau en ayant remplacé chaque formule par la valeur numérique préalablement calculée et passer la main à l'environnement tableau spécifié par l'utilisateur.
\end{itemize}
Les deux syntaxes possibles (et équivalentes) sont les suivantes, où \verb-<nom>- représente le nom de n'importe quel environnement de type tableau disponible avec \LaTeX{} ou avec une extension :\par\nobreak
\begin{minipage}{0.48\linewidth}
\begin{lstlisting}[backgroundcolor=\color{ST@codebckgcolor}]
\begin{spreadtab}{{<nom>}{<parametres>}}
	tableau avec formules et nombres
\end{spreadtab}
\end{lstlisting}
\end{minipage}\hfill ou\hfill
\begin{minipage}{0.48\linewidth}
\begin{lstlisting}[backgroundcolor=\color{ST@codebckgcolor}]
\spreadtab{{<nom>}{<parametres>}}
	tableau avec formules et nombres
\endspreadtab
\end{lstlisting}
\end{minipage}

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>}{<parametres>}
	tableau avec nombres
\end{<nom>}
\end{lstlisting}

Même si disposer de fonctionnalités ressemblant à celles d'un tableur avec \LaTeX{} est appréciable, il ne faut pas perdre de vue que les 3 étapes décrites ci-dessus prennent du temps. L'ensemble conduit donc à des temps de compilation \emph{beaucoup plus importants} qu'avec un tableau classique.

Il faut ajouter que \ST \emph{ne peut remplacer un tableur}. En effet, ses possibilités sont très limitées. De plus, surtout pour des tableaux complexes ou de grande taille, le manque d'aide visuelle devient gênant\footnote{Ceci dit, je certifie qu'avec l'habitude, cette gêne tend à s'estomper (si l'on s'en tient à des tableaux raisonnables, bien sûr).}, et la syntaxe de \ST constitue aussi un obstacle supplémentaire. L'avantage de cette extension est de pouvoir écrire \emph{dans le code \LaTeX} des tableaux comportant des calculs, alors que ces tableaux sont généralement exportés\footnote{On peut signaler les 2 principaux programmes d'exportation : \href{http://calc2latex.sourceforge.net/}{\texttt{\textbf{cacl2latex}}} pour «calc» de Open Office, et \href{http://www.ctan.org/tex-archive/support/excel2latex/}{\texttt{\textbf{excel2latex}}} pour «excel» de Microsoft Office.} d'une feuille de calcul d'un tableur vers le code \LaTeX. On évite ainsi les désagréments des programmes d'exportation : mise en forme souvent à retoucher pour obtenir exactement ce que l'on veut, non compatibilité avec tous les environnements de tableaux, obtention de tableaux ne contenant que les valeurs (les formules sont perdues à l'exportation), exportation à recommencer si l'on modifie un seul nombre ou formule dans le tableau.

\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.

La route a été longue avant d'arriver à cette version et je tiens à remercier tout particulièrement Christophe \textsc{Casseau} pour l'intérêt qu'il a porté dès le début à ce travail et les suggestions qu'il m'a faites, ainsi que plus récemment Derek \textsc{O'Connor} pour ses conseils et pour les échanges constructifs que nous avons eus. J'adresse également mes remerciements à Andrew \textsc{Parsloe} pour la relecture et les corrections apportées à la traduction de ce manuel en anglais.

\section{Fonctionnalités courantes}
Il faut noter tout d'abord qu'à l'intérieur d'un tableau sous environnement \ST, les caractères «\verb=:=», «\verb=;=», «\verb|!|» et «\verb|?|» perdent leur code de catégorie actif qui leur a été attribué si vous utilisez l'option \falseverb{french} du package \falseverb{babel}. Par conséquent, l'espace automatique inséré avant ces caractères sera désactivé dans un tableau.

\label{STeol}Par défaut, \ST considère qu'une ligne se termine avec ``\verb-\\-'' qui est habituel dans les tableaux. Ce marqueur de fin de ligne peut être modifié via la commande \verbinline-\STeol{<macro>}-. On peut par exemple écrire \verbinline-\STeol{\tabularnewline}-. Il faut bien comprendre que les fins de lignes qui seront insérées dans le tableau final seront toujours ``\verb-\\-'', même si le marqueur de fin de ligne lorsque \ST \emph{lit} le tableau a été modifié.

\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 de \falseverb a à \falseverb z, \falseverb a représentant la 1\iere{} colonne de gauche : on est donc d'emblée limité à 26 colonnes, ce qui devrait suffire pour la grande majorité des cas; la lettre est insensible à la casse, elle peut donc être indifféremment minuscule ou majuscule;
	\item à la suite immédiate de la lettre, un nombre entier strictement positif représente le numéro de la ligne, la ligne numéro 1 étant la ligne du haut.
\end{itemize}
Une référence absolue s'écrit donc par exemple : «\falseverb{b4}», «\falseverb{C1}» ou «\falseverb{d13}»\footnote{Cette notation se retrouve dans les tableurs : la lettre représente la colonne et le nombre qui suit représente la ligne. Cet ordre est le contraire de la convention utilisée avec les matrices en mathématiques.}. Visuellement, on peut illustrer ce fonctionnement par ce genre de tableau ressemblant à un tableur, ici volontairement limité à 5 lignes et 5 colonnes :
\begin{center}
\begin{OOocalc}[6em]{5}
&&&&\\&&&&\\&&&&\\&&&&\\&&&&\\
\end{OOocalc}
\end{center}
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 «relatives» d'une cellule sont 2 nombres relatifs écrits selon cette syntaxe : \falseverb{[x,y]}, où \falseverb x est le décalage horizontal par rapport à la cellule contenant la formule et \falseverb y est le décalage vertical. Ainsi, \falseverb{[-2,3]} fait référence à la cellule se trouvant 2 colonnes avant (à gauche) et 3 lignes après (plus bas) la cellule où se trouve la formule.

Voici à nouveau le triangle de Pascal vu ci-dessus, mais les références sont relatives et l'environnement «\verbinline-matrix-» du package \href{http://www.ctan.org/tex-archive/macros/latex/required/amslatex/math/}{\texttt{\textbf{amsmath}}} est utilisé :\par\nobreak
\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{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 «\falseverb @». Ce faisant, la cellule est ignorée par \ST et devient une cellule inerte à qui il n'est pas possible\footnote{Il y a une exception à cette règle, voir la page \protect\pageref{datetonum}.} de faire référence nulle part ailleurs dans le tableau.

Voici un exemple :\par\nobreak
\begin{lstlisting}
\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 «\falseverb @» est le développement de la séquence de contrôle \verbinline=\STtextcell=. On peut donc redéfinir cette séquence de contrôle en ce que l'on veut et par exemple, \verbinline-\renewcommand\STtextcell{`}- fera qu'une cellule contenant le caractère ``\verb=`='' sera comprise comme étant une cellule de texte.

De plus, si une cellule est vide ou entièrement constituée d'espaces, alors \ST la considérera comme une cellule de texte.

\subsection{Cellules mixtes}
En réalité, chaque cellule est composée de \emph{deux} champs. D'un côté le \emph{champ numérique} qui contient la formule et de l'autre le \emph{champ textuel} qui sera ignoré par le moteur de calcul et n'entre pas en ligne de compte pour les calculs :
\begin{itemize}
	\item dans une cellule, si rien n'est précisé, la totalité de la cellule est considérée comme étant le champ numérique, et le champ textuel est vide (c'était le cas pour toutes les cellules du tableau du triangle de Pascal vu précédemment);
	\item si la cellule contient «\falseverb{@}», alors la totalité de la cellule est considérée comme étant le champ textuel. Le champ numérique est vide et inaccessible.
	\item si la cellule contient «\verb-:=-», alors l'argument entre accolades qui suit est le champ numérique, et tout le reste est le champ textuel. La cellule a cette structure :\par\smallskip
		\hfil\verb-<champ textuel>:={champ numérique}<suite du champ textuel>-\hfil\null\par\smallskip
	On peut changer ce marqueur en la séquence de contrôle «\verb-\=-» par exemple, en redéfinissant la macro \verbinline-\STnumericfieldmarker- de cette façon :\par\smallskip{\centering
		\verbinline-\renewcommand\STnumericfieldmarker{\=}-\par\smallskip}
	Dans ce cas, le développement de \verb-\=- n'aurait strictement aucune importance et n'interviendrait pas dans le processus : pour \ST, il ne s'agit que d'un marqueur de début de formule qui est cherché et reconnu sans être développé.
\end{itemize}
Une fois le «\verb-champ numérique-» calculé, lui seul et le marqueur «\verb-:=-» seront remplacés par la valeur numérique calculée.

Il faut noter que «\verb-:={champ numérique}-» peut se trouver à l'intérieur d'accolades et ce quelque soit le niveau d'imbrication. Par exemple, dans une cellule, on peut écrire \verb-\textbf{:={a1+1}}-. Si le champ numérique de la cellule \falseverb{a1} est 5, alors la cellule contiendra au final \verb-\textbf{6}-.

Pour fixer les idées, voici un exemple très simple :\par\nobreak
\begin{lstlisting}
\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 «\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 à recopier des formules identiques dans des cellules voisines, \ST fournit l'instruction \verbinline-\STcopy-.

Cette commande se place dans une cellule selon cette syntaxe :
\begin{center}
\verbinline-\STcopy{>-$x$\verbinline-,v-$y$\verbinline-}{formule}-
\end{center}
où $x$ et $y$ sont des nombres positifs qui représentent des décalages horizontaux et verticaux par rapport à la cellule où se trouve l'instruction. La cellule qui contient la commande et la cellule obtenue par ces décalages définissent une plage rectangulaire de cellules qui recevront la \verb-<formule>-\footnote{La copie ne peut donc se faire que vers des cellules se trouvant à droite et plus bas que la cellule dans laquelle se trouve la commande.}. La commande \verbinline-\STcopy -\emph{ne doit pas} se trouver dans une cellule où un marqueur de champ numérique «\verb-:=-» est présent.

Voici comment se déroule la copie : elle se fait en partant de la cellule où se trouve l'instruction, la cellule source. Pour chaque cellule cible, toutes les références dans la formule sont incrémentées pour tenir compte du décalage entre la cellule cible et la cellule source. Ainsi par exemple, mettons que la cellule source contienne la formule \verb-a1+b2+c3-. Lorsque cette formule est copiée dans une cellule cible se trouvant 2 colonnes à droite et 5 lignes en dessous, cette formule deviendra : \verb-c6+d7+e8-. La formule peut également contenir des références relatives qui, puisqu'elle sont relatives, ne seront pas modifiées.

En faisant précéder d'un «\verb-!-» une coordonnée d'une référence, cette coordonnée reste inchangée lors de la copie. Reprenons l'exemple précédent avec la formule \verb-a!1+!b2+!c!3-. Si cette formule est copiée dans la cellule se trouvant 2 colonnes à droite et 5 lignes en dessous, alors, elle deviendra : \verb-c1+b7+c3-. Cette fonctionnalité est compatible avec des références relatives : mettons qu'une cellule contienne la formule \verb|[-1,!-1]+[!-1,1]+[!1,!2]| et que cette formule soit copiée vers la cellule se trouvant 2 colonnes à droite et 5 lignes en dessous. Alors, elle deviendra : \verb|[-1,-6]+[-3,1]+[-1,-3]|.

Le caractère «\verb-!-» est le développement de la séquence de contrôle \verbinline-\STtransposecar-. On peut donc modifier ce caractère en tout autre avec \verbinline-\renewcommand\STtransposecar-\verb-{<caractère>}-. Le point d'exclamation, utilisé par défaut, garde son code de catégorie actif qui lui a été attribué par le package \verb-babel- chargé avec l'option \verb-frenchb-.

Dans la syntaxe \verbinline-\STcopy{>-$x$\verbinline-,v-$y$\verbinline-}{formule}-, si le nombre $x$ est absent, la copie dans le sens horizontal se fait vers la droite jusqu'au bord droit du tableau. Si $y$ est absent, la copie dans le sens vertical se fait jusqu'en bas du tableau.

Voici quelques exemples :
\begin{tabular}{cl}\hline
\verb-{>3,v1}- & copie vers les 3 colonnes à droite et 1 ligne en dessous\\
\verb-{>3}- & copie vers les 3 cellules de droite\\
\verb-{v1}- & copie vers la cellule de dessous\\
\verb-{>}- & copie vers toutes les cellules situées à droite\\
\verb-{v}- & copie vers toutes les cellules situées en dessous\\
\verb-{v,>}- & copie vers le bas et vers la droite à partir de la cellule courante\\\hline
\end{tabular}

On peut facilement générer la table de multiplication de 1 à 10 :

\begin{lstlisting}
\begin{spreadtab}{{tabular}{|c|*{10}{c}|}}
\hline
@$\times$        & 1                     & \STcopy{>}{b1+1}  & & & & & & & & \\\hline
1                & \STcopy{>,v}{!a2*b!1} &                   & & & & & & & & \\
\STcopy{v}{a2+1} &                       &                   & & & & & & & & \\
                 &                       &                   & & & & & & & & \\
                 &                       &                   & & & & & & & & \\
                 &                       &                   & & & & & & & & \\
                 &                       &                   & & & & & & & & \\
                 &                       &                   & & & & & & & & \\
                 &                       &                   & & & & & & & & \\
                 &                       &                   & & & & & & & & \\
                 &                       &                   & & & & & & & & \\\hline
\end{spreadtab}
\end{lstlisting}
\begin{center}
\begin{spreadtab}{{tabular}{|c|*{10}{c}|}}
\hline
@$\times$        & 1                     & \STcopy{>}{b1+1}  & & & & & & & & \\\hline
1                & \STcopy{>,v}{!a2*b!1} &                   & & & & & & & & \\
\STcopy{v}{a2+1} &                       &                   & & & & & & & & \\
                 &                       &                   & & & & & & & & \\
                 &                       &                   & & & & & & & & \\
                 &                       &                   & & & & & & & & \\
                 &                       &                   & & & & & & & & \\
                 &                       &                   & & & & & & & & \\
                 &                       &                   & & & & & & & & \\
                 &                       &                   & & & & & & & & \\
                 &                       &                   & & & & & & & & \\\hline
\end{spreadtab}
\end{center}

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

Si des commandes \verbinline-\STcopy- se trouvant dans des plusieurs cellules départ ont une même cellule cible, la formule que cette dernière reçoit est celle correspondant à la dernière commande  \verbinline-\STcopy- rencontrée lorsque le tableau est lu de haut en bas et de droite à gauche. Dans l'exemple visuel ci-dessous, le \verbinline-\STcopy- se trouvant dans la cellule rose \falseverb{B1} a son champ cible partiellement recouvert par celui du \verbinline-\STcopy- se trouvant dans la cellule verte \falseverb{C3}. En effet, cette dernière est rencontrée plus tard lors de la lecture du tableau :
\begin{center}
\begin{OOocalc}[2.3cm]{6}
1 &\CC{palepink}\ttfamily\textbackslash STcopy \{v,>\}\{!a1+1\} &\CC{lightpink} &\CC{lightpink} &\CC{lightpink} &\CC{lightpink} \\
2 &\CC{lightpink} &\CC{lightpink} &\CC{lightpink} &\CC{lightpink} &\CC{lightpink} ~\par~ \\
3 &\CC{lightpink} &\CC{palegreen}\ttfamily\textbackslash STcopy \{>2,v1\}\{!a3*10\}&\CC{lightgreen} &\CC{lightgreen} &\CC{lightpink} \\
4 &\CC{lightpink} &\CC{lightgreen} &\CC{lightgreen} &\CC{lightgreen} &\CC{lightpink}~\par~  \\
5 &\CC{lightpink} &\CC{lightpink} &\CC{lightpink} &\CC{lightpink} &\CC{lightpink}~\par~  \\
\end{OOocalc}
\end{center}
Voici cet exemple repris ci-dessous pour mettre en évidence ces comportements. Dans cet exemple, la cellule \verb-b5- qui est composée d'un champ numérique et la cellule \verb-c5- qui est mixte, leur champ numérique n'étant pas vide, il est conservé.
\begin{lstlisting}
\begin{spreadtab}{{tabular}{|*6{c|}}}\hline
1 &\STcopy{v,>}{!a1+1} &                        & & & \\\hline
2 &                    &                        & & & \\\hline
3 &                    & \STcopy{>2,v1}{!a3*10} & & & \\\hline
4 &                    &                        & & & \\\hline
5 &       -1           &       a:={0}b          & & & \\\hline
\end{spreadtab}
\end{lstlisting}
\begin{center}
\begin{spreadtab}{{tabular}{|*6{c|}}}\hline
1 &\STcopy{v,>}{!a1+1} &                        & & & \\\hline
2 &                    &                        & & & \\\hline
3 &                    & \STcopy{>2,v1}{!a3*10} & & & \\\hline
4 &                    &                        & & & \\\hline
5 &       -1           &       a:={0}b          & & & \\\hline
\end{spreadtab}
\end{center}
Comme on l'a dit à la fin du chapitre précédent, on peut également copier une formule dans une cellule de texte contenant un champ numérique vide (c'est-à-dire une cellule contenant «\verb-:={}-»). Dans ce cas, la formule est copiée à l'endroit où se trouve «\verb-:={}-». Par contre, dans une cellule de texte contenant «\verb-@-», la copie ne se fait pas et la cellule reste purement textuelle.

Exemple :
\begin{lstlisting}
\begin{spreadtab}{{tabular}{|*6{c|}}}\hline
1                  & 2   & 3      & 4              & 5 & 6 \\\hline
X\STcopy{>}{a1+1}Y & @XY & X:={}Y & \textbf{:={}}  &   &   \\\hline
\end{spreadtab}
\end{lstlisting}
\begin{center}
\begin{spreadtab}{{tabular}{|*6{c|}}}\hline
1                  & 2   & 3      & 4              & 5 & 6 \\\hline
X\STcopy{>}{a1+1}Y & @XY & X:={}Y & \textbf{:={}}  &   &   \\\hline
\end{spreadtab}
\end{center}

\section{Mise en forme du tableau}
\subsection{Séparateur décimal}
Les packages \fp et \xfp renvoient les résultats décimaux avec le point comme séparateur décimal. Il est possible de changer ce séparateur décimal de telle sorte que tout se passe comme si les résultats retournés par \fp ou \xfp en tenaient compte. L'instruction \verbinline-\STsetdecimalsep- permet de changer le séparateur décimal en n'importe quel caractère en utilisant la syntaxe :
\begin{center}
\verbinline-\STsetdecimalsep-\verb-{<caractère>}-
\end{center}
Pour une utilisation en langue française, il faut donc inclure dans le préambule cette ligne :
\begin{center}
\verbinline-\STsetdecimalsep{,}-
\end{center}
Pour les champs numériques se trouvant en mode math, il faut noter que la virgule n'est pas neutre dans ce mode. En effet, elle est considérée comme une ponctuation ce qui explique qu'elle est suivie d'une espace. Pour neutraliser cet espace, on peut mettre cette virgule entre accolades comme on le voit dans ce code :

\begin{minipage}{0.65\linewidth}
\begin{lstlisting}[escapechar=Z,backgroundcolor=\color{ST@codebckgcolor}]
3,14 n'est pas affichZéZ comme $3,14$.\par
3,14 est affichZéZ comme $3{,}14$
\end{lstlisting}
\end{minipage}\hfill
\begin{minipage}{0.35\linewidth}
3,14 n'est pas affiché comme $3,14$.\par
3,14 est affiché comme $3{,}14$
\end{minipage}%

Lorsque des cellules sont en mode math, on peut\footnote{Il est cependant préférable d'utiliser le package \texttt{numprint} pour formatter les résultats. On peut aussi modifier le code mathématique de la virgule : \texttt{\textbackslash mathcode`,="013B\textbackslash relax}. Cette modification, réservée aux utilisateurs avertis, fait entrer la virgule dans la classe 0 des signes ordinaires alors qu'elle est naturellement dans la classe 6 des signes de ponctuation.} s'inspirer de cette propriété et demander à \ST de remplacer le point décimal par une virgule entre accolades avec la commande \verbinline-\STsetdecimalsep{{,}}-. Dans ces deux tableaux où chaque cellule est en mode math, on constate que l'espacement après la virgule est neutralisé pour le second :

\begin{minipage}{0.65\linewidth}
\begin{lstlisting}
\STsetdecimalsep{,}
\begin{spreadtab}{{tabular}{|*3{>{$}r<{$}}|}}\hline
@x   & @y  & @\text{Moyenne}\\\hline
5    & -4  & (a2+b2)/2\\
-6.1 & -8  & (a3+b3)/2\\
9.85 & 3.7 & (a4+b4)/2\\\hline
\end{spreadtab}\par\smallskip
\STsetdecimalsep{{,}}
\begin{spreadtab}{{tabular}{|*3{>{$}r<{$}}|}}\hline
@x   & @y  & @\text{Moyenne}\\\hline
5    & -4  & (a2+b2)/2\\
-6.1 & -8  & (a3+b3)/2\\
9.85 & 3.7 & (a4+b4)/2\\\hline
\end{spreadtab}
\end{lstlisting}
\end{minipage}%
\begin{minipage}{0.35\linewidth}
\centering
\STsetdecimalsep{,}
\begin{spreadtab}{{tabular}{|*3{>$r<$}|}}\hline
@x   & @y  & @\text{Moyenne}\\\hline
5    & -4  & (a2+b2)/2\\
-6.1 & -8  & (a3+b3)/2\\
9.85 & 3.7 & (a4+b4)/2\\\hline
\end{spreadtab}\par\smallskip
\STsetdecimalsep{{,}}
\begin{spreadtab}{{tabular}{|*3{>$r<$}|}}\hline
@x   & @y  & @\text{Moyenne}\\\hline
5    & -4  & (a2+b2)/2\\
-6.1 & -8  & (a3+b3)/2\\
9.85 & 3.7 & (a4+b4)/2\\\hline
\end{spreadtab}
\end{minipage}

\subsection{Mise en forme des nombres avec le moteur \fp}
Comme cela a été précisé avec l'option \fp, tous les calculs sont faits par le package \href{http://www.ctan.org/tex-archive/macros/latex/contrib/fp/}{\texttt{\textbf{fp}}} et sa macro \falseverb{\FPeval}\footnote{À ce propos, les notations infixe ou postfixe sont acceptées par {\ttfamily\string\FPeval} ce qui signifie que les formules dans \ST peuvent être indifféremment sous forme infixe ou postfixe. Par exemple, la formule infixe «\falseverb{a1+b1}» est équivalente aux formules postfixes «\falseverb{a1 b1 add}» ou «\falseverb{a1 b1 +}».}. Ce package fournit d'extraordinaires possibilités de calcul pour \TeX{} et dispose de toutes les fonctions arithmétiques, scientifiques et trigonométriques usuelles. Les calculs sont faits avec une précision de $10^{-18}$, et les 18 décimales sont affichées lorsqu'un calcul ne tombe pas juste ! Sans prendre des précautions, on peut se retrouver avec beaucoup de chiffres dans les parties décimales de certains résultats. Toute cette section est compilée avec \verbinline|\STusefp|.\STusefp

Pour se prémunir de ce problème, plusieurs solutions existent :
\begin{itemize}
	\item on peut utiliser le package \href{http://www.ctan.org/tex-archive/macros/latex/contrib/numprint/}{\texttt{\textbf{numprint}}} qui est ce qui se fait de mieux dans l'affichage des nombres;
	\item on peut demander à \fp d'arrondir un résultat avec sa fonction \verb-round(nombre,entier)- qui arrondit \verb=nombre= avec \verb=entier= chiffres après la virgule;
	\item on peut également demander à \ST d'arrondir \emph{tous} les nombres placés dans le tableau à une certaine précision avec la macro \verbinline-\STautoround- dont l'argument est le nombre de chiffres demandés après la virgule. Si l'argument est vide, aucun arrondi n'est fait. Si on utilise la macro étoilée \verbinline-\STautoround*-, la partie décimale est remplie si besoin avec des 0 inutiles (uniquement avec \fp).
\end{itemize}
Voici un exemple, des nombres de 1 à 7 et leurs inverses sont arrondis à $10^{-6}$ :\par\nobreak
\begin{lstlisting}
\STautoround{6}
\begin{spreadtab}{{tabular}{|l|*7{>{\centering\arraybackslash}m{1.35cm}|}}}
\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}\medskip

\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}\medskip

\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}

Tous les nombres contenus dans le tableau final, qu'ils aient été saisis tels quels ou qu'ils proviennent du résultat d'un calcul sont traités par la macro \verbinline-\STprintnum-. Par défaut, cette macro n'a aucun effet et est programmée de la façon suivante :
\begin{center}
	\verbinline-\newcommand\STprintnum[1]{#1}-
\end{center}
Il est possible d'arrondir tous les nombres via la commande \verbinline-\numprint- du package \verb-\numprint-. Pour ce faire, il faut redéfinir la macro \verbinline-\STprintnum- de cette façon :\par\nobreak
\begin{lstlisting}
\renewcommand\STprintnum[1]{\numprint{#1}}
\nprounddigits{6}
\begin{spreadtab}{{tabular}{cccccccc}}
@$x$   & 1 &  2 & 3  & 4  & 5  & 6  &7   \\\hline
@$1/x$ &1/b1&1/c1&1/d1&1/e1&1/f1&1/g1&1/h1
\end{spreadtab}
\end{lstlisting}
\begin{center}
\renewcommand\STprintnum[1]{\numprint{#1}}
\nprounddigits{6}
\begin{spreadtab}{{tabular}{cccccccc}}
@$x$   & 1 &  2 & 3  & 4  & 5  & 6  &7   \\\hline
@$1/x$ &1/b1&1/c1&1/d1&1/e1&1/f1&1/g1&1/h1
\end{spreadtab}
\end{center}

Voici un autre exemple similaire où l'on teste si le nombre à afficher est négatif avec la commande \verbinline-\FPifneg- du package \fp. Si tel est le cas, le nombre est affiché en rouge. La commande \verbinline-\STautoround- a été préférée à \verbinline-\nprounddigits- du package \verb-numprint- puisque cette dernière ajoute des 0 inutiles. On a également remis le point décimal par défaut puisque \verbinline-\numprint- est en charge de l'affichage des nombres.
\begin{lstlisting}
\STsetdecimalsep{.}
\renewcommand\STprintnum[1]{\FPifneg{#1}\color{red}\fi\numprint{#1}}
\STautoround{6}
\begin{spreadtab}{{tabular}{cccccccc}}
@$x$   & -1 &  2 & -3 & 4  & -5 & 6  & -7 \\\hline
@$1/x$ &1/b1&1/c1&1/d1&1/e1&1/f1&1/g1&1/h1
\end{spreadtab}
\end{lstlisting}
\begin{center}
\STsetdecimalsep{.}
\renewcommand\STprintnum[1]{\STifneg{#1}\color{red}\fi\numprint{#1}}
\STautoround{6}
\begin{spreadtab}{{tabular}{cccccccc}}
@$x$   & -1 &  2 & -3 & 4  & -5 & 6  & -7 \\\hline
@$1/x$ &1/b1&1/c1&1/d1&1/e1&1/f1&1/g1&1/h1
\end{spreadtab}
\end{center}\STusexfp

\subsection{Retours à la ligne et filets horizontaux}
Pour bien délimiter la fin d'une ligne, \ST est contraint de reconnaître les retours à la ligne et les filets horizontaux. Ce package permet d'utiliser dans le tableau l'argument optionnel de \verb-\\- de cette façon : \verb-\\[<dimension>]-.

Pour les filets horizontaux, on peut utiliser autant de fois que l'on veut:
\begin{itemize}
	\item \verb-\hline-;
	\item \verb=\cline{x-y}= où \falseverb x et \falseverb y sont les numéro des colonnes de départ et d'arrivée du filet;
	\item \verb=\hhline{<type>}= où \verb=<type>= est le type de ligne désirée (voir la documentation du package \href{http://www.ctan.org/tex-archive/macros/latex/required/tools/}{\texttt{\textbf{hhline}}}).
	\item n'importe quelle commande du package \href{http://www.ctan.org/tex-archive/macros/latex/contrib/booktabs/}{\texttt{\textbf{booktabs}}}, à savoir \verb-\toprule-, \verb-\midrule-, \verb-\bottomrule-, \verb-\cmidrule-, \verb-\addlinespace-, \verb-\morecmidrule- et \verb-\specialrule-. Tous les arguments de ces macros, optionnels ou pas sont gérés;
	\item \verbinline-\noalign- et son argument peuvent être placés après \verb-\\- et pris en compte.
\end{itemize}
Voici le triangle de Pascal inversé, et massacré pour l'exemple :\par\nobreak
\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{Afficher la valeur d'une cellule}
Pour afficher la valeur du champ numérique d'une cellule dans le champ textuel, on vient de voir qu'on pouvait sauvegarder cette valeur dans une séquence de contrôle et se servir de cette séquence de contrôle pour l'afficher ensuite. Le procédé est un peu fastidieux et détourne de ses intentions la commande \verbinline-\STsavecell- qui sert surtout à sauvegarder une valeur pour l'utiliser en dehors du tableau.

Pour afficher simplement la valeur du champ numérique d'une cellule dans un champ textuel, on peut utiliser la syntaxe \verb-<<référence>>- qui sera remplacé par la valeur numérique de la cellule \verb-référence- où la \verb-référence- peut être relativess ou absolue. Si ce qui est entre \verb-<<- et \verb->>- n'est pas une référence, alors rien n'est fait et \verb-<<texte>>- est laissé en l'état. La \verb-référence- ne doit contenir aucun espace. Si on écrit \verb-<< a1>>- alors, l'espace fait que la référence n'est pas reconnue et rien ne sera fait.

Exemple dans une cellule purement textuelle \verb-a3- :
\begin{lstlisting}
\begin{spreadtab}{{tabular}{lr}}
@Prix de vente                & 250  \\
@Prix d'achat                 & 216  \\\hline
@B\'en\'efice (<<b1>>-<<b2>>) & b1-b2
\end{spreadtab}
\end{lstlisting}
\begin{center}
\begin{spreadtab}{{tabular}{lr}}
@Prix de vente                & 250  \\
@Prix d'achat                 & 216  \\\hline
@B\'en\'efice (<<b1>>-<<b2>>) & b1-b2
\end{spreadtab}
\end{center}
Exemple dans la cellule mixte c1 :
\begin{lstlisting}
\begin{spreadtab}{{tabular}{|c|c||c|}}\hline
23 & 32 & Moyenne $= \frac{<<a1>>+<<b1>>}{2}= :={(a1+b1)/2}$\\\hline
\end{spreadtab}
\end{lstlisting}
\begin{center}
\begin{spreadtab}{{tabular}{|c|c||c|}}\hline
23 & 32 & Moyenne $= \frac{<<a1>>+<<b1>>}{2}= :={(a1+b1)/2}$\\\hline
\end{spreadtab}
\end{center}
Les caractères qui délimitent la référence valent "\verb-<<-" et "\verb->>-" par défaut. Ils peuvent être modifiés avec la commande \verbinline-\STsetdisplaymarks- dont les 2 arguments définissent le délimiteur de gauche et le délimiteur de droite. En écrivant \verbinline-\STsetdisplaymarks{|}{|}-, on devra écrire \verb-|référence|- pour provoquer l'affichage du champ numérique de la cellule \verb-référence-.

\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 «\falseverb{:=}» est nécessaire dans chaque cellule où se trouve la commande \verbinline-\multicolumn-. On comprend en effet que si ce marqueur n'existait pas, la totalite de la cellule, c'est-à-dire \verb-\multicolumn{2}{|c|}{<formule>}- serait considérée comme étant une formule.

\section{Macro-fonctions}
L'extension \falseverb{fp} fournit un nombre conséquent d'opérations et de fonctions. Malgré tout, dans le cadre d'un package comme \ST, celles-ci peuvent être insuffisantes et il est possible au programmeur averti d'écrire des macro-fonctions supplémentaires en utilisant celles fournies par \falseverb{fp}. Cette section présente les macro-fonctions pour l'instant disponibles\footnote{Bien d'autres restent à écrire ! Elles seront disponibles dans des versions futures de \ST.}. Il y aura plus de précisions sur la méthode pour programmer des macro-fonctions dans la prochaine version de ce manuel.

\subsection{Macro-fonctions mathématiques}
\subsubsection{Sommer des cellules}
La fonction «\verbinline=sum=» permet de faire la somme d'une ou plusieurs plages de cellules.

Elle s'utilise ainsi : \verbinline=sum(<plage 1>;<plage 2>;...;<plage n>)=, où une plage de cellules est :
\begin{itemize}
	\item soit une cellule isolée comme «\falseverb{a1}» ou «\falseverb{[2,1]}»;
	\item soit une zone rectangulaire délimitée par la cellule supérieure gauche et inférieure droite de cette façon : «\verb=<cellule 1>:<cellule 2>=», à condition que «\verb=<cellule 1>=» se trouve \emph{avant} «\verb=<cellule 2>=» lorsqu'on parcourt le tableau de haut en bas, de gauche à droite.\par
	Voici des exemple de plages de cellules : «\falseverb{a2:d5}», «\falseverb{[-1,-1]:[2,3]}», «\falseverb{b4:[5,1]}».
\end{itemize}
Dans les plages de cellules, les cellules vides ou ne contenant que du texte sont considérées comme contenant le nombre 0. Il en est de même pour les cellules masquée car fusionnées par \verbinline-\multicolumn-.

Les références relatives et absolues peuvent être utilisées conjointement, comme il semble bon à 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{Macro-fonction \ttfamily fact}
La macro-fonction \verbinline=fact(<nombre>)= permet de calculer la factorielle de son argument. Avec le moteur de calcul \href{https://www.ctan.org/pkg/fp}{\fp} le nombre doit être un entier compris entre 0 et 18 inclus pour éviter des débordements. Le \falseverb{<nombre>} peut aussi être une référence vers une cellule contenant un nombre entier.

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{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}
\verbinline-randint- et \verbinline-rand- renvoient un nombre aléatoire, respectivement entier entre bornes et décimal entre 0 et 1.

\paragraph{Nombres aléatoires avec le moteur \fp}
Avec ce moteur, \verbinline-randint- et \verbinline-rand- sont des \emph{macro fonctions} de \ST qui s'appuient sur la macro \verb|\FPrandom| de \fp.

À noter : la «graine» qui initialise la suite aléatoire dépend de la date ainsi que de la la minute à laquelle est faite la compilation. Les séries aléatoires données par cette fonction changeront entre deux compilations faites à des heures dont les minutes diffèrent. Si l'on veut vraiment avoir des nombres aléatoires indépendant du moment de compilation et donc reproductibles, il faut neutraliser la macro interne \verb-\ST@seed- et définir une graine pour \fp :\par\nobreak
\begin{lstlisting}[backgroundcolor=\color{ST@codebckgcolor}]
\makeatletter
\renewcommand\ST@seed{}% redefinit la macro interne
\makeatother
\FPseed=27% donne une graine (n'importe quel entier) a fp
\end{lstlisting}
La macro fonction  \verbinline-randint([<nombre1>,]<nombre2>)- renvoie une nombre \emph{entier} qui dépend des paramètres : \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}
\STusefp
\begin{spreadtab}{{tabular}{|l|cccc|}}\hline
@nombres dans [0;1]  &rand()        &rand()        &rand()        &rand()       \\
@nombres dans [-5;5] &randint(-5,5) &randint(-5,5) &randint(-5,5) &randint(-5,5)\\
@nombres dans [0;20] &randint(20)   &randint(20)   &randint(20)   &randint(20)  \\
\hline
\end{spreadtab}
\STusexfp
\end{lstlisting}
\begin{center}
\STautoround{6}
\STusefp
\begin{spreadtab}{{tabular}{|l|cccc|}}\hline
@nombres dans [0;1]  &rand()        &rand()        &rand()        &rand()       \\
@nombres dans [-5;5] &randint(-5,5) &randint(-5,5) &randint(-5,5) &randint(-5,5)\\
@nombres dans [0;20] &randint(20)   &randint(20)   &randint(20)   &randint(20)  \\
\hline
\end{spreadtab}
\STusexfp
\end{center}

\paragraph{Nombres aléatoires avec le moteur \xfp}
Avec ce moteur, \verbinline-randint- et \verbinline-rand- sont des fonctions reconnues nativement par \xfp. Un avertissement sera émis si \XeLaTeX{} est utilisé dans une version trop ancienne qui n'implémente pas les primitives de génération de nombres pseudo-aléatoires; dans ce cas, utiliser les fonctions \verbinline-randint- et \verbinline-rand- ne sera pas possible et conduira à des erreurs de compilation.

Comme le spécifie la documentation de \href{http://mirrors.ctan.org/macros/latex/contrib/l3kernel/interface3.pdf}{\texttt{\textbf{interface3}}}, la fonction \verbinline|randint(<a>,<b>)| produit un entier aléatoire entre les deux arguments, mais si \verb|<a>| est omis, \verbinline|randint(<b>)| produit un entier entre {\color{red}\bfseries1} et \verb|<b>| ce qui constitue un comportement différent de la macro fonction \verbinline-randint- de \ST utilisée avec \fp qui produit un entier entre {\color{red}\bfseries0} et \verb|<b>|.\STusexfp

\begin{lstlisting}
\STautoround{6}
\STusexfp
\begin{spreadtab}{{tabular}{|l|cccc|}}\hline
@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}
\STusexfp
\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 [1;20] &randint(20)   &randint(20)   &randint(20)   &randint(20)  \\
\hline
\end{spreadtab}
\end{center}

\subsubsection{PGCD et PPCM}
Les macros fonctions "gcd" et "lcm" permettent de calculer le Plus Grand Commun Diviseur (PGCD) et le Plus Petit Commun Multiple (PPCM) des nombres passés en arguments et séparés par des virgules :
\begin{center}
\verbinline-gcd(nombre1,nombre2,...,nombreN)-\par
\verbinline-lcm(nombre1,nombre2,...,nombreN)-
\end{center}
Exemple :
\begin{lstlisting}
\begin{spreadtab}{{tabular}{|r|r|r||c|c|}}\hline
\multicolumn3{|c||}{@Nombres}& @PGCD & @PPCM \\\hline
24 & 18 & 12 & \STcopy{v}{gcd(a2,b2,c2)} & \STcopy{v}{lcm(a2,b2,c2)}\\
15 & 10 & 25 & & \\
16 & 12 & 15 & & \\
\hline
\end{spreadtab}
\end{lstlisting}
\begin{center}
\begin{spreadtab}{{tabular}{|r|r|r||c|c|}}\hline
\multicolumn3{|c||}{@Nombres}& @PGCD & @PPCM \\\hline
24 & 18 & 12 & \STcopy{v}{gcd(a2,b2,c2)} & \STcopy{v}{lcm(a2,b2,c2)}\\
15 & 10 & 25 & & \\
16 & 12 & 15 & & \\
\hline
\end{spreadtab}
\end{center}

\subsubsection{Écriture scientifique}
La macro fonction "scitodec" permet de convertir un nombre écrit en écriture scientifique en nombre décimal. La syntaxe est \verbinline-scitodec(<texte>)-, où le \verb-<texte>- est :
\begin{enumerate}[label=--]
	\item une suite de caractères se présentant sous la syntaxe \verb-<mantisse>EE<exposant>-, où la \verb-<mantisse>- est un nombre décimal et l'\verb->exposant>- est un entier relatif. Les "E" peuvent être écrit en majuscule ou minuscule.
	
	Le nombre ainsi représenté est $\text{\ttfamily <mantisse>}\times10^{\text{\ttfamily <exposant>}}$
	\item une référence au champ \emph{textuel} d'une cellule qui doit contenir des caractères obéissants à la syntaxe vue au point précédent.
\end{enumerate}
Exemple :
\begin{lstlisting}
\begin{spreadtab}{{tabular}{|r|r|}}\hline
@Écritures scientifiques & @Écritures décimales \\\hline
@4EE2                    & \STcopy{v}{scitodec([-1,0])}\\
@-3.1EE-3                & \\
@15ee5                   & \\
@-0.025ee7               & \\
@2.125EE0                & \\
@3.1575EE-4              & \\\hline
\end{spreadtab}
\end{lstlisting}
\begin{center}
\begin{spreadtab}{{tabular}{|r|r|}}\hline
@Écritures scientifiques & @Écritures décimales \\\hline
@4EE2                    & \STcopy{v}{scitodec([-1,0])}\\
@-3.1EE-3                & \\
@15ee5                   & \\
@-0.025ee7               & \\
@2.125EE0                & \\
@3.1575EE-4              & \\\hline
\end{spreadtab}
\end{center}

Le moteur \xfp est comprend nativement les nombres écrits en notation scientifique sous la forme \verb|<a>e<b>| mais l'utilisation de cette syntaxe est \emph{impossible} à utiliser avec \ST car le nombre \verb|4e3|, qui est 4000, serait compris par \ST comme 4 suivi du contenu de la cellule \verb|e3|.

\subsubsection{Identité}
La plus simple des macros fonctions est «\verbinline=id(<nombre>)=». Celle-ci renvoie le nombre qui se trouve entre parenthèses. Mathématiquement, elle ne sert pas à grand chose, mais avec \ST, elle permet de passer des expressions mathématiques à des macros qui n'en admettent pas. On peut ainsi s'en servir dans les plages de cellules de \verbinline=sum= par exemple.

Dans le code ci dessous, la macro \verbinline=id= est utilisée pour déterminer la plage de cellules à additionner avec \verbinline-sum-. Dans cet exemple, la valeur du champ numérique de la cellule a2 vaut 8. Et donc, "\verbinline=sum([0,-1]:[id(a2-1),-1])/a2=" est équivalent à \verbinline=sum([0,-1]:[7,-1])/8= :

\begin{lstlisting}
\begin{spreadtab}{{tabular}{r*{10}c}}
                          @Entiers & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10\\
Moyenne des :={8} premiers entiers & sum([0,-1]:[id(a2-1),-1])/a2          \\
\end{spreadtab}
\end{lstlisting}
\begin{center}
\begin{spreadtab}{{tabular}{r*{10}c}}
                          @Entiers & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10\\
Moyenne des :={8} premiers entiers & sum([0,-1]:[id(a2-1),-1])/a2          \\
\end{spreadtab}
\end{center}

\subsection{Macro-fonctions de test}
Comme \fp et sa macro \verb|\FPeval| n'admet pas de test dans son argument, 3 macro-fonctions de test sont disponibles (elles sont moins intéressantes pour \xfp qui dispose de l'opérateur «\verb|?:|», voir plus bas) :\par\nobreak
\begin{center}
\verbinline=ifeq(nombre1,nombre2,nombre3,nombre4)=\par
\verbinline=ifgt(nombre1,nombre2,nombre3,nombre4=\par
\verbinline=iflt(nombre1,nombre2,nombre3,nombre4)=
\end{center}
La comparaison se fait entre \falseverb{nombre1} et \falseverb{nombre2} :
\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}
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}
$\smallskip

\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}
Le moteur \xfp et son opérateur ternaire \verb|<a>?<b>:<c>| rend les tests plus faciles dans les expressions évaluées : si le test \verb|<a>| est vrai, \verb|<b>| est retenu sinon, c'est \verb|<c>|. Ainsi, l'imbrication de tests ci-dessus se programme :

\begin{lstlisting}
\begin{spreadtab}{{tabular}{|*2c|}}\hline
@$x$       & @$f(x)$               \\\hline
-0.5       & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\\hline
\end{spreadtab}
\end{lstlisting}
\begin{center}
\begin{spreadtab}{{tabular}{|*2c|}}\hline
@$x$       & @$f(x)$               \\\hline
-0.5       & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\
[0,-1]+0.5 & [-1,0]<1 ? 10 : [-1,0]=1 ? 0 : -10\\\hline
\end{spreadtab}
\end{center}

\subsection{Macro-fonctions de date}
\subsubsection{Convertir une date en nombre avec \ttfamily frshortdatetonum}\label{datetonum}
La macro \verbinline-frshortdatetonum- permet de convertir une date de la forme 14/7/1789 en un nombre qui est en fait le nombre de jours écoulés depuis le 1\ier{} mars de l'an 0\footnote{Cet «an 0» n'existe d'ailleurs pas, mais cela ne devrait pas être gênant pour les dates contemporaines}. Il est important de noter que cette macro-fonction requiert un argument \emph{textuel} et non pas un nombre ou le résultat d'un calcul mathématique. Par conséquent, si l'argument de cette macro-fonction fait référence à une cellule, cette cellule \emph{doit} être une cellule textuelle, c'est à dire contenant «\verb-@-» ou «\verb-:={}-»

Dans l'exemple ci-dessous, les deux premières lignes montrent que la cellule de gauche contient une date, et la cellule de droite fait référence à cette date pour calculer le nombre correspondant. La troisième ligne montre dans la cellule de gauche la date 0, mais surtout calcule dans la cellule de droite le nombre correspondant à la date \emph{d'aujourd'hui}, en transformant en nombre les compteurs de \TeX{} \verbinline-\day-, \verbinline-\month- et \verbinline-\year- qui contiennent les numéros des jours, mois et année courants.\par\nobreak
\begin{lstlisting}
\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 «25 décembre 1789» en un nombre. L'argument peut aussi être la séquence de contrôle \verbinline-\today- si l'on a pris le soin de charger l'extension \verb-babel- avec l'option \verb-frenchb-.\par\nobreak
\begin{lstlisting}[escapechar=Z]
\begin{spreadtab}{{tabular}{cc}}
frlongdatetonum(\today) & frlongdatetonum(25 dZéZcembre 2009)\\
@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, le résultat de la formule sera inséré à la place de \verb-:={<formule>}-. Il en résulte que la cellule ne peut plus faire l'objet d'aucun traitement mathématique ensuite.

Voici ces fonctions :
\begin{itemize}
	\item \verbinline-numtofrshortdate- transforme un nombre en une date courte du type 14/7/1789;
	\item \verbinline-numtofrlongdate- transforme un nombre en une date longue du type «14 juillet 1789»;
	\item \verbinline-numtofrmonth- extrait d'un nombre représentant une date le nom du mois correspondant;
	\item \verbinline-numtofrday- extrait d'un nombre représentant une date le nom du jour correspondant.
\end{itemize}
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}

\subsection{Macro fonctions de coordonnées}\label{tag}
Plutôt que de faire référence à une cellule par ses coordonnées qui sont difficiles à mémoriser et qui changent si on insère une ligne ou une colonne, il est parfois bien plus pratique de donner un nom à une cellule et d'y faire référence plus loin par ce nom.

La macro fonction ``\verbinline-tag(<nom>)-'' 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 ``\verbinline-tag(<nom>)-'' \emph{n'importe où} dans le champ numérique d'une cellule. Le  \verb-<nom>- 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 à une cellule, et serait donc modifié lors d'une opération de copie avec \verbinline-\STcopy-. Cette macro fonction a une action supplémentaire, elle sauvegarde via un \verbinline-\def- la valeur numérique de la cellule dans laquelle elle se trouve de façon à pouvoir y faire appel plus tard \emph{en dehors du tableau} via la commande purement développable \verbinline-\STtag{<nom>}-.

Par la suite dans le tableau, au lieu de mettre les coordonnées de la cellule \verb-<nom>-, on peut écrire ``\verbinline-cell(<nom>)-'' qui est une macro fonction qui renvoit les coordonnées de la cellule précédemment nommée. Par exemple si ``\verbinline-tag(<nom>)-'' a été écrit dans la cellule ``\verb-B3-'' si on a écrit plus loin ``cell(<nom>)'', 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 \verbinline-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'' :

\begin{minipage}{0.6\linewidth}
\begin{lstlisting}
\begin{spreadtab}{{tabular}{r@{}r}}
   & 15tag(foo)              \\
@+ & 37                      \\
@+ & 13                      \\
@+ & 48                      \\
@+ & 1tag(bar)9              \\\cline{2-2}
   & sum(cell(foo):cell(bar))tag(baz)
\end{spreadtab}

foo=\STtag{foo}, bar=\STtag{bar}, baz=\STtag{baz}
\end{lstlisting}
\end{minipage}\kern6pt%
\begin{minipage}{0.3\linewidth}
\begin{spreadtab}{{tabular}{r@{}r}}
   & 15tag(foo)              \\
@+ & 37                      \\
@+ & 13                      \\
@+ & 48                      \\
@+ & 1tag(bar)9              \\\cline{2-2}
   & sum(cell(foo):cell(bar))tag(baz)
\end{spreadtab}

foo=\STtag{foo}, bar=\STtag{bar}, baz=\STtag{baz}
\end{minipage}

Pour transmettre des valeurs entre tableaux calculés par \ST\footnote{Comme on l'avait demandé sur \href{https://tex.stackexchange.com/questions/210881}{\texttt{\textbf{tex.stackexchange}}}}, il est possible de taguer la cellule dans le premier tableau à l'aide de la macro fonction \verbinline|tag(<nom>)|, puis dans le 2\ieme{} tableau, de faire appel à la valeur \emph{via} tagguée par \verbinline|valtag(<nom>)|

\begin{minipage}{.6\linewidth}
\begin{lstlisting}
\begin{spreadtab}{{tabular}{cc}}
	100 & a1+1tag{abcd}
\end{spreadtab}

\begin{spreadtab}{{tabular}{c}}
	value{abcd}
\end{spreadtab}
\end{lstlisting}
\end{minipage}\kern6pt
\begin{minipage}{.3\linewidth}
\begin{spreadtab}{{tabular}{cc}}
	100 & a1+1tag(abcd)
\end{spreadtab}

\begin{spreadtab}{{tabular}{c}}
	value(abcd)
\end{spreadtab}
\end{minipage}

Lorsque l'environnement \ST se trouve inclus dans un autre environnement, les affectations faites par la macro fonction \verb-tag- restent \emph{locales} à cet environnement et ne pourraient pas être accessibles en dehors de cet environnement via \verbinline-\STtag-. Dans l'exemple ci-dessous, le tableau fait par \ST est dans un environnement \verb-center- et l'on doit donc utiliser \verbinline-\STmakegtag{<nom>}- pour rendre global la sauvegarde de la valeur numérique contenus dans la cellule marquée par ``tag{<nom>}'' :

\begin{minipage}{.6\linewidth}
\begin{lstlisting}
\begin{center}
  \begin{spreadtab}{{tabular}{cccc}}\hline
    6&9&17&21\\\hline
    \multicolumn{4}{c}{moyenne = :={sum(a1:d1)/4tag(moy)}}
  \end{spreadtab}
  \STmakegtag{moy}
\end{center}
La moyenne est de \STtag{moy}.
\end{lstlisting}
\end{minipage}\kern6pt
\begin{minipage}{.3\linewidth}
\begin{center}
  \begin{spreadtab}{{tabular}{cccc}}\hline
    6&9&17&21\\\hline
    \multicolumn{4}{c}{moyenne = :={sum(a1:d1)/4tag(moy)}}
  \end{spreadtab}
  \STmakegtag{moy}
\end{center}
La moyenne est de \STtag{moy}.
\end{minipage}

L'argument de \verbinline-\STmakegtag- peut êre constitué de plusieurs noms séparés par des virgules.

Bien qu'elles soient à première vue moins utiles, \ST fournit également les macros fonctions ``\verbinline-row(<nom>)-'' et ``\verbinline-col(<nom>)-'' qui renvoient le numéro de la ligne ou de la colonne où se trouvait \verbinline-tag(<nom>)-. Voici par exemple une façon de dénombrer des valeurs pour en calculer la moyenne : on nomme ``un'' la première valeur et ``der'' la dernière, et le nombre de valeurs est donc row(der)-row(un)+1 :

\begin{minipage}{0.6\linewidth}
\begin{lstlisting}
moyenne = \begin{spreadtab}{{tabular}[b]{r}}
7tag(un)\\9\\15\\6\\20\\13\\11\\55tag(der)\\
\hline
sum(cell(un):cell(der))/(row(der)-row(un)+1)
\end{spreadtab}
\end{lstlisting}
\end{minipage}\hfill
\begin{minipage}{0.35\linewidth}
moyenne = \begin{spreadtab}{{tabular}[b]{r}}
7tag(un)\\9\\15\\6\\20\\13\\11\\55tag(der)\\
\hline
sum(cell(un):cell(der))/(row(der)-row(un)+1)
\end{spreadtab}
\end{minipage}

\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 Fibonacci :\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{doit} 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 «\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-&-» après le \verbinline-\multicolumn- (pour l'exemple, il en faudrait 1).
	\item les références des colonnes des cellules qui suivent le \verbinline-\multicolumn- seront décalées de $x$ lettres vers le début de l'alphabet. Pour l'exemple donnée, si on veut faire référence à la cellule marquée «\falseverb{i2}», il faudra écrire \falseverb{g2} (au lieu de \falseverb{i2}).
\end{itemize}
Voici un vrai exemple dont la structure est similaire au précédent : $x=2$ et $y=1$. Dans le code, remarquer le «\textcolor{red}{\texttt{\&}}» qui a été ajouté puisque $y=1$. Par ailleurs, on reste simple avec les formules, on ajoute 1 au nombre du dessus :\par\nobreak
\begin{lstlisting}[escapechar=Z]
\begin{spreadtab}{{tabular}{|*{7}{c|}}}
\hline
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ù $x=1$ et $y=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 :
\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}

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.

\subsection{Débogage}
Pour faciliter l'utilisation de \ST, un mode de débogage est disponible. Il est activé lorsque la commande \verbinline-\STdebug- est présente dans l'argument optionnel de l'environnement \verb-spreadtab-. Cette commande change le comportement de \ST qui, au lieu d'afficher le tableau final, affiche un (ou plusieurs) tableau de débogage. Cet affichage se fait juste après que \ST ait lu l'ensemble de toutes les cellules ; aucun calcul de formule n'a encore eu lieu. Il y a autant de tableaux affichés que de commande \verbinline-\STdebug- présentes, sous réserve que leur argument soit différent. Seuls 3 arguments sont possibles, et voici ce qu'il permettent :
\begin{itemize}
	\item \verbinline-\STdebug{formula}- : affichage des champs numériques de toutes les cellules et les fins de ligne;
	\item \verbinline-\STdebug{text}- : affichage des champs textuels de toutes les cellules;
	\item \verbinline-\STdebug{code}- : affichage du code interne que \ST affecte à chaque cellule. Ce code interne est assigné à chaque cellule lors de la lecture du tableau. Il vaut :
	\begin{enumerate}[label=\small\textbullet]
		\item $-1$ s'il s'agit d'une cellule fusionnée par une commande \verbinline-\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 à évaluer plus tard;
		\item 2 si la champ numérique de la cellule contient un nombre.
	\end{enumerate}
\end{itemize}

Lorsque le mode débogage est activé, le tableau final \emph{n'est pas affiché}. Il est cependant possible de forcer cet affichage en mettant la commande \verbinline-\STdisplaytab- dans l'argument optionnel.

Voici un tableau sur lequel s'appuiera l'exemple suivant :

\begin{lstlisting}
\begin{spreadtab}{{tabular}{|r|r|r|}}\hline
@$x$              &@$y$                & @$x+y$\\\hline\hline
22                & 54                 & \STcopy{v3}{a2+b2} \\
43                & 65                 & \\
49                & 37                 & \\\hline
$Sx=:={a2+a3+a4}$ & $Sy=:={b2+b3+b4}$  & $Sx+Sy=:={}$\\\hline
\multicolumn2{|r|}{$Sy-Sx=:={b5-a5}$}  & @\multicolumn1c{}\\\cline{1-2}
\end{spreadtab}
\end{lstlisting}
\begin{center}
\begin{spreadtab}{{tabular}{|r|r|r|}}\hline
@$x$              &@$y$                & @$x+y$\\\hline\hline
22                & 54                 & \STcopy{v3}{a2+b2} \\
43                & 65                 & \\
49                & 37                 & \\\hline
$Sx=:={a2+a3+a4}$ & $Sy=:={b2+b3+b4}$  & $Sx+Sy=:={}$\\\hline
\multicolumn2{|r|}{$Sy-Sx=:={b5-a5}$}  & @\multicolumn1c{}\\\cline{1-2}
\end{spreadtab}
\end{center}
On va demander à ce que \ST affiche les 3 tableaux de débogage possibles concernant le tableau ci-dessus. Pour cela, il suffit de modifier la ligne 1 du code ci-dessus comme ceci :

\hfill\verbinline[basicstyle=\ttfamily\small]-\begin{spreadtab}[\STdebug{text}\STdebug{formula}\STdebug{code}]{{tabular}{|rr|r|}}\hline-\hfill\kern0pt
\begin{center}
\begin{spreadtab}[\STdebug{text}\STdebug{formula}\STdebug{code}]{{tabular}{|rr|r|}}\hline
@$x$              &@$y$                & @$x+y$\\\hline\hline
22                & 54                 & \STcopy{v3}{a2+b2} \\
43                & 65                 & \\
49                & 37                 & \\\hline
$Sx=:={a2+a3+a4}$ & $Sy=:={b2+b3+b4}$  & $Sx+Sy=:={}$\\\hline
\multicolumn2{|r|}{$Sy-Sx=:={b5-a5}$}  & @\multicolumn1c{}\\\cline{1-2}
\end{spreadtab}
\end{center}
Ces 3 tableaux de débogage peuvent aider à comprendre un peu mieux le fonctionnement interne de \ST. On peut observer dans le tableau 2 que toutes les cellules ayant un champ numérique ont un code interne de 1 ou 2 (voir tableau 3) et ont un marqueur de champ numérique "\verb-:=-" qui leur est associé (voir tableau 1). Ce marqueur représente l'endroit où sera inséré ---~par substitution~--- le résultat du calcul du champ numérique. C'est donc à partir des contenus des champs textuels du tableau 1 et par simple substitution, qu'une fois les champs numériques calculés, les cellules sont reconstituées pour donner celles du tableau final.

Dans les tableaux ci-dessus, les cellules contenant les coordonnées ne sont grisées que si le package \href{http://www.ctan.org/tex-archive/macros/latex/contrib/colortbl/}{\texttt{\textbf{colortbl}}} a été chargé.

\section{Exemples}
Voici quelques tableaux pour finir !

Afin que l'on sache quels nombres sont calculés, seuls les nombres non calculés sont en \textcolor{red}{rouge}. Dans ces tableaux, beaucoup d'artifices (des struts, des multicolumn) et des packages (notamment numprint et ses colonnes «N» qui alignent les séparateurs décimaux) ont été utilisés pour obtenir un résultat satisfaisant. Le code est parfois lourd et peu lisible, mais il ne s'agit pas ici d'exemples basiques mais de tableaux peaufinés !

\subsection{Encore un triangle de Pascal}
\begin{lstlisting}
\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{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}
\renewcommand\STprintnum[1]{\numprint{#1}}
\begin{spreadtab}{{tabular}{cc}}
\multicolumn{2}{c}{Convergence en $x=\color{red}:={0.5}$}\\[1.5ex]
@$n$            & e^a1\SThidecol                & @ $\displaystyle e^{\numprint{<<a1>>}}-\sum_{k=0}^n\frac{\numprint{<<a1>>}^k}{k!}$\\[3ex]\hline
\color{red}:={0}& a1^[-1,0]/fact([-1,0])        & \STcopy{v}{b!2-b3}\\
\STcopy{v}{a3+1}& \STcopy{v}{a!1^a4/fact(a4)+b3}&                   \\
                &                               &                   \\
                &                               &                   \\
                &                               &                   \\
                &                               &                   \\
                &                               &                   \\
                &                               &                   \\
                &                               &                   \\
                &                               &                   \\\hline
\end{spreadtab}
\end{lstlisting}
\begin{center}
\STautoround{15}
\renewcommand\STprintnum[1]{\numprint{#1}}
\begin{spreadtab}{{tabular}{cc}}
\multicolumn{2}{c}{Convergence en $x=\color{red}:={0.5}$}\\[1.5ex]
@$n$            & exp(a1)\SThidecol             & @ $\displaystyle e^{\numprint{<<a1>>}}-\sum_{k=0}^n\frac{\numprint{<<a1>>}^k}{k!}$\\[3ex]\hline
\color{red}:={0}& a1^[-1,0]/fact([-1,0])        & \STcopy{v}{b!2-b3}\\
\STcopy{v}{a3+1}& \STcopy{v}{a!1^a4/fact(a4)+b3}&                   \\
                &                               &                   \\
                &                               &                   \\
                &                               &                   \\
                &                               &                   \\
                &                               &                   \\
                &                               &                   \\
                &                               &                   \\
                &                               &                   \\\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}{{array}{ccN39N{3}{9}}}
@n               & @F_n              & @\hfill{\dfrac{F_n}{F_{n-1}}}\hfill\null& @\hfill{\varphi-\dfrac{F_n}{F_{n-1}}}\hfill\null\\[2ex]\hline
\color{red}:=1   & \color{red}:=1    &                   &                      \\
\STcopy{v}{a2+1} & \color{red}:=1    & \STcopy{v}{b3/b2} & (1+5^0.5)/2-[-1,0]   \\
                 & \STcopy{v}{b2+b3} &                   & \STcopy{v}{d!3+1-c4} \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\\hline
\end{spreadtab}$
\end{lstlisting}
\begin{center}
\STautoround{9}
$\begin{spreadtab}{{array}{ccN39N{3}{9}}}
@n               & @F_n              & @\hfill{\dfrac{F_n}{F_{n-1}}}\hfill\null& @\hfill{\varphi-\dfrac{F_n}{F_{n-1}}}\hfill\null\\[2ex]\hline
\color{red}:=1   & \color{red}:=1    &                   &                      \\
\STcopy{v}{a2+1} & \color{red}:=1    & \STcopy{v}{b3/b2} & (1+5^0.5)/2-[-1,0]   \\
                 & \STcopy{v}{b2+b3} &                   & \STcopy{v}{d!3+1-c4} \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\
                 &                   &                   &                      \\\hline
\end{spreadtab}$
\end{center}

\subsection{Tableau de facturation}
Voici un tableau de facturation, où les séparateurs décimaux sont alignés dans les colonnes grâce au spécificateur de colonne «N» du package \falseverb{numprint}.

Ce tableau est généré par l'environnement \verb=tabularx= de façon à occuper 80\% de la largeur de la ligne. La commande \verbinline=\multicolumn= a été largement utilisée pour la mise en forme :\par\nobreak
\begin{lstlisting}
\nprounddigits2
\let\PC\%
\newcommand\Mystrut{\rule[-1.2ex]{0pt}{4ex}}
\newcommand\RED{\color{red}}
\begin{spreadtab}{{tabularx}{0.8\linewidth}{|>\Mystrut X>\RED N42>\RED c N42>\RED c<\PC N42|}}
\hline
@D\'esignation &@\multicolumn1c{Prix U}& @\multicolumn1c{Qt\'e} & @\multicolumn1c{Prix} & @\multicolumn1c{R\'eduction} & @\textbf{\`A payer}\\\hline
@Item 1 & 5.99 & 20 & [-2,0]*[-1,0] & $-:={20}$ & [-2,0]*(1-[-1,0]/100)\\
@Item 2 & 12   & 7  & [-2,0]*[-1,0] & $-:={10}$ & [-2,0]*(1-[-1,0]/100)\\
@Item 3 & 4.50 & 40 & [-2,0]*[-1,0] & $-:={35}$ & [-2,0]*(1-[-1,0]/100)\\
@Item 4 & 650  & 2  & [-2,0]*[-1,0] & $-:={15}$ & [-2,0]*(1-[-1,0]/100)\\\hline
@\multicolumn6c{}\\[-1.5ex]\cline{4-6}% ligne vide et on remonte un peu !
@\multicolumn1c{\Mystrut}&@\multicolumn2{r|}{\textbf{Total}}& sum(d2:[0,-2]) & \multicolumn1c{$:={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\%
\newcommand\Mystrut{\rule[-1.2ex]{0pt}{4ex}}
\newcommand\RED{\color{red}}
\begin{spreadtab}{{tabularx}{0.8\linewidth}{|>\Mystrut X>\RED N42>\RED c N42>\RED c<\PC N42|}}
\hline
@D\'esignation &@\multicolumn1c{Prix U}& @\multicolumn1c{Qt\'e} & @\multicolumn1c{Prix} & @\multicolumn1c{R\'eduction} & @\textbf{\`A payer}\\\hline
@Item 1 & 5.99 & 20 & [-2,0]*[-1,0] & $-:={20}$ & [-2,0]*(1-[-1,0]/100)\\
@Item 2 & 12   & 7  & [-2,0]*[-1,0] & $-:={10}$ & [-2,0]*(1-[-1,0]/100)\\
@Item 3 & 4.50 & 40 & [-2,0]*[-1,0] & $-:={35}$ & [-2,0]*(1-[-1,0]/100)\\
@Item 4 & 650  & 2  & [-2,0]*[-1,0] & $-:={15}$ & [-2,0]*(1-[-1,0]/100)\\\hline
@\multicolumn6c{}\\\cline{4-6}% ligne vide et on remonte un peu !
@\multicolumn1c{\Mystrut}&@\multicolumn2{r|}{\textbf{Total}}& sum(d2:[0,-2]) & \multicolumn1c{$:={round(([1,0]/[-1,0]-1)*100,0)}\PC$} & {\fontseries{b}\selectfont}:={sum(f2:[0,-2])}\\
\cline{4-6}
\end{spreadtab}
\end{center}

\subsection{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{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

Je vous remercie d'avance de me signaler par \href{mailto:unbonpetit@netc.fr}{\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}