summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/tablvar/tablvar.dtx
blob: 28e8f1ead0f4a8942af9ac616f6e9e93c1163913 (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
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
% \iffalse meta-comment
%
% Copyright (C) 2018-2019 by Antoine Missier <antoine.missier@ac-toulouse.fr>
%
% This file may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, either version 1.3 of this license
% or (at your option) any later version.  The latest version of this
% license is in:
%
%   http://www.latex-project.org/lppl.txt
%
% and version 1.3 or later is part of all distributions of LaTeX version
% 2005/12/01 or later.
% To get the index compile with
% makeindex -s gind.ist -o tablvar.ind tablvar.idx
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{tablvar.dtx}
%</driver>
%<*package> 
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{tablvar}   
    [2019/07/01 v1.2 .dtx tablvar file]
%</package>
%<*driver>
\documentclass{ltxdoc}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{lmodern}
\usepackage{tablvar}
\usepackage[Symbol]{upgreek}
\renewcommand\pi{\uppi}
\newcommand*\dfrac[2]{{\displaystyle\frac{#1}{#2}}}
\DisableCrossrefs         
%\CodelineIndex
%\RecordChanges
\usepackage{hyperref}
\hypersetup{%
    colorlinks, 
    linkcolor=blue,
    pdftitle={tablvar}, 
    pdfsubject={LaTeX package}, 
    pdfauthor={Antoine Missier}
}
\newcommand\tikz{{\fontfamily{cmr}Ti{\em k}Z}}
\begin{document}
  \DocInput{tablvar.dtx}
  %\PrintChanges
  %\PrintIndex
\end{document}
%</driver>
% \fi
%
% \CheckSum{2825}
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
% \changes{v0.1}{05/01/2014}{Version initiale personnelle}
% \changes{v0.2}{11/11/2014}{Ajout de l'option tikz}
% \changes{v0.3}{07/12/2014}{Ajout de l'environnement tablvar*}
% \changes{v1.0}{11/11/2018}{Première version publiée, création de fichiers dtx et ins}
% \changes{v1.0}{11/11/2018}{nouvelle marcro bblim, 
% changements dans les macros barre et Zih}
% \changes{v1.1}{12/04/2019}{Reprise README.md, tvloop -> varloop}
% \changes{v1.2}{05/05/2019}{Modifications mineures dans la documentation}
% \changes{v1.2}{02/06/2019}{Augmentation du facteur arraystretch par défaut de 1.2 à 1.4}
%
% \GetFileInfo{tablvar.sty}
% 
% \title{L'extension \textsf{tablvar}\thanks{Ce document
%     correspond à \textsf{tablvar}~\fileversion, dernière modification le 01/07/2019.}}
% \author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}}
% \date{1\ier\ juillet 2019}
% \maketitle
% \tableofcontents
%
% \section{Introduction}
%
% Cette extension permet de construire des tableaux de variation (et de signes)
% de manière simple et intuitive.
% Bien que plusieurs autres extensions soient déjà dédiées à cette tâche
% \footnote{Mentionnons \textsf{tabvar} de Daniel Flipo et 
% \textsf{variations} de Christian Obrecht ou, plus complexes, 
% \textsf{tablor} de Guillaume Connan et \textsf{tkz-tab} de Alain Matthes.}, 
% nous avons voulu produire des tableaux de manière automatisée, 
% y compris pour des tableaux complexes,  
% mais avec de nombreuses possibilités de réglages et d'ajustements personnels
% et une haute qualité graphique, en particulier pour le dessin des flèches,
% en exploitant les fonctionnalités des extensions graphiques PSTricks 
% (plus exactement \textsf{pst-node}) ou \tikz\ pour 
% définir un \emph{graphe} de \emph{nœuds} reliés par des flèches,
% venant se \og superposer \fg{} au tableau lui-même.
%
% Le parti pris ici est d'utiliser la même syntaxe que les environnements 
% |array| (ou |tabular|) en laissant à \LaTeX\ le soin de faire 
% la composition du tableau et à l'extension graphique
% (PSTricks ou \tikz) celui
% de réaliser le dessin des flèches, automatisé et sans intervention de l'utilisateur.
% On a simplement besoin de préciser, à l'intérieur d'une commande |\variations|,
% ce qui est en haut et ce qui est en bas.
%
% L'extension possède deux options utilisées pour le tracé automatique des flèches : 
% |pstricks| (par défaut) ou |tikz| (|\usepackage[tikz]{tablvar}|).
% Pour l'option |pstricks|, il faut compiler avec \texttt{LaTeX + dvips + ps2pdf} ; 
% pour l'option |tikz|, il faut compiler DEUX fois avec \texttt{pdfLaTeX} 
% (la première fois les flèches ne sont pas correctement dessinées).
% Si on veut compiler avec l'option |pstricks| après avoir compilé avec |tikz|, 
% il faut supprimer le fichier |.aux|, sinon la compilation plante.
%
% Cette documentation donne une galerie d'exemples et décrit les commandes 
% fournies.
%
% \section{Utilisation}
%
% \subsection{Tableaux de variations simples}
%
% Un tableau de variation (ou de signes) se définit par un environnement |tablvar|
% qui \emph{doit être en mode mathématiques} (comme |array|).
%
% Voici un premier tableau tout simple avec les commandes 
% \DescribeMacro{\haut} \DescribeMacro{\bas} \DescribeMacro{\mil}
% de positionnement naïves |\haut|, |\bas| et |\mil| (milieu).
% 
%\[ 
%\begin{tablvar}{4}
%    \hline
%    x & -5 && -1 && 2 && 3 && 5 \\
%    \hline
%    f'(x) & & + & 0 & - & 0 & + & 0 & - & \\
%    \hline
%    \variations{ \mil{f(x)} & \bas{0} && \haut{2} && \bas{1} && 
%        \haut{4} && \bas{-3} }
%    \hline
%\end{tablvar}
%\]
% \begin{verbatim}
%\[
%\begin{tablvar}{4}
%    \hline
%    x & -5 && -1 && 2 && 3 && 5 \\
%    \hline
%    f'(x) & & + & 0 & - & 0 & + & 0 & - & \\
%    \hline
%    \variations{ \mil{f(x)} & \bas{0} && \haut{2} && \bas{1} && 
%        \haut{4} && \bas{-3} }
%    \hline
%\end{tablvar}
%\]
% \end{verbatim}
%
% \vspace{-3ex}
% \DescribeEnv{tablvar}
% L'argument obligatoire de l'environnement |tablvar| correspond au nombre 
% d'intervalles du tableau c'est-à-dire aussi au nombre de flèches (ici 4).
% Les délimiteurs |&| correspondent aux changements de colonnes 
% comme pour l'environnement |array|.
% Outre la 1ère colonne de légendes, il y a deux types de colonnes :
% des colonnes de \emph{valeurs}, de largeur variable en fonction de leur contenu et centrées,
% et des colonnes \emph{intervalles} de largeur fixe (|2.5em| par défaut).
%
% \DescribeEnv{tablvar\oarg{largeur}}
% L'environnement |tablvar| possède un paramètre optionnel pour modifier la
% largeur des colonnes intervalles.
% Voici un exemple avec un seul intervalle utilisant l'argument optionnel |4em|
% pour allonger la largeur de l'intervalle qui sinon apparaîtrait très étroit.
%
% \noindent
% \begin{minipage}[t]{8cm}
% \begin{verbatim}
%\[
%\begin{tablvar}[4em]{1}
%    \hline
%    x & -5 && +\infty \\
%    \hline
%    \variations{\mil{f(x)} & \haut{2} && 
%        \bas{-1} }
%    \hline
%\end{tablvar}
%\]
% \end{verbatim}
% \end{minipage}
% \begin{minipage}[t]{4.7cm}
%\[
%\begin{tablvar}[4em]{1}
%    \hline
%    x & -5 && +\infty \\
%    \hline
%    \variations{\mil{f(x)} & \haut{2} && \bas{-1}}
%    \hline
%\end{tablvar}
%\]
% \end{minipage}
%
% \DescribeMacro{\pos}
% Les commandes |\haut| et |\bas| ne sont en fait que des alias d'une commande
% plus générale qui est \cmd{\pos}\oarg{opt}\marg{ligne}\marg{valeur}. Celle-ci place
% la \meta{valeur} sur la \meta{ligne} indiquée en créant un nœud pour les flèches.
% La ligne des $x$ et les lignes contenant dérivée
% ou tableau de signe ont pour indice 0.
% La partie variations contient par défaut 3 lignes numérotées 1, 2, 3
% \emph{du haut vers le bas} (dans le sens de l'écriture 
% et de la construction du tableau). 
% Le paramètre optionnel \meta{opt} 
% \footnote{Ce paramètre optionnel n'est pas implémenté et est sans effet pour l'option |tikz|.}
% permet d'ajuster le positionnement des flèches : 
% |c| (centered, par défaut), |b| (bottom) ou |t| (top).
% Comparer le positionnement des flèches dans les deux exemples suivants. 
%
% \DescribeMacro{\variations}
% C'est la commande |\variations| qui, une fois les nœuds définis,
% construit ensuite automatiquement les flèches.
%
% La commande |\mil|, utilisée pour la première colonne contenant $f(x)$,
% \DescribeMacro{\pos*} 
% est un alias reposant sur la commande plus générale \cmd{\pos*}\marg{ligne}\marg{valeur}
% qui se comporte comme |\pos| mais ne crée pas de nœud pour les flèches.\\
% \enlargethispage{1ex}
% \begin{minipage}[t]{7.4cm}
% \begin{verbatim}
%\begin{tablvar}{2}
%    \hline
%    x & 0 & & \frac12 & & 1 \\
%    \hline
%    f'(x) & & + & 0 & - & \\
%    \hline
%    \variations{\mil{f(x)} & \bas{2} &&
%        \haut{f(\frac12)} && \bas{0}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
% \end{minipage}
% \begin{minipage}[t]{5.2cm}
%\[ 
%\begin{tablvar}{2}
%    \hline
%    x & 0 & & \frac12 & & 1 \\
%    \hline
%    f'(x) & & + & 0 & - & \\
%    \hline
%    \variations{\mil{f(x)} & \bas{2} &&
%        \haut{f(\frac12)} && \bas{0}
%    }
%    \hline
%\end{tablvar}
%\]
% \end{minipage}
% \\
% Le même tableau avec les commandes |\pos| 
% et |\pos*| et l'option |t| pour le max.\\[-1ex]
% \begin{minipage}[t]{7.4cm}
% \begin{verbatim}
%\begin{tablvar}{2}
%    \hline
%    x & 0 & & \frac12 & & 1 \\
%    \hline
%    f'(x) & & + & 0 & - & \\
%    \hline
%    \variations{\pos*{2}{f(x)} & \pos{3}{2} &
%        &\pos[t]{1}{f(\frac12)} && \pos{3}{0}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
% \end{minipage}
% \begin{minipage}[t]{5.2cm}
%\[
%\begin{tablvar}{2}
%    \hline
%    x & 0 & & \frac12 & & 1 \\
%    \hline
%    f'(x) & & + & 0 & - & \\
%    \hline
%    \variations{\pos*{2}{f(x)} & \pos{3}{2} &
%        &\pos[t]{1}{f(\frac12)} && \pos{3}{0}
%    }
%    \hline
%\end{tablvar}
%\]
% \end{minipage}
%
% \DescribeMacro{\fleche}
% On peut modifier l'aspect des flèches en redéfinissant la macro |\fleche|
% grâce aux nombreuses options offertes par PSTricks ou \tikz. 
% Cette redéfinition sera locale si on la place dans l'environnement math du tableau.
% Ci-dessous des flèches plus fines, plus proches des nœuds et dont la pointe est
% plus effilée (codé ici pour pstricks uniquement).
%\[
%\ifthenelse{\boolean{tikz}}{}{
%     \renewcommand{\fleche}{\ncline[linewidth=0.3pt,arrowsize=2pt 3,
%            arrowinset=0.5,nodesep=1.5pt]{->}}
%    }
%\begin{tablvar}{4}
%    \hline
%    x & -5 && 0 && 2 && 3 && 5 \\
%    \hline
%    \variations{ \pos*{2}{f(x)} & \pos{3}{-4} && \pos{2}{1} && \pos{2}{1} 
%        && \pos{1}{4} && \pos{3}{0}
%    }
%    \hline
%\end{tablvar}
%\]
% Pour placer des nœuds de flèche au milieu, on doit utiliser |\pos{2}| et non |\mil|.
% \begin{verbatim}
%\[
% \renewcommand{\fleche}{\ncline[linewidth=0.3pt,arrowsize=2pt 3,
%    arrowinset=0.5,nodesep=1.5pt]{->}}
%\begin{tablvar}{4}
%    \hline
%    x & -5 && 0 && 2 && 3 && 5 \\
%    \hline
%    \variations{ \pos*{2}{f(x)} & \pos{3}{-4} && \pos{2}{1} && \pos{2}{1} 
%        && \pos{1}{4} && \pos{3}{0}
%    }
%    \hline
%\end{tablvar}
%\]
% \end{verbatim}
%
% \subsection{Tableaux de signes avec barres de séparation}
%
% \DescribeMacro{\barre}
% La macro |\barre|, présentée dans l'exemple ci-dessous, sert de séparateur 
% de colonne dans les tableaux de signe. Elle est bien sûr 
% facultative de même que la partie variations.
% Ici $f(x)=-4x^3+3x^2+18x-3$ et $f'(x)=6(x+1)(-2x+3)$.
%\[
%\begin{tablvar}{3}
%    \hline
%    x & -\infty && \makebox[2.5em]{$-1$} && 
%        \makebox[2.5em]{$\frac{3}{2}$} && +\infty \\
%    \hline
%    x+1 & & - & \barre[0] & + & \barre & + & \\
%    \hline
%    -2x+3 & & + & \barre & + & \barre[0] & - & \\
%    \hline
%    \mbox{Signe de }f'(x) & & - & \barre[0] & + & \barre[0] & - & \\
%    \hline
%    \variations{ \mil{\mbox{Variations de }f} & \haut{+\infty} &&
%        \bas{-14} && \haut{\frac{69}{4}} && \bas{-\infty}
%    }
%    \hline
%\end{tablvar}
%\]
% Les bornes des intervalles ont été placées
% dans des |\makebox|\oarg{largeur}|{$ $}|,
% sur la ligne des $x$, pour que les colonnes 
% soient plus équilibrées (ceci est affaire de goût).
% \begin{verbatim}
%\begin{tablvar}{3}
%    \hline
%    x & -\infty && \makebox[2.5em]{$-1$} && 
%        \makebox[2.5em]{$\frac{3}{2}$} && +\infty \\
%    \hline
%    x+1 & & - & \barre[0] & + & \barre & + & \\
%    \hline
%    -2x+3 & & + & \barre & + & \barre[0] & - & \\
%    \hline
%    \mbox{Signe de }f'(x) & & - & \barre[0] & + & \barre[0] & - & \\
%    \hline
%    \variations{ \mil{\mbox{Variations de }f} & \haut{+\infty} &&
%        \bas{-14} && \haut{\frac{69}{4}} && \bas{-\infty}
%    }
%    \hline
%\end{tablvar}
%\end{verbatim}
%
% \subsection{Doubles barres et discontinuités}
%
% Une double barre s'obtient avec la commande |\bb|. \DescribeMacro{\bb}
% Pour ne pas tracer de flèche entre deux nœuds (en particulier pour éviter
% de traverser une double barre), on place la
% commande |\discont| entre les deux. \DescribeMacro{\discont}
%\[
%\begin{tablvar}{2}
%    \hline
%    x & -\infty && 0 && +\infty \\
%    \hline
%    -\frac{1}{x} & & + & \bb & - & \\
%    \hline
%    \variations{ \mil{\dfrac{1}{x^2}} & \bas{0} && \haut{+\infty} \bb
%        \discont \haut{+\infty} && \bas{0}
%    }
%    \hline
%\end{tablvar}
%\]
% La commande |\dfrac| provient de l'extension \textsf{amsmath} ou peut être redéfinie
% par |\newcommand*\dfrac[2]{{\displaystyle\frac{#1}{#2}}}|.
%
% \smallskip
% \begin{verbatim}
%\begin{tablvar}{2}
%    \hline
%    x & -\infty && 0 && +\infty \\
%    \hline
%    -\frac{1}{x} & & + & \bb & - & \\
%    \hline
%    \variations{ \mil{\dfrac{1}{x^2}} & \bas{0} && \haut{+\infty} \bb
%        \discont \haut{+\infty} && \bas{0}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% \vspace{-1ex}
% La syntaxe ci-dessus pose problème lorsque les limites à gauche et à droite 
% d'une valeur interdite se trouvent sur des lignes différentes,
% ou que leur contenu n'a pas la même largeur, 
% car alors la double barre ne serait plus au centre de sa colonne
% et se trouverait décalée d'une ligne à l'autre.
%
% Une première solution est d'interrompre la double barre pour placer
% les limites qui resteront alors centrées au milieu de la colonne (mais il faut aimer).
%\[
%\begin{tablvar}[3em]{4}
%    \hline
%    x & -\infty && -1 && 0 && 1 && +\infty \\
%    \hline
%    \variations{\mil{\dfrac{1}{1-x^2}} & \haut{0} &&
%        \bas{-\infty}\mil{\bb}\discont\haut{+\infty} && \bas{1} &&
%        \haut{+\infty}\mil{\bb}\discont\bas{-\infty} && \haut{0}
%    }
%    \hline
%\end{tablvar}
%\]
% \begin{verbatim}
%\begin{tablvar}[3em]{4}
%    \hline
%    x & -\infty && -1 && 0 && 1 && +\infty \\
%    \hline
%    \variations{\mil{\dfrac{1}{1-x^2}} & \haut{0} &&
%        \bas{-\infty}\mil{\bb}\discont\haut{+\infty} && \bas{1} &&
%        \haut{+\infty}\mil{\bb}\discont\bas{-\infty} && \haut{0}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% \DescribeMacro{\bblim} 
% La commande |\bblim| résout le problème en gardant, sur chaque ligne, la double barre
% centrée dans sa colonne, avec des limites à gauche et à droite quelconques
% et quelles que soient les lignes où celles-ci sont positionnées.
% Elle prend 4 paramètres qui sont respectivement \meta{ligne} et \meta{limite}
% à gauche puis à droite de la double barre.
% Elle trace la double barre, place les limites et gère la discontinuité.
%\[
%\begin{tablvar}[2em]{4}
%    \hline
%    x & -\infty && -1 && 0 && 1 && +\infty \\
%    \hline
%    \variations{\mil{\dfrac{1}{1-x^2}} & \haut{0} &&
%        \bblim{3}{-\infty}{1}{+\infty} && \bas{1} &&
%        \bblim{1}{+\infty}{3}{-\infty} && \haut{0}
%    }
%    \hline
%\end{tablvar}
%\]
% \begin{verbatim}
%\begin{tablvar}[2em]{4}
%    \hline
%    x & -\infty && -1 && 0 && 1 && +\infty \\
%    \hline
%    \variations{\mil{\dfrac{1}{1-x^2}} & \haut{0} &&
%        \bblim{3}{-\infty}{1}{+\infty} && \bas{1} &&
%        \bblim{1}{+\infty}{3}{-\infty} && \haut{0}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% Un autre exemple avec des limites de largeur assez différentes (placées ici sur la même ligne).
%\[
%\begin{tablvar}{3}
%    \hline
%    x & 0 &  & \frac{\pi}{6} & & \frac{\pi}{2} & & \pi \\
%    \hline
%    f'(x) & & + & 0 & \hspace{1em} - & \bb & \hspace{-1em} - & \\
%    \hline
%    \variations{\mil{f(x)} & \pos[b]{3}{f(0)} && \pos[t]{1}{f(\frac{\pi}{6})} 
%        && \bblim{3}{-\infty}{3}{0} & & \pos[t]{1}{f(\pi)}
%    }
%    \hline
%\end{tablvar}
%\]
% La colonne de valeurs du $\frac{\pi}{2}$ étant très large, 
% la position des signes \og $-$ \fg{}
% a été légèrement décalée avec la commande \LaTeX\ |\hspace| qui produit 
% un espacement horizontal positif ou négatif.
% \begin{verbatim}
%\begin{tablvar}{3}
%    \hline
%    x & 0 &  & \frac{\pi}{6} & & \frac{\pi}{2} & & \pi \\
%    \hline
%    f'(x) & & + & 0 & \hspace{1em} - & \bb & \hspace{-1em} - & \\
%    \hline
%    \variations{\mil{f(x)} & \pos{3}{f(0)} && \pos[t]{1}{f(\frac{\pi}{6})}     
%        && \bblim{3}{-\infty}{3}{0} & & \pos[t]{1}{f(\pi)}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% L'environnement |tablvar*| \DescribeEnv{tablvar*}
% sert à gérer correctement le positionnement 
% des doubles barres lorsqu'elles se trouvent aux extrémités.
% La différence avec |tablvar| est que les colonnes
% de valeurs des extrémités ne sont plus centrées mais alignées à gauche pour
% le 1ère et à droite pour la dernière.
%
%\[
%\begin{tablvar*}{2}
%    \hline
%    x & 0 && 1 && +\infty \\
%    \hline
%    \variations{ \mil{\ln x -x} & \bb \pos{3}{-\infty} && \pos{1}{-1} && 
%        \pos{3}{-\infty} }
%    \hline
%\end{tablvar*}
%\qquad
%\begin{tablvar*}{2}
%    \hline
%    x & 0 && 1 && +\infty \\
%    \hline
%    \variations{ \mil{\ln x -x} & \pos*{1}{\bb} \pos*{2}{\bb}
%        \pos{3}{-\infty} && \pos{1}{-1} && \pos{3}{-\infty} }
%    \hline
%\end{tablvar*}
%\]
% On observera l'utilisation de |\pos*| dans le second tableau,
% pour tracer une double barre, sauf sur la ligne 3 où on place $-\infty$.
% \begin{verbatim}
%\begin{tablvar*}{2}
%    \hline
%    x & 0 && 1 && +\infty \\
%    \hline
%    \variations{ \mil{\ln x -x} & \bb \pos{3}{-\infty} && \pos{1}{-1} && 
%        \pos{3}{-\infty} }
%    \hline
%\end{tablvar*}
%
%\begin{tablvar*}{2}
%    \hline
%    x & 0 && 1 && +\infty \\
%    \hline
%    \variations{ \mil{\ln x -x} & \pos*{1}{\bb} \pos*{2}{\bb}
%        \pos{3}{-\infty} && \pos{1}{-1} && \pos{3}{-\infty} }
%    \hline
%\end{tablvar*}
% \end{verbatim}
%
% Si par contre, à l'autre extrémité du tableau, les valeurs ont des largeurs
% assez différentes, leur alignement non centré peut être corrigé en utilisant
%  |\hspace|. Ci-dessous, de l'espace a été ajouté à droite du 1.\\
% \begin{minipage}[t]{7.7cm}
% \begin{verbatim}
%\begin{tablvar*}[3em]{1}
%    \hline
%    x & 0 && +\infty \\
%    \hline
%    \variations{ \mil{1-\dfrac{1}{x}} & \bb 
%        \bas{-\infty} && \haut{1\hspace{0.5em}}
%    }
%    \hline
%\end{tablvar*}
% \end{verbatim}
% \end{minipage}
% \begin{minipage}[t]{5cm}
%\[
%\begin{tablvar*}[3em]{1}
%    \hline
%    x & 0 && +\infty \\
%    \hline
%    \variations{ \mil{1-\dfrac{1}{x}} & \bb 
%        \bas{-\infty} && \haut{1\hspace{0.5em}}
%    }
%    \hline
%\end{tablvar*}
%\]
% \end{minipage}
%
% \DescribeMacro{\tablvarinit}
% Enfin, pour personnaliser totalement la définition des colonnes,
% on peut revenir à l'environnement |array| plutôt que d'utiliser |tablvar|
% (il faut dans ce cas appeler |\tablvarinit| juste avant |\begin{array}|).
% Ce qui est essentiel dans cette extension est la macro |\variations|
% avec les commandes de positionnement
% et non l'environnement |tablvar| qui n'est qu'un |array| dans lequel
% on a fixé les définitions de colonnes (et initialisé des variables).
%
% \subsection{Valeurs remarquables}
%
% Nous appellerons \emph{valeur remarquable}, un valeur supplémentaire
% que l'on place dans un tableau de variation et qui ne correspond
% pas à un extremum.
% \medskip
%
% \DescribeMacro{\vr}
% Une première approche est de laisser les flèches de variations passer à travers
% ces valeurs remarquables.
% Pour chaque valeur remarquable, on place une commande |\vr| sur la ligne
% des $x$ et une commande |\vr| dans la partie variations. Les valeurs remarquables
% seront automatiquement reliées par des pointillés 
% (tracés réalisés dans la commande |\variations|).
%
% Voici un exemple avec le logarithme népérien où la valeur remarquable
% est placée dans la colonne intervalle.\\
% \begin{minipage}[t]{7.7cm}
% \begin{verbatim}
%\begin{tablvar*}[5em]{1}
%    \hline
%    x & 0 & \vr{1} & +\infty \\
%    \hline
%    \variations{ \mil{\ln x} & 
%        \bb \pos{3}{-\infty} & 
%        \vr{0} & \pos{1}{+\infty} }
%    \hline
%\end{tablvar*}
% \end{verbatim}
% \end{minipage}
% \begin{minipage}[t]{5cm}
%\[
%\begin{tablvar*}[5em]{1}
%    \hline
%    x & 0 & \vr{1} & +\infty \\
%    \hline
%    \variations{ \mil{\ln x} & 
%        \bb \pos{3}{-\infty} & 
%        \vr{0} & \pos{1}{+\infty} }
%    \hline
%\end{tablvar*}
%\]
% \end{minipage}
%
% Un autre exemple avec deux valeurs remarquables, placées cette fois 
% dans des colonnes valeurs.
%\[ 
%\renewcommand{\tablvarstretch}{1.2}
%\begin{tablvar}[1.5em]{3}
%    \hline
%    x & -\infty && \vr{0} && \vr{1} && +\infty \\
%    \hline
%    \variations[4]{ \pos*{2}{\vdecal{-1.5ex}{\exp x}} & \pos{4}{0} && 
%        \vr[3]{1} && \vr{\mathrm{e}} && \pos{1}{+\infty}
%    }
%    \hline
%\end{tablvar}
%\]
% \begin{verbatim}
%\renewcommand{\tablvarstretch}{1.2}
%\begin{tablvar}[1.5em]{3}
%    \hline
%    x & -\infty && \vr{0} && \vr{1} && +\infty \\
%    \hline
%    \variations[4]{ \pos*{2}{\vdecal{-1.5ex}{\exp x}} & \pos{4}{0} && 
%        \vr[3]{1} && \vr{\mathrm{e}} && \pos{1}{+\infty}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
% \vspace{-2ex}
% \DescribeMacro{\variations\oarg{nblignes}}
% Ci-dessus, la partie variations a été composée sur 4 lignes grâce au paramètre
% optionnel de la commande |\variations|. Les lignes sont alors numérotées
% de 1 (haut) à 4 (bas).\\
% \DescribeMacro{\vr\oarg{ligne}}
% La commande |\vr| possède elle aussi un argument optionnel
% qui est la ligne sur laquelle placer la valeur remarquable,
% lorsqu'il s'agit de la partie variations (2 par défaut).\\
% \DescribeMacro{\tablvarstretch}
% À cause des 4 lignes de variations, la hauteur de lignes du tableau 
% a été réduite en modifiant le facteur
% |\tablvarstretch| (fixé à 1.4 par défaut), modification locale 
% car placée à l'intérieur de l'environnement math
% \footnote{On peut utiliser ce paramètre pour agrandir la hauteur des lignes
% mais l'effet sera global pour tout le tableau. Si l'on souhaite agrandir
% spécifiquement une ligne on peut utiliser la commande \texttt{\bslash vstrut}
% de l'extension \textsf{spacingtricks}. Malheureusement un ajustement automatique
% comme proposé dans l'extension \textsf{arraycols} ne fonctionne pas,
% à cause des doubles barres.}.\\
% \DescribeMacro{\vdecal}
% Enfin  la légende $\exp x$ a été placée en ligne 2 mais 
% décalée vers le bas, pour qu'elle se trouve centrée verticalement
% sachant qu'il y a 4 lignes de variations.
% Ceci s'obtient grâce à la commande |\vdecal| dont la syntaxe est
% \cmd{\vdecal}\marg{decal}\marg{contenu} où la valeur du décalage
% peut être positive (vers le haut) ou négative (vers le bas).
%
% \medskip
% On peut préférer que les flèches de variations s'interrompent sur
% les valeurs remarquables qui sont alors des nœuds.
% Voici un tableau qui présente simultanément les deux manières de traiter 
% les valeurs remarquables.
% La taille des flèches s'ajuste automatiquement.
% Bien entendu, on peut aussi ne pas tracer les pointillés mais placer
% quand même une valeur remarquable sur la flèche avec |\mil{0}|.
%\[
%\begin{tablvar*}{4}
%    \hline
%    x & 0 && \vr{\alpha_1} && \frac{\pi}{6} && \alpha_2 && \frac{\pi}{2}\\
%    \hline
%    f'(x) && + && + & 0 & - && - & \bb \\
%    \hline
%    \variations{\mil{f(x)} & \pos[b]{3}{f(0)} && \vr{0} &&
%        \pos[t]{1}{f(\frac{\pi}{6})} && \pos{2}{0} &&\pos[b]{3}{-\infty}\bb
%    }
%    \hline
%\end{tablvar*}
%\]
% Si on choisit l'option |[t]| pour le max en ligne 1,
% il est alors nécessaire de choisir l'option |[b]| en ligne 3 pour conserver
% un positionnement correct du 0 sur la flèche.
% \begin{verbatim}
%\begin{tablvar*}{4}
%    \hline
%    x & 0 && \vr{\alpha_1} && \frac{\pi}{6} && \alpha_2 && \frac{\pi}{2}\\
%    \hline
%    f'(x) && + && + & 0 & - && - & \bb \\
%    \hline
%    \variations{\mil{f(x)} & \pos[b]{3}{f(0)} && \vr{0} &&
%        \pos[t]{1}{f(\frac{\pi}{6})} && \pos{2}{0} &&\pos[b]{3}{-\infty}\bb
%    }
%    \hline
%\end{tablvar*}
% \end{verbatim}
%
% La commande |\vr| peut également servir à représenter des discontinuités 
% particulières, voir l'exemple ci-dessous avec la fonction définie par
%\[ 
%f(x)=\left\{
%\begin{array}{@{}cl}
%    \frac{\sin x}{x} &\mbox{si } x \neq 0 \\[1ex]
%    0 &\mbox{si } x= 0
%\end{array}
%\right. .
%\]
% \begin{minipage}[t]{7.5cm}
% \begin{verbatim}
%\begin{tablvar}{2}
%    \hline
%    x & -\pi && \vr{0} && \pi \\
%    \hline
%    \variations{\mil{f(x)} & \bas{0} && 
%        \haut{ 1 \hspace{0.2em} } \discont
%        \vr[3]{0} \haut{ \hspace{0.2em} 1 }
%        && \bas{0}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
% \end{minipage}
% \begin{minipage}[t]{5cm}
%\[
%\begin{tablvar}{2}
%    \hline
%    x & -\pi && \vr{0} && \pi \\
%    \hline
%    \variations{\mil{f(x)} & \bas{0} && 
%        \haut{ 1 \hspace{0.2em} } \discont
%        \vr[3]{0} \haut{ \hspace{0.2em} 1 }
%        && \bas{0}
%    }
%    \hline
%\end{tablvar}
%\]
% \end{minipage}
%
% \medskip
% Voici un dernier exemple, traité de deux manières différentes,
% avec des valeurs remarquables dans deux tableaux conjoints. 
% Avec des nœuds c'est assez simple. 
%\[
%\begin{tablvar}{4}
%    \hline
%    x & 0 && \frac{\pi}{2} && \pi && \frac{3\pi}{2} && 2\pi \\
%    \hline
%    \variations{ \mil{\cos x} & \haut{1} && \pos{2}{0} && \bas{-1} && 
%        \pos{2}{0} && \haut{1} }
%    \hline
%    \variations{ \mil{\sin x} & \bas{0} && \haut{1} && \pos{2}{0} && 
%        \bas{-1} && \haut{0} }
%    \hline
%\end{tablvar}
%\]
% \begin{verbatim}
%\begin{tablvar}{4}
%    \hline
%    x & 0 && \frac{\pi}{2} && \pi && \frac{3\pi}{2} && 2\pi \\
%    \hline
%    \variations{ \mil{\cos x} & \haut{1} && \pos{2}{0} && \bas{-1} &&
%        \pos{2}{0} && \haut{1} }
%    \hline
%    \variations{ \mil{\sin x} & \bas{0} && \haut{1} && \pos{2}{0} &&
%        \bas{-1} && \haut{0} }
%    \hline
% \end{verbatim}
%
% \vspace{-2ex}
% \DescribeMacro{\noeud} \DescribeMacro{\vrconnect}
% Par contre, pour traiter ici les valeurs remarquables avec des pointillés, 
% la commande |\vr| ne permet pas connecter les valeurs sur $x$ avec celles du sinus dans
% le 2\ieme\ tableau, mais on peut le faire \og à la main\fg{} 
% en appelant les macros |\noeud| et |\vrconnect|.
%
%\[
%\begin{tablvar}{4}
%    \hline
%    x & 0 && \noeud{X1}{\frac{\pi}{2}} && \noeud{X2}{\pi} &&
%        \noeud{X3}{\frac{3\pi}{2}} && 2\pi \\
%    \hline
%    \variations{ \mil{\cos x} & \haut{1} && \mil{0} && \bas{-1} && 
%        \mil{0} && \haut{1} }
%    \hline
%    \variations{ \mil{\sin x} & \bas{0} && \haut{\noeud{Y1}{1}} && 
%        \mil{\noeud{Y2}{0}} && \bas{\noeud{Y3}{-1}} && \haut{0} }
%    \hline
%\end{tablvar}
%\vrconnect{X1}{Y1}
%\vrconnect{X2}{Y2}
%\vrconnect{X3}{Y3}
%\]
% \begin{verbatim}
%\begin{tablvar}{4}
%    \hline
%    x & 0 && \noeud{X1}{\frac{\pi}{2}} && \noeud{X2}{\pi} &&
%        \noeud{X3}{\frac{3\pi}{2}} && 2\pi \\
%    \hline
%    \variations{ \mil{\cos x} & \haut{1} && \mil{0} && \bas{-1} && 
%        \mil{0} && \haut{1} }
%    \hline
%    \variations{ \mil{\sin x} & \bas{0} && \haut{\noeud{Y1}{1}} && 
%        \mil{\noeud{Y2}{0}} && \bas{\noeud{Y3}{-1}} && \haut{0} }
%    \hline
%\end{tablvar}
%\vrconnect{X1}{Y1}
%\vrconnect{X2}{Y2}
%\vrconnect{X3}{Y3}
% \end{verbatim}
%
% \subsection{Zones interdites}
%
% Nous abordons pour finir le tracé de zones interdites où la fonction
% n'est pas définie. On peut dessiner ces zones interdites en couleur ou en hachures.
%
% \medskip
% Pour une zone interdite en couleur, on place la commande |\ZIc|
% \DescribeMacro{\ZIc}
% dans les intervalles que l'on veut colorer (signes ou variations).
% Un exemple avec la fonction $f$ définie par $f(x)=\frac{1}{\sqrt{x^2-1}}$.
% La zone grisée arrive toujours au contact des doubles barres. 
%\[
%\begin{tablvar}[4em]{3}
%    \hline
%    x & -\infty && \zbox{-1} && \zbox{1} && +\infty \\
%    \hline
%    -\frac{x}{\strut\sqrt{x^2-1}^3} && \hspace{-1.5em} + & \bb & \ZIc & 
%        \bb & \hspace{1.5em} - & \\
%    \hline
%    \variations{\mil{\dfrac{1}{\sqrt{x^2-1}}} & \bas{0} && 
%        \zbox[r]{\haut{+\infty}} \bb & \ZIc & 
%        \bb \zbox[l]{\haut{+\infty}} && \bas{0}
%    }
%    \hline
%\end{tablvar}
%\]
% \DescribeMacro{\zbox}
% Plusieurs \og interventions\fg{} manuelles sont nécessaires.
% D'abord sur la ligne des $x$, il faut permettre aux bornes
% de déborder sur la colonne de la zone interdite.
% Pour cela on les place dans une |\zbox|.
% La commande \cmd{\zbox}\oarg{pos}\marg{contenu} 
% affiche son contenu mais considère la largeur comme nulle.
% Le 1\ier\ paramètre (optionnel) est le positionnement dans la boite : 
% |c| (par défaut), |l| (left) ou |r| (right).
% Ici |zbox| est aussi nécessaire pour annuler la largeur des
% boites contenant les $+\infty$ sinon la double barre ne serait
% plus au centre de sa colonne, en ligne 1, ce qui produirait
% un décalage avec les autres lignes.\\
% La deuxième ligne avec la racine cubique a été agrandie grâce à la commande \LaTeX\ |\strut|.
% Enfin, les signes ont été décalés avec |\hspace|, pour améliorer
% leur centrage par rapport aux flèches.
% \begin{verbatim}
%\begin{tablvar}[4em]{3}
%    \hline
%    x & -\infty && \zbox{-1} && \zbox{1} && +\infty \\
%    \hline
%    -\frac{x}{\strut\sqrt{x^2-1}^3} && \hspace{-1.5em} + & \bb & \ZIc &
%        \bb & \hspace{1.5em} - & \\
%    \hline
%    \variations{\mil{\dfrac{1}{\sqrt{x^2-1}}} & \bas{0} && 
%        \zbox[r]{\haut{+\infty}} \bb & \ZIc & 
%        \bb \zbox[l]{\haut{+\infty}} && \bas{0}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% Un autre exemple avec $f(x)=\sqrt{2x^2-1}$ où
% les doubles barres n'apparaissent que sur la dérivée.
%\[
%\begin{tablvar}[3em]{3}
%    \hline
%    x & -\infty && \zbox{-\frac{\sqrt{2}}{2}} &&
%        \zbox{\frac{\sqrt{2}}{2}} && +\infty \\
%    \hline
%    \frac{2x}{\sqrt{2x^2-1}} && - & \bb & \ZIc & \bb & + & \\
%    \hline
%    \variations{\mil{\sqrt{2x^2-1}} & \haut{+\infty} && \zbox[r]{\bas{0}}
%        & \ZIc & \zbox[l]{\bas{0}} && \haut{+\infty}
%    }
%    \hline
%\end{tablvar}
%\]
% \begin{verbatim}
%\begin{tablvar}[3em]{3}
%    \hline
%    x & -\infty && \zbox{-\frac{\sqrt{2}}{2}} &&
%        \zbox{\frac{\sqrt{2}}{2}} && +\infty \\
%    \hline
%    \frac{2x}{\sqrt{2x^2-1}} && - & \bb & \ZIc & \bb & + & \\
%    \hline
%    \variations{\mil{\sqrt{2x^2-1}} & \haut{+\infty} && \zbox[r]{\bas{0}}
%        & \ZIc & \zbox[l]{\bas{0}} && \haut{+\infty}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% \DescribeMacro{\ZIh}%
% Voyons à présent la réalisation de tableaux avec zones interdites hachurées.
% On place la commande |\ZIh| dans les intervalles que l'on veut hachurer.
%\[
%\begin{tablvar}{3}
%    \hline
%    x & -\infty & & \zbox{-\frac{\sqrt{2}}{2}}& &
%    \zbox{\frac{\sqrt{2}}{2}} & & +\infty \\
%    \hline
%    f'(x) & & - & \bb & \ZIh & \bb & + & \\
%    \hline
%    \variations{\mil{f(x)} & \haut{+\infty} && \bas{0} &
%        \ZIh & \bas{0} && \haut{+\infty}
%    }
%    \hline
%\end{tablvar}
%\]
% Pour les mêmes raisons que précédemment, les |\zbox| sont toujours 
% nécessaires sur la ligne des $x$, mais plus pour les 0.
% \begin{verbatim}
%\begin{tablvar}{3}
%    \hline
%    x & -\infty && \zbox{-\frac{\sqrt{2}}{2}} &&
%        \zbox{\frac{\sqrt{2}}{2}} & & +\infty \\
%    \hline
%    f'(x) && - & \bb & \ZIh & \bb & + & \\
%    \hline
%    \variations{\mil{f(x)} & \haut{+\infty} && \bas{0} &
%        \ZIh & \bas{0} && \haut{+\infty} }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% \DescribeMacro{\ZIh\oarg{hauteur}}
% Les hachures s'ajustent automatiquement lorsque toutes les lignes 
% ont une hauteur standard.
% Si par contre des lignes sont plus hautes à cause de leur contenu,
% on doit ajouter de la hauteur avec \cmd{\ZIh}\oarg{hauteur} (réglage manuel).
%\[
%\begin{tablvar}[3.5em]{3}
%    \hline
%    x & -\infty & &\zbox{-1} &&\zbox{1} & & +\infty \\
%    \hline  
%    f'(x) && \hspace{-1em} + & \bb & \ZIh & \bb & \hspace{1em} - & \\
%    \hline
%    \variations{ \mil{\sqrt{\dfrac{x-1}{x+1}}}
%        & \bas{1} && \zbox[r]{\haut{+\infty}} \bb & \ZIh[2ex]
%        & \zbox{\bas{0}} \barre  && \haut{1}
%    }
%    \hline
%\end{tablvar}
%\]
% On remarquera ici l'utilisation de |\barre| dans la partie variations qui
% oblige à placer le 0 dans une |\zbox| sans quoi la barre serait décalée après le 0.
% \begin{verbatim}
%\begin{tablvar}[3.5em]{3}
%    \hline
%    x & -\infty & &\zbox{-1} && \zbox{1} && +\infty \\
%    \hline  
%    f'(x) && \hspace{-1em} + & \bb & \ZIh & \bb & \hspace{1em} - & \\
%    \hline
%    \variations{ \mil{\sqrt{\dfrac{x-1}{x+1}}}
%        & \bas{1} && \zbox[r]{\haut{+\infty}} \bb & \ZIh[2ex]
%        & \zbox{\bas{0}} \barre  && \haut{1}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% Voici un exemple avec deux zones interdites. On considère la fonction $f$ telle que
% $f(x)= \sqrt{(x^2-1)(x^2-4)}$.
%{ \footnotesize
%\[ 
%\begin{tablvar}{6}
%    \hline
%    x & -\infty && \zbox{-2} && \zbox{-1} && 0 && \zbox{1} && \zbox{2} 
%        && +\infty \\
%    \hline
%    2x & &-& \barre & \ZIh &\barre &-& \barre[0] &+& \barre && \barre &+&\\
%    \hline
%    2x^2-5 & &+& \barre & \ZIh & \barre &-& \barre &-& \barre &&
%        \barre &+& \\
%    \hline
%    f'(x) & &-& \bb & \ZIh & \bb &+& \barre[0] &-& \bb && \bb &+& \\
%    \hline
%    \variations{\mil{f(x)} & \haut{+\infty} && \zbox{\bas{0}} \barre
%        & \ZIh[0.4ex] & \zbox{\bas{0}} \barre && \haut{2} && \zbox{\bas{0}}
%        \barre & \ZIh[0.4ex] & \zbox{\bas{0}} \barre && \haut{+\infty}
%    }
%    \hline
%\end{tablvar}
%\]
%}
% La commande |\ZIh| \emph{ne doit pas être placée deux fois dans une même ligne de signe}
% car, sauf sur la dernière ligne des variations où elle trace les hachures, 
% son effet est simplement de cumuler la hauteur de la ligne.
% Et comme toutes les lignes de signes ont le même numéro 0, la commande |\ZIh|,
% dans la partie signes, ne sait pas sur quelle ligne elle se trouve
% et cumule la hauteur de ligne à chaque appel.
% \begin{verbatim}
%\begin{tablvar}{6}
%    \hline
%    x & -\infty && \zbox{-2} && \zbox{-1} && 0 && \zbox{1} && \zbox{2} 
%        && +\infty \\
%    \hline
%    2x & &-& \barre & \ZIh &\barre &-& \barre[0] &+& \barre && \barre &+&\\
%    \hline
%    2x^2-5 & &+& \barre & \ZIh & \barre &-& \barre &-& \barre &&
%        \barre &+& \\
%    \hline
%    f'(x) & &-& \bb & \ZIh & \bb &+& \barre[0] &-& \bb && \bb &+& \\
%    \hline
%    \variations{\mil{f(x)} & \haut{+\infty} && \zbox{\bas{0}} \barre
%        & \ZIh[0.4ex] & \zbox{\bas{0}} \barre && \haut{2} && \zbox{\bas{0}}
%        \barre & \ZIh[0.4ex] & \zbox{\bas{0}} \barre && \haut{+\infty}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% \DescribeMacro{\ZIh*}
% Lorsqu'on ne fait qu'un tableau de signes (sans variations), 
% il faut utiliser la commande |\ZIh*| pour déclencher le tracé des hachures.
% Celle-ci doit être placée sur la dernière ligne de chaque bloc de hachures.
% Sur les lignes précédentes, le |\ZIh| peut être placé n'importe où
%  (une seule fois par ligne).
%
%{ \footnotesize
%\[ 
%\begin{tablvar}{6}
%    \hline
%    x & -\infty && \zbox{-2} && \zbox{-1} && 0 && \zbox{1}  && \zbox{2} 
%        && +\infty \\
%    \hline
%    2x & &-& \barre && \barre  &-& \barre[0] &+& \barre &&
%        \barre{} &+& \ZIh \\
%    \hline
%    2x^2-5 & &+& \barre & & \barre &-& \barre &-& \barre &&
%        \barre{} &+& \ZIh \\
%    \hline
%    f'(x) & &-& \bb & \ZIh* & \bb &+& \barre[0] &-& \bb & \ZIh* & \bb &+&\\
%    \hline
%\end{tablvar}
%\]
%}
% \begin{verbatim}
%\begin{tablvar}{6}
%    \hline
%    x & -\infty && \zbox{-2} && \zbox{-1} && 0 && \zbox{1}  && \zbox{2} 
%        && +\infty \\
%    \hline
%    2x & &-& \barre & & \barre  &-& \barre[0] &+& \barre &&
%        \barre{} &+& \ZIh \\
%    \hline
%    2x^2-5 & &+& \barre & & \barre &-& \barre &-& \barre &&
%        \barre{} &+& \ZIh \\
%    \hline
%    f'(x) & &-& \bb & \ZIh* & \bb &+& \barre[0] &-& \bb & \ZIh* & \bb &+&\\
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% Si on veut tracer des rectangles de hachures sur des lignes non contiguës,
% il faut un appel à |\ZIh*| pour chaque rectangle.
%\[
%\begin{tablvar}{4} 
%    \hline 
%    x & -\infty && \zbox{-1}\phantom{0} && \zbox[l]{1}\phantom{0} && 2 && 
%        +\infty \\
%    \hline
%    \sqrt{x^2-1} && + & \barre[0] & \ZIh* & \barre[0] & + & \barre & + &\\
%    \hline
%    x-2 && - & \barre & - & \barre & - & \barre[0] & + & \\
%    \hline
%    (x-2)\sqrt{x^2-1} && - & \barre[0] & \ZIinit\ZIh* & \barre[0] & - & 
%        \barre[0] & + & \\
%    \hline
%\end{tablvar}
%\]
% \smallskip
% \begin{verbatim}
%\begin{tablvar}{4}
%    \hline
%    x & -\infty && \zbox{-1}\phantom{0} && \zbox[l]{1}\phantom{0} && 2 && 
%        +\infty \\
%    \hline
%    \sqrt{x^2-1} && + & \barre[0] & \ZIh* & \barre[0] & + & \barre & + &\\
%    \hline
%    x-2 && - & \barre & - & \barre & - & \barre[0] & + & \\
%    \hline
%    (x-2)\sqrt{x^2-1} && - & \barre[0] & \ZIinit\ZIh* & \barre[0] & - & 
%        \barre[0] & + & \\
%    \hline
%\end{tablvar}
% \end{verbatim}
% \vspace{-3ex}
% Ci-dessus, la commande \LaTeX\ |\phantom{0}| sur la ligne des $x$ permet de créer une
% boite fantôme de la largeur du 0, pour éviter que la largeur de la colonne
% valeur ne soit complètement nulle produisant un chevauchement inélégant
% des 0 sur les hachures.\\
% \DescribeMacro{\ZIinit}
% L'appel à |\ZIinit| sur la dernière ligne permet de ne pas
% conserver la hauteur cumulée lors du précédent appel à |\ZIh*|
% (en fait inutile ici car la 1ère zone hachurée ne fait qu'une seule ligne de haut).
%
% \medskip
% \DescribeMacro{\hachure}
% On ne peut pas dessiner des zones interdites hachurées
% sur plusieurs colonnes contiguës avec |\ZIh|,
% mais on peut alors utiliser la primitive graphique |\hachure| 
% pour définir manuellement le rectangle à hachurer.
%
%{ \footnotesize
%\[
%\begin{tablvar}{8}
%    \hline
%    x & -\infty && \zbox{-2} && \zbox{-\sqrt{\frac{5}{2}}} && \zbox{-1} 
%        && 0 && 1 && \zbox{\sqrt{\frac{5}{2}}} && 2 && +\infty \\
%    \hline
%    2x & &-& \barre &-& \barre &-& \barre &-& \barre[0] &+&
%        \barre &+& \barre &+& \barre &+& \\
%    \hline
%    2x^2-5 & &+& \barre &+& \barre[0] &-& \barre &-& \barre &-&
%        \barre &-& \barre[0] &+& \barre &+& \\
%    \hline
%    f'(x) & &-& \bb & & \hachure{-4em,-12.8ex}{4em,2.6ex} & & \bb &+&
%        \barre[0] &-& \bb & &  & & \bb & + & \\
%    \hline
%    \variations{\mil{f(x)} & \haut{+\infty} && \bas{0} \discont &&  &&
%        \bas{0} && \haut{2} && \bas{0} \discont &&
%        \pos*{3}{\hachure{-4em,14.3ex}{4em,-1.2ex}} && \bas{0} && 
%        \haut{+\infty}
%    }
%    \hline
%\end{tablvar}
%\]
%}
% Si l'on ne dispose pas de ligne de signe pour placer la commande |\hachure|,
% on peut la placer sur la ligne des $x$ ou dans la partie variations mais
% il faut alors mettre celle-ci dans un |\pos*| sinon elle sera répétée pour chaque
% ligne des variations.
% \begin{verbatim}
%\begin{tablvar}{8}
%    \hline
%    x & -\infty && \zbox{-2} && \zbox{-\sqrt{\frac{5}{2}}} && \zbox{-1} 
%        && 0 && 1 && \zbox{\sqrt{\frac{5}{2}}} && 2 && +\infty \\
%    \hline
%    2x & &-& \barre &-& \barre &-& \barre &-& \barre[0] &+&
%        \barre &+& \barre &+& \barre &+& \\
%    \hline
%    2x^2-5 & &+& \barre &+& \barre[0] &-& \barre &-& \barre &-&
%        \barre &-& \barre[0] &+& \barre &+& \\
%    \hline
%    f'(x) & &-& \bb & &\hachure{-4em,-12.8ex}{4em,2.6ex} & & \bb &+&
%        \barre[0] &-& \bb & &  & & \bb & + & \\
%    \hline
%    \variations{\mil{f(x)} & \haut{+\infty} && \bas{0} \discont &&  &&
%        \bas{0} && \haut{2} && \bas{0} \discont &&
%        \pos*{3}{\hachure{-4em,14.3ex}{4em,-1.2ex}} && \bas{0} && 
%        \haut{+\infty}
%    }
%    \hline
%\end{tablvar}
% \end{verbatim}
%
% \pagebreak
% \section{Le code}
%
% \subsection{Extensions requises et options}
%
%    \begin{macrocode}
\RequirePackage{array}
\RequirePackage{ifthen}
\RequirePackage{multido}
\RequirePackage{colortbl} % pour \ZIc

\newboolean{tikz}
\DeclareOption{tikz}{\setboolean{tikz}{true}}
\DeclareOption{pstricks}{\setboolean{tikz}{false}} % valeur par défaut
\ProcessOptions \relax

\ifthenelse{\boolean{tikz}}{
    \RequirePackage{tikz}
    \usetikzlibrary{patterns}
    \newlength{\tikznode@below}
    }{
    \RequirePackage{pst-node}
}
%    \end{macrocode}

% \subsection{Les paramètres généraux}
%
% Dans cette section sont présentés tous les paramètres
% que l'on peut redéfinir pour modifier l'aspect des tableaux,
% mais qui n'ont en principe pas besoin d'être touchés.
%
% \begin{macro}{\intervalwidth}
% Définit la largeur par défaut des colonnes \og intervalles \fg,
% valeur prédéfinie à 2.5~em.
%    \begin{macrocode}
\newlength{\intervalwidth}
\setlength{\intervalwidth}{2.5em} % largeur des "intervalles"
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\bordercolsep}
% Définit la largeur de l'espace extérieur des première et dernière colonnes de valeurs.
% Sa valeur par défaut a été réduite par rapport à la longueur \LaTeX\ standard 
%|\arraycolsep| afin que les valeurs des extrémités (souvent des $\infty$) 
% soient plus proches des lignes verticales de début et de fin.
%    \begin{macrocode}
\newlength{\bordercolsep} % largeur de l'espace inter-colonne
\setlength{\bordercolsep}{2pt}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\innercolsep}
% Définit la largeur entre les colonnes valeurs et les colonnes intervalles du tableau.
% Cette largeur a été ajustée pour que les zones interdites grisées avec |\cellcolor| 
% arrivent au contact de la double barre. 
%    \begin{macrocode}
\newlength{\innercolsep}
\setlength{\innercolsep}{4pt}
%    \end{macrocode}
% \end{macro}

%\begin{macro}{maxdiscount}
% La gestion de discontinuités permettant de ne pas relier les flèches l'une à l'autre
% se fait grâce à la commande |\discont|.
% Le compteur |maxdiscont| est fixé à 3 par défaut ; il faut l'augmenter si l'on veut
% produire un tableau de variation avec plus de 3 discontinuités.
%    \begin{macrocode}
\newcounter{maxdiscont}
\setcounter{maxdiscont}{3} % nb max de discontinuités
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\tablvarstretch}
% Permet de régler la valeur relative de l'espacement vertical
% des lignes du tableau. La valeur par défaut est 1.4 (1 correspondant 
% à la valeur standard d'un environnement |array|).
% Placée dans un environnement math, elle sera locale à cet environnement.
%    \begin{macrocode}
\newcommand{\tablvarstretch}{1.4}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\tvbarrewidth}
% Définit l'épaisseur des barres de séparation verticales coupant les 0 
% d'un tableau de signe : 0.5~pt par défaut.
%    \begin{macrocode}
\newlength{\tvbarrewidth}
\setlength{\tvbarrewidth}{0.5pt}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{tvbarrecolor}
% Définit la couleur des mêmes barres de séparation verticales.
%    \begin{macrocode}
\definecolor{tvbarrecolor}{gray}{0.7}
%    \end{macrocode}
% \end{macro}

% \subsection{Les commandes graphiques PSTricks/\tikz}
%
% Nous présentons ici les commandes graphiques permettant le dessin 
% des flèches,
% les pointillés des valeurs remarquables, les hachures des zones interdites.
% Celles-ci sont définies différemment s'il s'agit de l'option |tikz| ou |pstricks|
% (plus précisément liées à l'extension \textsf{pst-node}).
%
% \begin{macro}{\fleche}
% La commande \cmd{\fleche}\marg{noeud1}\marg{noeud2} possède deux paramètres
% qui sont les noms des nœuds à relier. 
% La création des nœuds est obtenue avec la commande |\noeud| appelée par |\pos| 
% et le tracé des flèches réalisé automatiquement par la commande |\variations|.
% Pour modifier l'aspect des flèches on peut redéfinir la commande.
%    \begin{macrocode}
\newcommand*{\fleche}[2]{
    \ifthenelse{\boolean{tikz}}{
        \tikz[remember picture,overlay]{\draw[->,>=stealth,
            line width=0.6pt] (#1) -- (#2);}
    }{
        \ncline[arrowsize=2pt 2,arrowinset=0.4,nodesep=3pt,
            linewidth=0.6pt]{->}{#1}{#2}
    }
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\vrconnect}
% La commande \cmd{\vrconnect}\marg{noeud1}\marg{noeud2}
% relie les nœuds définis par |\vr| (valeurs remarquables)
% et le tracé est réalisé automatiquement par la commande |\variations|.
% Par défaut : lignes en pointillés d'épaisseur 1\,pt.
%    \begin{macrocode}
\newcommand*{\vrconnect}[2]{
    \ifthenelse{\boolean{tikz}}{
        \tikz[remember picture,overlay]{\draw[dotted,line width=1pt] 
            (#1) -- (#2);}
    }{
        \ncline[nodesep=5pt,linestyle=dotted,linewidth=1pt]{-}{#1}{#2}
    }
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\noeud}
% \cmd{\noeud}\oarg{pos}\marg{noeud}\marg{valeur}
% définit les nœuds des flèches et valeurs remarquables ; 
% le 1\ier\ paramètre optionnel correspond à l'option |t| (top), 
% |b| (bottom) ou |c| (centered, par défaut) permettant d'ajuster
% la manière dont la flèche arrive sur le nœud (sans effet pour |tikz|) ;
% le 2\ieme\ paramètre est le nom du nœud (qui est donné automatiquement 
% par les commandes de positionnement) ;
% le 3\ieme\ paramètre est la valeur affichée dans le tableau.
%    \begin{macrocode}
\newcommand*{\noeud}[3][c]{
    \ifthenelse{\boolean{tikz}}{
        \tikz[remember picture,baseline]{
            \node[anchor=base,inner sep=0,outer sep=4] (#2) {$#3$};
        } % l'option de placement (#1) n'est pas implémentée pour tikz
    }{
        \rnode[#1]{#2}{#3}
    }
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\hachure}
% Définition des hachures pour les zones interdites.
% La macro prend deux arguments qui sont des paires de longueurs,
% par exemple |\hachure{-3em,12ex}{3em,-1ex}|,
% représentant les extrémités du rectangle à hachurer
% par rapport à la position courante où la macro est appelée. 
%    \begin{macrocode}
\newcommand*{\hachure}[2]{
    \ifthenelse{\boolean{tikz}}{
        \tikz[remember picture,overlay]{\fill[pattern=north east lines] 
            (#1) rectangle (#2);}
    }{
        \psframe[linestyle=none,fillstyle=vlines,hatchwidth=0.2pt,
            hatchsep=3pt](#1)(#2)
    }
}
%    \end{macrocode}
% \end{macro}

% \subsection{Longueurs et compteurs internes}
%
%   \begin{macrocode}
\newcounter{ligne} % numéro de ligne
\newcounter{noeud} % numéro du nœud
\newcounter{numvr} % numéro de la valeur remarquable
\newcounter{numdiscont} % numéro de la discontinuité
%    \end{macrocode}
%
% Un compteur est créé pour chaque discontinuité : |discont1|, |discont2|, etc.
% Le compteur |discont|\meta{i} contient le numéro du nœud précédant 
% la i-ème discontinuité.
% La flèche partant de ce nœud ne sera pas tracée.
% Il faut un compteur de plus que le nombre de discontinuités.
%    \begin{macrocode}
\AtBeginDocument{% car maxdiscont a pu être modifié dans le préambule
    \stepcounter{maxdiscont}
    % il faut un compteur de plus que le nb de discontinuités
    \multido{\I=1+1}{\themaxdiscont}{\newcounter{discont\I}}
}
%    \end{macrocode}

% Longueurs et compteurs pour la commande |\ZIh|.
%    \begin{macrocode}
\newlength{\ZIheight}
\newlength{\ZIdepth}
\newlength{\ZIwidth}
\newcounter{ZI} % numéro de la ZI
\newcounter{ZIstar} % numéro de ZI pour la commande \ZI*
\newcounter{ZIvarlignes} % dernière ligne des variations
%    \end{macrocode}

% \bigskip
% \subsection{Les environnements \texttt{tablvar} et \texttt{tablvar*}}
%
% Grâce à l'extension \textsf{array} nous pouvons définir un nouveau type de colonnes 
% pour les intervalles : |i|.
%    \begin{macrocode}
\newcolumntype{i}[1]{>{\centering\arraybackslash $}p{#1}<{$}}
    % nouveau type de colonne i pour les intervalles
%    \end{macrocode}

% \begin{macro}{\tablvarinit}
% \changes{v1.1}{13/04/2019}{ajouté \bslash extrarowheight}
% Cette commande d'initialisation des compteurs est appelée
% au début de chaque environnement |tablvar| ou |tablvar*|.
% Les redéfinitions de |\extrarowheight| et |\arraystretch| seront locales 
% dans l'environnement |tablvar|.
%    \begin{macrocode}
\newcommand{\tablvarinit}{
    \setlength{\extrarowheight}{0pt} % paramètre de l'extension array
    \renewcommand{\arraystretch}{\tablvarstretch} 
    \setcounter{ligne}{0}
    \setcounter{numvr}{0}
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\ZIinit}
% Initialisation des longueurs et compteurs pour la commande |\ZIh|.
% Prend un argument (optionnel) qui est la largeur des colonnes intervalles
% (car il faut la sauvegarder dans |\ZIwidth|)
% et qui est passé automatiquement par |tablvar|.
%    \begin{macrocode}
\newcommand*{\ZIinit}[1][\intervalwidth]{
    \setlength{\ZIheight}{0pt}
    \setlength{\ZIdepth}{0pt}
    \setlength{\ZIwidth}{#1}
    \setcounter{ZI}{0}
    \setcounter{ZIstar}{0}
    \setcounter{ZIvarlignes}{3} 
    % doit être non nul pour \ZIh si tableau de signe seul
}
%    \end{macrocode}
% \end{macro}

% \begin{environment}{tablvar}
% L'environnement |tablvar| : |\begin{tablvar}|\oarg{width}\marg{nbintervals}.
% Le 1\ier\ paramètre (optionnel) permet de régler la largeur des colonnes 
% intervalles (définie par |\intervalwidth|
% par défaut), le 2\ieme\ paramètre (obligatoire) est le nombre d'intervalles.
% Cet environnement n'est rien d'autre qu'un |array| dans lequel on a réglé
% les options de colonages.
% Les colonnes de valeurs sont de type |c| et les colonnes d'intervalles de type |i|
% \footnote{L'utilisation d'un type de colonne permettant un ajustement automatique
% de la hauteur tel que fourni par l'extension \textsf{cellspace} de Josselin Noirel
% ne fonctionne pas ici : les double-barres ne sont pas correctement dessinées.}.
%    \begin{macrocode}
\newenvironment{tablvar}[2][\intervalwidth]{
    \tablvarinit
    \ZIinit[#1]
    \begin{array}{%
        |c|@{\hspace{\bordercolsep}}%
        *{#2}{c@{\hspace{\innercolsep}}%
            i{#1}@{\hspace{\innercolsep}}%
        }%
        c@{\hspace{\bordercolsep}}|%
    }    
}{\end{array}}
%    \end{macrocode}
% \end{environment}

% \begin{environment}{tablvar*}
% L'environnement |tablvar*| est une variante de |tablvar| (même syntaxe)
% où la première et la dernière colonnes de valeurs sont alignées respectivement
% à gauche (|l|) et à droite (|r|).
% Ceci est utile lorsqu'il y a une double barre à l'une des extrémités.
%    \begin{macrocode}
\newcounter{nb@intervals}
\newenvironment{tablvar*}[2][\intervalwidth]{
    % environnement tablvar* , type l et r pour les extrémités
    \tablvarinit
    \ZIinit[#1]
    \setcounter{nb@intervals}{#2}
    \addtocounter{nb@intervals}{-1}
    \begin{array}{%
        |c|@{\hspace{\bordercolsep}}%
        l@{\hspace{\innercolsep}}%
        i{#1}@{\hspace{\innercolsep}}%
        *{\value{nb@intervals}}{
            c@{\hspace{\innercolsep}}%
            i{#1}@{\hspace{\innercolsep}}%
        }%
        r@{\hspace{\bordercolsep}}|%
    }
}{\end{array}}
%    \end{macrocode}
% \end{environment}

% \subsection{La commande \texttt{\textbackslash variations}}
%
% C'est ici qu'est la magie !
% 
% \begin{macro}{\varloop}
% \changes{v1.1}{12/04/2019}{tvloop -> varloop}
% La commande \cmd{\varloop}\marg{iter}\marg{code} répète \meta{code} (\meta{iter}$- 1$) fois
% (car la dernière ligne de variations doit subir un traitement particulier).
% Nous avons créé une variante de |\multido| (du package \textsf{multido}) car
% |\multido|, |\Multido| ou |\whiledo| plantent sur |\\| ou |\@arraycr|
% et la commande |\variations| a besoin d'utiliser une boucle dans un tableau.
% |\varloop| n'est autre qu'un |\ifthenelse| récursif.
%    \begin{macrocode}
\newcounter{loop@counter}    
\newcommand{\varloop}[2]{%
    \setcounter{loop@counter}{#1}
    \addtocounter{loop@counter}{-1}% on boucle 1 fois de moins que #1
    \ifthenelse{\value{loop@counter}=0}{}{%
        #2 \varloop{\value{loop@counter}}{#2}%
    }
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\variations}
% \cmd{\variations}\oarg{nblignes}\marg{code} où \meta{nblignes} est le nombre
% de lignes pour les variations (3 par défaut) ;
% \meta{code} contient les séparateurs de colonnes et la composition des variations 
% grâce aux commandes de positionnement.\\
% Le principe est que l'on parcourt 3 fois (par défaut) le contenu de |\variations| ;
% à chaque itération, le compteur |ligne| est incrémenté, 
% le compteur |noeud| est remis à 0 puis incrémenté à chaque commande |\pos|,
% mais le contenu de |\pos| n'est affiché et le nœud n'est effectivement créé 
% que si la valeur du compteur |ligne| correspond à l'argument de ligne de |\pos|.\\
% Les flèches et pointillés sont dessinés à la fin, quand tous les nœuds sont créés,
% mais il faut les tracer avant le |\\| final, sinon la compilation plante !?
%    \begin{macrocode}
\newcommand*{\variations}[2][3]{% #1=nblignes (3 par défaut)
    % (ré)initialisation des compteurs
    \setcounter{ligne}{0} % nécessaire pour 2 parties variations
    \setcounter{numdiscont}{0}
    \multido{\I=1+1}{\themaxdiscont}{\setcounter{discont\I}{0}}
    \setcounter{ZIvarlignes}{#1} % nécessaire pour \ZIh
    % boucle : on exécute le code #2 un nb de fois égal à (#1)-1
    \varloop{#1}{%
        \setcounter{noeud}{0}\setcounter{numvr}{0}\setcounter{ZI}{0}
        % à chaque boucle on réinitialise certains compteurs
        \stepcounter{ligne} % le numéro de ligne est incrémenté
        #2 % les nœuds sont fabriqués par le code #2 (avec \pos et \vr)
        \\ % retour ligne
        }
    % dernière itération -> flèches tracées AVANT \\ sinon bug !?
    \setcounter{noeud}{0}\setcounter{numvr}{0}\setcounter{ZI}{0}
    \stepcounter{ligne} #2    
    % tracé des flèches 
    \addtocounter{noeud}{-1} % 1 flèche de moins que le nb de nœuds
    \setcounter{numdiscont}{1}
    \multido{\Ix=1+1,\Iy=2+1}{\thenoeud}{
        \ifthenelse{\value{discont\thenumdiscont}=\Ix}{
            % on saute les discontinuités
            \stepcounter{numdiscont}}{
            % sinon on trace la flèche N1->N2 puis N2->N3, etc.
            \fleche{N\Ix}{N\Iy} 
        }
    }
    % tracé des pointillés pour les valeurs remarquables
    \multido{\Ix=1+1}{\thenumvr}{\vrconnect{X\Ix}{Y\Ix}}    
    \\ % dernier retour ligne du tableau
}
%    \end{macrocode}
% \end{macro}

% \subsection{Les commandes de positionnement}
%
% \begin{macro}{\pos}
% \cmd{\pos}\oarg{opt}\marg{ligne}\marg{valeur} 
% sert à positionner les valeurs dans la partie variations.
% \meta{ligne} désigne la ligne où il faut placer \meta{valeur} et produire le nœud
% (numéroté avec le compteur |noeud| et défini en appelant la commande |\noeud|).
% Les lignes de variations sont numérotées \emph{du haut vers le bas} 
% (et les lignes de signes portent toutes le numéro 0).
% Le 1\ier\ argument optionnel, |c| (centered, par défaut), |t| (top) ou |b| (bottom),
% est utilisé pour le positionnement des flèches.\\
% \DescribeMacro{\pos*}
% Dans la version étoilée, \cmd{\pos*}\marg{ligne}\marg{valeur}, la différence 
% est qu'aucun nœud n'est créé. Ceci est utile en particulier pour la colonne de base, 
% contenant les légendes.
%    \begin{macrocode}
\newcommand*{\@pos}[3][c]{
    \stepcounter{noeud}
    \ifthenelse{\theligne=#2}{
        \noeud[#1]{N\thenoeud}{#3}
    }{} % si ligne != #2, on ne fait rien
}
\newcommand*{\@@pos}[2]{\ifthenelse{\theligne=#1}{#2}{}}
\newcommand*{\pos}{\@ifstar{\@@pos}{\@pos}}
%    \end{macrocode}
% \end{macro}

% Voici quelques alias utiles qui peuvent être utilisés 
% à la place des commandes |\pos| et |\pos*|.
% \begin{macro}{\haut}
% \cmd{\haut}\marg{valeur} =  \cmd{\pos}|{1}|\marg{valeur}.
%    \begin{macrocode}
\newcommand*{\haut}{\pos{1}}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\bas}
% \cmd{\bas}\marg{valeur} =  \cmd{\pos}|{3}|\marg{valeur}.
%    \begin{macrocode}
\newcommand*{\bas}{\pos{3}}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\mil}
% \cmd{\mil}\marg{valeur} =  \cmd{\pos*}|{2}|\marg{valeur}.
%    \begin{macrocode}
\newcommand*{\mil}{\pos*{2}}
%    \end{macrocode}
% \end{macro}

% Voici enfin deux macros qui permettent si besoin d'ajuster le positionnement
% (en plus des commandes \LaTeX\ |\hspace| ou |\makebox|).
% \begin{macro}{\zbox}
% Place son contenu dans une boite de largeur nulle : affiche le contenu
% mais considère que l'espace occupé est nul pour le calcul des largeurs de colonne.
% Sa syntaxe est :
% |\zbox|\oarg{pos}\marg{contenu} où \meta{opt} = |c| (par défaut), |l| (left) ou |r| (right).
%    \begin{macrocode}
\newcommand*{\zbox}[2][c]{\makebox[0pt][#1]{$#2$}}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\vdecal}
% Décalage vertical : \cmd{\vdecal}\marg{decal}\marg{contenu}, 
% le 1\ier\ paramètre est le décalage 
% (positif = vers le haut ou négatif = vers le bas), le second est le contenu à placer.
%    \begin{macrocode}
\newcommand*{\vdecal}[2]{\smash{\raisebox{#1}{$#2$}}}
%    \end{macrocode}
% |\smash| a pour effet d'annuler la hauteur de la boite afin de ne pas agrandir
% la ligne courante.
% \end{macro}

% \subsection{Barres, discontinuités et valeurs remarquables}
%
% \begin{macro}{\bb}
% La macro |\bb|, qui produit une double barre,
% provient de l'extension \textsf{variations} de Christian Obrecht
% |\def\bb{\vrule\kern1pt\vrule}|.
% Nous avons ajouté 1\,pt d'espace avant et après, afin d'éviter le contact
% entre la double barre et les limites à gauche ou à droite.
%    \begin{macrocode}
\newcommand*{\bb}{\kern1pt\vrule\kern1pt\vrule\kern1pt}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\barre}
% La macro |\barre| permet de tracer une barre verticale
% pour marquer les séparations de colonne dans un tableau de signe, en passant
% à travers les 0. 
% Son aspect est contrôlé par les paramètres |\tvbarrewidth| et |\tvbarrecolor|.
% Sa syntaxe est :
% |\barre|\oarg{valeur} où, en général, on met 0 comme argument optionnel.
%    \begin{macrocode}
\newcommand*{\barre}[1][]{\makebox[0pt]{$#1$}
    \color{tvbarrecolor}
    \vrule width \tvbarrewidth
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\discont}
% Associe un numéro de nœud à un compteur de discontinuité
% (chaque discontinuité a son propre compteur).
% La flèche entre le nœud précédent |\discont| (enregistré dans le compteur)
% et le nœud suivant ne sera pas tracée.
%    \begin{macrocode}
\newcommand*{\discont}{
    \ifthenelse{\theligne=1}{ 
        % on ne compte les discontinuités qu'une seule fois, sur ligne 1
        \stepcounter{numdiscont}
        \setcounter{discont\thenumdiscont}{\thenoeud}
        }{}
    }
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\bblim}
% Sert à positionner correctement des limites à gauche et à droite 
% d'une double barre en conservant le centrage de la double barre.
% Cette macro trace la double barre, place les limites et appelle |\discont|.
% Le principe est que lorsqu'on place la plus large des deux valeurs 
% d'un côté de la double barre, on place une boite fantôme de même largeur 
% de l'autre côté ; quant à la plus étroite des deux valeurs, 
% elle est placée dans une |\zbox| qui annule sa largeur.
% Sa syntaxe est : \\
% |\bblim|\marg{ligne gauche}\marg{limite gauche}\marg{ligne droite}\marg{limite droite}
%    \begin{macrocode}
\newsavebox{\@tvlbox}
\newsavebox{\@tvrbox}
\newcommand*{\bblim}[4]{
    \sbox{\@tvlbox}{$#2$}
    \sbox{\@tvrbox}{$#4$}
    \ifdim \wd\@tvlbox > \wd\@tvrbox
        \pos{#1}{#2} \bb\discont
        \zbox[l]{\pos{#3}{#4}} \pos*{#1}{\phantom{#2}}
    \else
        \pos*{#3}{\phantom{#4}} \zbox[r]{\pos{#1}{#2}}
        \bb\discont \pos{#3}{#4}
    \fi
}
%    \end{macrocode}
% \end{macro}

% \begin{macro}{\vr}
% La commande |\vr| fabrique un nœud pour chaque valeur remarquable.
% Les nœuds sont désignés par X1, X2, \ldots\ sur la ligne des $x$
% et Y1, Y2, \ldots\ sur les lignes de variations.
% Sa syntaxe est : \cmd{\vr}\oarg{ligne}\marg{valeur}.
% Le paramètre optionnel \meta{ligne} vaut 2 par défaut pour Y, 
% et n'est pas pris en compte pour X (ligne 0),
% le second paramètre est la valeur à afficher.
% Les nœuds seront ensuite reliés par la commande |\vrconnect| 
% (appelée par |\variations|) en fonction de leur numéro.
%    \begin{macrocode}
\newcommand*{\vr}[2][2]{% ligne 2 par défaut sauf sur ligne 0
    \stepcounter{numvr}
    \ifthenelse{\theligne=0}{
        \noeud{X\thenumvr}{#2}
        }{
        \ifthenelse{\theligne=#1}{
            \noeud{Y\thenumvr}{#2}
        }{}
    }
}
%    \end{macrocode}
% \end{macro}

% \subsection{Zones interdites}
%
% \begin{macro}{\ZIc}
% Commande sans argument qui produit une zone interdite colorée.
% À placer dans les intervalles voulus. La densité de gris ou la couleur 
% peuvent être modifiées en redéfinissant la macro.
%    \begin{macrocode}
\newcommand{\ZIc}{\discont \cellcolor[gray]{0.7}}
%    \end{macrocode}
% \end{macro}

% La macro |\ZIh| \DescribeMacro{\ZIh} sert à produire une zone interdite hachurée.
% Le tracé des hachures n'est déclenché 
% que sur la dernière ligne des variations, les appels à |\ZIh| sur les lignes
% précédentes ne font que cumuler hauteur (|\ht|) et profondeur (|\dp|) de la ligne.
% Dans une ligne de signe, il ne faut qu'\emph{un seul appel} à |\ZIh|, 
% qui peut être placé n'importe où. 
% En effet, pour les lignes d'indice 0, la macro ne sait pas
% s'il y a eu un changement de ligne, donc elle cumule systématiquement la hauteur
% à chaque appel.
% Par contre, dans la partie variations, les |\ZIh| doivent être placés 
% autant de fois que nécessaire, dans les intervalles voulus.\\
% La macro possède un paramètre optionnel |\ZIh|\oarg{hauteur}
% qui est un supplément de hauteur global,
% permettant de faire un ajustement fin si des lignes ont été agrandies 
% à cause de leur contenu (grandes fractions par exemple).\\
% Limitation : fonctionne moins bien avec \tikz\ (sensible à la taille de police).
%
% La macro |ZIh*| \DescribeMacro{\ZIh*} 
% (appelée par |\ZIh| sur la dernière ligne des variations) 
% déclenche le tracé d'un rectangle de hachures en appelant la commande |\hachure|.
% Elle utilise les dimensions précédemment enregistrées dans les variables de dimension
% (par |\ZIh|). Dans un tableau de signes sans partie variations 
% elle doit être placée sur la dernière ligne à la place de |\ZIh|
% (pour les lignes précédentes). Elle possède le même argument optionnel \oarg{hauteur}.
%    \begin{macrocode}
\newcommand*{\@ZI}[1][0pt]{%
    \discont
    \ifthenelse{\theligne=\value{ZIvarlignes}}{\@@ZI[#1]}{%
        \ifthenelse{\theligne=0 \or \theZI=0}{%
            % on ne doit cumuler la hauteur qu'une fois par ligne
            % => une seule occurrence de la macro sur une ligne 0
            \global\advance\ZIheight by \ht\@arstrutbox
            \global\advance\ZIheight by \dp\@arstrutbox
        }{}
    }
    \stepcounter{ZI} % RAZ par \variations à chaque ligne
}

\newcommand*{\@@ZI}[1][0pt]{% \discont inutile ici
    \ifthenelse{\theZIstar=0}{% cumul des longueurs 1 seule fois
        \global\advance\ZIheight by \ht\@arstrutbox
        \global\advance\ZIheight by #1
        \global\advance\ZIdepth by \dp\@arstrutbox
        \global\advance\ZIwidth by \innercolsep
        \global\advance\ZIwidth by \innercolsep
        \global\advance\ZIwidth by 2pt % espace autour doubles barres
    }{}
    \hachure{-0.5\ZIwidth,-\ZIdepth}{0.5\ZIwidth,\ZIheight}
    \stepcounter{ZIstar}
}

\newcommand*{\ZIh}{\@ifstar{\@@ZI}{\@ZI}}
%    \end{macrocode}

% \Finale
\endinput