summaryrefslogtreecommitdiff
path: root/info/impatient/fr/ftips.tex
blob: 3ac05807cb909e194f5916bc11c86bf6bed5c566 (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
% This is part of the book TeX for the Impatient.
% Copyright (C) 2003 Paul W. Abrahams, Kathryn A. Hargreaves, Karl Berry.
% Copyright (C) 2004 Marc Chaudemanche pour la traduction française.
% See file fdl.tex for copying conditions.

\input fmacros
\chapter{Trucs et astuces}

\chapterdef{tips}

\TeX\ est un programme complexe qui travaille parfois de fa\c con 
myst\'e\-rieuse.  Dans cette section nous vous offrons quelques trucs 
pour r\'esoudre les probl\`emes que vous pourrez rencontrer et expliquer 
quelques techniques pratiques.


\section  Corriger de mauvaises coupures de page

\bix^^{coupures de page//mauvaises}
Parfois \TeX\ coupe une page juste au milieu du mat\'eriel que vous voulez
garder ensemble.---par exemple, une ent\^ete de section et le texte qui la 
suit ou une courte suite d'items li\'es. Il y a deux moyens de corriger la
situation~:
\ulist\compact
\li Vous pouvez forcer le mat\'eriel \`a rester ensemble.
\li Vous pouvez forcer une coupure de page \`a un endroit diff\'erent.
\endulist

La plus simple fa\c con de forcer \TeX\ a garder le mat\'eriel ensemble sur une 
page est de l'englober dans un vbox en utilisant la commande |\vbox| 
\ctsref{\vbox}.
^^|\vbox//emp\^echer des coupures de page avec|
Une vbox est normalement meilleure qu'une hbox pour faire cela parce que le 
plus souvent, le mat\'eriel \`a garder ensemble, par exemple, une suite de 
paragraphes, sera du mat\'eriel en mode vertical. Vous pouvez faire pr\'ec\'eder et 
suivre la vbox par une commande de paragraphe implicite ou explicite (soit 
une ligne blanche, soit un |\par|)~; autrement \TeX\ pourrait essayer de 
faire la partie vbox sur un paragraphe adjacent. La m\'ethode vbox a une 
limitation importante~: vous ne pouvez pas l'appliquer \`a une portion de 
texte inf\'erieure a un paragraphe.

Vous pouvez parfois garder les lignes d'un paragraphe ensemble en
l'englobant dans un groupe et en donnant \`a |\interlinepenalty|
\ctsref{\interlinepenalty} 
la valeur $10000$ au d\'ebut du groupe (ou n'importe o\`u avant la fin du
paragraphe).
Cette m\'ethode demandera \`a \TeX\ de consid\'erer les coupures de page dans ce 
paragraphe comme \'etant infiniment ind\'esirables.
N\'eanmoins~; si toutes les coupures de page que \TeX\ peut trouver sont
infiniment ind\'esirables, il coupera la page dans le paragraphe quand m\^eme.

Une commande ^|\nobreak| (\xref{vnobreak})
apr\`es la fin d'un paragraphe emp\`eche \TeX\
de couper la page sur l'item suivant
(a moins que cet item provoque un penalty inf\'erieur \`a $10000$).
C' est aussi la meilleure fa\c con d'emp\^echer une coupure de page apr\`es une ent\^ete,
puisque une ent\^ete r\'eagit normalement comme un paragraphe.
Le |\nobreak| doit suivre la ligne blanche ou le |\par| qui termine
la paragraphe pour que \TeX\ ne traite pas le |\nobreak| comme faisant partie
du paragraphe.
Pour que le |\nobreak| soit effectif, il doit aussi \^etre plac\'e avant
tout point de coupure l\'egal \`a la fin du paragraphe.
Le ressort que \TeX\ ins\`ere avant le paragraphe suivant est comme un point
de coupure,
et ainsi pour tout ressort vertical que vous ins\'erez explicitement apr\`es un
paragraphe.
Ainsi, le |\nobreak| doit normalement \^etre la toute premi\`ere chose apr\`es
la fin du paragraphe ou de l'ent\^ete.

Vous pouvez utiliser la commande ^|\eject| \ctsref{\eject}
pour forcer \TeX\ \`a couper une page \`a un endroit
particulier.  Dans un paragraphe, vous pouvez utiliser la combinaison 
`|\vadjust{\vfill\eject}|' 
\ctsref{\vadjust}
^^|\vadjust|
pour forcer une coupure apr\`es la prochaine ligne de sortie compl\`ete.
La raison de faire pr\'ec\'eder |\eject| par ^|\vfill| 
\ctsref{\vfill} est d'obliger
\TeX\ \`a remplir la page avec un espace blanc.  
De toute fa\c con, utiliser |\eject| pour r\'esoudre des probl\`emes de coupure de page
a un d\'esavantage majeur~:
si les fronti\`eres de page de votre document changent,
les coupures de page que vous avez ins\'er\'ees peuvent ne plus \^etre l\`a o\`u vous 
les voulez.

Si vous ne procurez pas \`a \TeX\ une commande |\vfill| pour remplir la page
apr\`es un |\eject|,
\TeX\ redistribue l'espace blanc exc\'edentaire le mieux qu'il peut et alors 
se plaint g\'en\'eralement d'un 
``underfull |\vbox| (badness $10000$) has occurred while |\output| is active.''
Vous pouvez rencontrer un probl\`eme similaire avec
toutes les m\'ethodes mentionn\'ees ci-dessus pour englober du
mat\'eriel que vous voulez garder li\'e.

La commande ^|\filbreak| \ctsref\filbreak{}
\xrdef{filbreak}
procure un moyen de garder les lignes d'un ou plusieurs paragraphes
(ou autre mat\'eriel de mode vertical) li\'e sur une page.
Si vous englobez un paragraphe entre |\filbreak|, \TeX\ ignorera effectivement
les |\filbreak| si le paragraphe d\'ebute sur la page courante et
coupe la page avant le premier |\filbreak| si le paragraphe ne d\'ebute pas.
Si vous mettez des |\filbreak| autour de chaque paragraphe dans une s\'equence de paragraphes,
comme ceci~:
{\obeylines\display{
{\tt \\filbreak}
\<paragraph>
{\tt \\filbreak}
\<paragraph>
{\tt \\filbreak}
\leavevmode\indent\vdots
\<paragraph>
{\tt \\filbreak}
}}
%\vfil\eject
\noindent
\TeX\ gardera les lignes de chaque paragraphe li\'es sur une page.
Si \TeX{} coupe une page sur un |\filbreak|, il remplira le bas de la
page avec un espace blanc.

Parfois vous pourrez demander \`a \TeX\ de modifier la longueur d'une page 
en changeant le param\`etre ^|\looseness| \ctsref\looseness{} pour un ou plusieurs paragraphes.
Rendre un |\looseness| n\'egatif dans un paragraphe fait que \TeX\ essaye de 
s\'eparer le paragraphe en moins de lignes~; le rendre positif fait que \TeX\ essaye 
d'\'etendre le paragraphe en plus de lignes.  Le d\'esavantage de changer |\looseness|
est que l'espacement inter-mot de la r\'egion affect\'e ne sera pas optimal.
Vous pouvez obtenir plus d'information sur le fa\c con dont \TeX\ appr\'ehende 
les coupures de ligne en mettant |\tracingpages| (\xref\tracingpages) \`a $1$.


\section Pr\'eserver la fin d'une page

Parfois vous avez besoin de modifier quelque chose sur une seule page et vous 
voulez \'eviter de r\'eimprimer tout le document. Si vos modifications ne changent
pas trop la page, il y a de l'espoir. Vous devez modifier la fin de la page
pour qu'elle tienne au m\^eme endroit~;
les m\'ethodes sont similaires \`a celles pour modifier une mauvaise coupure de page.

Si la fin de la page originale se trouve entre des paragraphes, vous pouvez
forcer une coupure de page au m\^eme endroit en utilisant toutes les m\'ethodes
que nous avons d\'ecrites plus haut. Autrement, vous devez forcer une coupure de
ligne \emph{et} une coupure de page \`a un endroit particulier. Si la nouvelle 
page est plus courte que l'ancienne, la s\'equence~:
\csdisplay
\vadjust{\vfill\eject}\break
|
^^|\vadjust|
devrait faire l'affaire.
Mais si la nouvelle page est plus longue,
le probl\`eme est plus difficile parce que \TeX\ a probablement d\'ej\`a compress\'e 
la page aussi fermement qu'il le peut. Vos seuls espoirs dans ce cas sont
de mettre ^|\looseness| \ctsref\looseness{} \`a une valeur n\'egative, pour 
raccourcir certains sauts verticaux sur la page, pour ajouter un peu de
r\'etr\'ecissement ^|\parskip| (\xref\parskip) s'il \'etait diff\'erent de z\'ero, ou, 
en dernier recours, diminuer |\baselineskip| \ctsref{\baselineskip} 
encore plus fermement.
^^|\baselineskip//et pr\'eservation de fin de page|

\section Garder de l'espace en haut d'une page

\null
^^{espace vertical//r\'eserver en haut d'une page}
Vous pouvez utiliser habituellement la commande |\vskip| \ctsref\vskip{}
pour garder de l'espace vertical sur une page.
Cela ne marche pas en haut d'une page, toutefois, car
\TeX\ abandonne le ressort, les cr\'enages et les p\'enalit\'es qui arrivent juste
apr\`es une coupure de page.
^^{coupures de page//ressort sur}
Utilisez la commande ^|\topglue| \ctsref\topglue\ \`a la place~; il produit 
un ressort qui ne dispara\^\i t jamais.
\eix^^{coupures de page//mauvaises}



\section Corriger de mauvaise coupure de ligne

\null
\bix^^{coupures de ligne//mauvaises}
Si \TeX\ coupe une ligne au milieu du mat\'eriel que vous voulez garder
sur une seule ligne, il y a plusieurs  moyens de corriger la situation~:
\ulist\compact
\li Vous pouvez forcer une coupure \`a un endroit proche avec la commande
|\break| (\xref{hbreak}).
^^|\break//corriger des coupures de ligne avec|
\li Vous pouvez ins\'erer un tilde (|~|) entre deux mots
(see \xref{@not}) pour emp\^echer une coupure entre eux \ttidxref{~}
\li Vous pouvez signaler \`a \TeX\ des c\'esures qu'il ne consid\`ererait pas
autrement en ins\'erant une ou plusieurs c\'esures optionnelles dans plusieurs 
mots (voir |\-|, \xref{\@minus}).
\ctsidxref{-//sur une coupure de ligne}
^^{c\'esures optionnelles//mauvaises coupures de ligne, corriger avec}
\li Vous pouvez englober plusieurs mots dans une hbox en utilisant la
commande ^|\hbox| \ctsref{\hbox}.
\endulist

Le d\'esavantage de toutes ces m\'ethodes, \`a part l'insertion de c\'esures 
optionnelles, est qu'elles rendent impossible pour \TeX\ de trouver un jeu
de coupures de ligne satisfaisant. Si cela arrive n\'eanmoins, \TeX\ trouvera
une ou plusieurs bo\^\i tes trop ou pas assez pleines et s'en plaindra.
^^{underfull boxes} ^^{overfull boxes}
La m\'ethode hbox a un d\'esavantage de plus~: parce que \TeX\ voit une hbox
comme une entit\'e simple sans consid\'erer son contexte, l'espace entre les mots 
dans la hbox peut ne pas \^etre coh\'erent avec celui du reste de la ligne.
\eix^^{coupures de ligne//mauvaises}


\section Corriger des bo\^\i tes trop ou pas assez pleines

\null
\bix^^{overfull boxes}
\bix^^{underfull boxes}
\bix^^{\boites//overfull}
\bix^^{\boites//underfull}
Si \TeX\ se plaint d'une bo\^\i te trop pleine, cela signifie que vous avez mis
plus de mat\'eriel dans une bo\^\i te qu'elle ne peut en contenir.  
Similairement, si \TeX\ se plaint d'une bo\^\i te pas assez pleine, cela signifie 
que vous n'avez pas mis assez de mat\'eriel dans la bo\^\i te.  Vous pouvez rencontrer
ces plaintes dans de nombreuses circonstances diff\'erentes, donc, regardons
les plus communes~:

\ulist
\li Une bo\^\i te trop pleine d'une ligne d'un paragraphe indique que la ligne
\'etait trop longue et que \TeX\ ne peut pas r\'earranger le paragraphe pour 
rendre la ligne plus courte. Si vous mettez ^|\emergencystretch|
\ctsref{\emergencystretch} \`a une valeur diff\'erente de z\'ero, cela peut
r\'esoudre  le probl\`eme en autorisant \TeX\ \`a mettre plus d'espace entre les
mots. Une autre solution est de mettre |\tolerance| \ctsref{\tolerance}
\`a $10000$, mais c'est un peu comme \'emettre des lignes avec beaucoup trop 
d'espace. Sinon, une autre solution est d'ins\'erer une c\'esure optionnelle
^^{c\'esures optionnelles//overfull boxes, corriger avec}
dans un mot critique que \TeX\ ne sait pas couper.
Si tout cela ne suffit pas, vous pourriez essayer de r\'e\'ecrire le paragraphe.
Une solution qui est rarement satisfaisante est d'augmenter ^|\hfuzz| \ctsref\hfuzz,
autorisant ainsi \TeX\ de construire des lignes qui d\'epassent dans la marge droite.

\li Une bo\^\i te pas assez pleine d'une ligne d'un paragraphe indique que la ligne
\'etait trop courte et que \TeX\ ne peut pas r\'earranger le paragraphe pour 
rendre la ligne plus longue.
\TeX\ formera de telles lignes en \'etirant ses espaces inter-mots au del\`a de leurs
limites normales. Deux des solutions pour des lignes trop pleines mentionn\'ees ci-dessus
s'appliquent aussi aux lignes pas assez pleines~:
ins\'erer des c\'esures optionnelles et r\'e\'ecrire le paragraphe.
Des lignes pas assez pleines ne vous g\^eneront pas si vous utilisez un
format justifi\'e \`a gauche, que vous pourrez obtenir avec la commande
^|\raggedright| \ctsref\raggedright.

\li La plainte~:
\csdisplay
Underfull \vbox (badness 10000) has occurred
   while \output is active
|
indique que \TeX\ n'a pas assez de mat\'eriel pour remplir une page.  La cause
probable est que vous avez utilis\'e des vbox pour garder du mat\'eriel ensemble
et \TeX\ a rencontr\'e une vbox pr\`es du bas d'une page qui ne peut pas rentrer
sur cette page.
Il a mis la vbox sur la page suivante, mais en ce faisant a laiss\'e trop
d'espace vide dans la page courante.
Dans ce cas vous pouvez soit ins\'erer plus d'espace quelque part sur la page
courante, soit couper la vbox en plus petites parties.

Une autre cause possible de cette plainte est d'avoir un long paragraphe
qui occupe une page enti\`ere sans coupure.
Puisque \TeX\ ne fait pas varier l'espacement entre les lignes,
il peut \^etre incapable de remplir un trou au bas de la page
d'un montant d'une fraction de l'espacement de la ligne.
Cela peut arriver si |\vsize| \ctsref{\vsize}, la longueur de la page,
n'est pas un multiple de |\baselineskip| \ctsref{\baselineskip}, l'espace
entre des lignes de bases cons\'ecutive.

Sinon, une autre cause de cette plainte,
similaire \`a la pr\'ec\'edente, est d'avoir mis ^|\parskip| \ctsref{\parskip},
le ressort inter-paragraphes \`a une valeur qui n'a pas assez d'\'etirement ou de
r\'etr\'ecissement. Vous pouvez r\'esoudre ces deux derniers probl\`emes en augmentant
^|\vfuzz| \ctsref\vfuzz.

\li La plainte
\csdisplay
Overfull \vbox (296.30745pt too high) has occurred
   while \output is active
|
indique que vous avez construit une vbox qui est plus longue que la page.  
vous devriez juste la faire plus courte.

\li 
\bix^^|\hbox//overfull box provenant de|
\bix^^|\vbox//overfull box provenant de|
Les seules solutions pour une hbox ou une vbox trop pleine que vous avez 
construit avec les commandes |\hbox| or |\vbox| 
(\pp\xrefn\hbox, \xrefn\vbox)
sont de sortir quelque chose de la bo\^\i te, ins\'erer un ressort n\'egatif avec
^|\hss| ou ^|\vss| (\xref\hss) ou d'augmenter la taille de la bo\^\i te.

\li Si vous rencontrez une hbox ou une vbox pas assez pleine que vous avez 
construit avec |\hbox| ou |\vbox|, vous feriez mieux normalement de remplir 
la bo\^\i te avec ^|\hfil| ou ^|\vfil| (\xref\hfil).
\eix^^|\hbox//overfull box provenant de|
\eix^^|\vbox//overfull box provenant de|

\endulist
\eix^^{\boites//overfull}
\eix^^{\boites//underfull}
\eix^^{overfull boxes}
\eix^^{underfull boxes}


\section Retrouver des espaces entre-mots perdus

\null
^^{espace//perdu}
^^{mots trop rapproch\'es}
Si vous trouvez que \TeX\ a trop rapproch\'e deux mots, la cause courante
est une s\'equence de contr\^ole qui a absorb\'e l'espace qui la suit.  Mettre 
un ^{espace contr\^ol\'e} (|\!visiblespace|) apr\`es la s\'equence de contr\^ole.


\section \'Eviter des espaces entre-mots non d\'esir\'es

\null
\bix^^{espace//non d\'esir\'e}\xrdef{unwantedspace}
Si vous obtenez un espace dans votre document o\`u vous ne vouliez et ne
pensiez pas en avoir, la cause la plus courante, d'apr\`es notre exp\'erience,
est une fin de ligne ou un espace apr\`es une accolade.
^^{accolades//espace apr\`es}
(Si vous faites de jolies choses avec les codes de cat\'egories,
^^{codes de cat\'egorie//cause d'espaces non d\'esir\'es}
vous avez introduit beaucoup d'autres causes toutes aussi sympathiques.)
Normalement, \TeX\ traduit une fin de ligne par un espace, et consid\`ere
un espace apr\`es une accolade ouvrante ou fermante comme significatif.

Si l'espace non d\'esir\'e est caus\'e par un espace apr\`es une accolade dans
une ligne d'entr\'ee, retirez-le.
Si l'espace non d\'esir\'e est caus\'e par une accolade \`a la fin d'une ligne
d'entr\'ee, mettez une `|%|' imm\'ediatement apr\`es l'accolade.
{\recat!ttidxref[%//pour \'eliminer des espaces non d\'esi\-r\'es]]
Le `|%|' d\'ebute un commentaire, mais ce commentaire ne n\'ecessite aucun
texte.

Une d\'efinition de macro peut aussi
introduire des espaces non d\'esir\'es si vous ne les avez pas \'ecrites
soigneusement.  Si vous obtenez des espaces non d\'esir\'es quand vous appelez
une macro, v\'erifiez sa d\'efinition pour \^etre s\^ur que vous n'avez pas un
espace non d\'esir\'e apr\`es une accolade ou que vous n'avez pas termin\'e une ligne
de la d\'efinition imm\'ediatement apr\`es une accolade.
On termine souvent une ligne de d\'efinition de macro apr\`es une accolade pour
rendre la d\'efinition plus lisible.
Par s\'ecurit\'e, mettez un `|%|' apr\`es toute accolade qui termine une ligne de
d\'efinition de macro.
Il n'est peut-\^etre pas n\'ecessaire, mais il ne fera pas de mal.\footnote{
Il faut reconna\^\i tre qu'il n'y a que de rares cas o\`u vous avez r\'eellement
besoin d'une fin de ligne apr\`es une accolade.}

Si vous avez du mal \`a localiser la source d'un espace non d\'esir\'e, essayez
de mettre |\tracingcommands| \ctsref{\tracingcommands} \`a $2$.
Vous obtiendrez une commande |{blank space}| dans le fichier log pour chaque 
espace que voit \TeX.

Cela aide de conna\^\i tre les r\`egles d'espace de \TeX~:

\olist
\li Des espaces sont ignor\'es au d\'ebut des lignes d'entr\'ee.
\li Des espaces en fin de ligne d'entr\'ee sont ignor\'es en \emph{toute}
circonstance, bien que la fin de ligne elle-m\^eme soit trait\'ee comme un espace.
(une ligne compl\`etement blanche, n\'eanmoins, g\'en\`ere un token |\par|.)
\li De multiples espaces sont trait\'es comme un espace simple, mais
seulement si ils apparaissent ensemble dans votre entr\'ee.
Ainsi un espace suivant les arguments d'un appel de macro n'est pas combin\'e
avec l'espace final produit par l'appel de macro.  \`A la place, vous 
obtenez deux espaces.
\li Des espaces sont ignor\'es apr\`es des mots de contr\^ole.
\li Des espaces sont de fait ignor\'es apr\`es des nombres, des dimensions
et le `|plus|' et le `|minus|' des sp\'ecifications de ressort.%
\footnote{En r\'ealit\'e, \TeX\ n'ignore qu'un seul espace \`a cet endroit. 
Puisque des espaces multiples sont habituellement r\'eduits \`a un seul espace, 
pourtant, l'effet est d'ignorer tout nombre d'espaces.}
\endolist
\noindent Si vous avez chang\'e le code de cat\'egorie de l'espace ou du caract\`ere
fin de ligne, oubliez tout cela.
\eix^^{espace//non d\'esir\'e}


\section \'Eviter un exc\`es d'espace autour d'un affichage

\null
^^{math\'ematiques affich\'ees}
Si vous obtenez trop d'espace au dessus d'un affichage math\'ematique, c'est peut \^etre
parce que vous avez laiss\'e une ligne blanche dans votre entr\'ee avant l'affichage.
La ligne blanche d\'ebute un nouveau paragraphe et met \TeX\ en mode 
vertical.  Quand \TeX\ voit un `|$|' en mode vertical, il rebascule vers 
le mode horizontal et ins\`ere le ressort inter-paragraphes (|\parskip|) suivie par
le ressort inter-lignes (|\baselineskip|).
Ensuite, quand il d\'ebute l'affichage lui-m\^eme,
il ins\`ere \emph{plus} de ressort (soit ^|\abovedisplayskip|,
soit ^|\abovedisplayshortskip|, selon la longueur de la ligne pr\'ec\'edente).  
Ce dernier ressort est le seul que vous d\'esirez.
Pour \'eviter d'obtenir un ressort inter-paragraphe ainsi, ne laissez pas de
ligne blanche au dessus des affichages math\'ematiques ou autrement
terminez un paragraphe (avec |\par|, disons) juste avant un affichage math\'ematique.

Similairement,
si vous obtenez trop d'espace apr\`es un affichage math\'ematique, c'est peut-\^etre
parce que vous avez laiss\'e une ligne blanche dans votre entr\'ee apr\`es l'affichage,
retirez le simplement.


\section \'Eviter un exc\`es d'espace apr\`es un paragraphe

Si vous obtenez trop d'espace vertical apr\`es un paragraphe qui a \'et\'e produit
par une macro, vous devez avoir eu un ressort inter-paragraphe produit par la
macro, un paragraphe vide, et ensuite encore un ressort inter-paragraphe.
Vous pouvez d\'ebarrasser du saut du second paragraphe en ins\'erant~:
\csdisplay
\vskip -\parskip
\vskip -\baselineskip
|
juste apr\`es l'appel de la macro.
Si vous avez toujours ce probl\`eme avec une certaine macro, vous pouvez mettre
ces lignes \`a la fin de la d\'efinition de macro \`a la place.
Vous pourriez aussi r\'esoudre le probl\`eme en ne laissant jamais de ligne
blanche apr\`es l'appel de macro---si vous voulez une ligne blanche simplement
pour rendre votre saisie plus lisible, commencez la par un `|%|'.


\section Changer la forme du paragraphe

\null
\bix^^{paragraphes//forme}
Plusieurs param\`etres de \TeX---^|\hangindent|, ^|\leftskip|, etc.---%
affectent la fa\c con dont \TeX\ forme des paragraphes et les coupe en lignes.
^^{coupures de ligne}
Ces param\`etres sont utilis\'es indirectement dans des commandes \plainTeX{}
telles que ^|\narrower| et ^|\hang|~; vous pouvez aussi les assigner directement.
Si vous avez utilis\'e une de ces commandes (ou chang\'e un de ses param\`etres),
mais que le changement de commande ou de param\`etre ne semble pas avoir le
moindre effet sur un paragraphe, le probl\`eme peut \^etre que vous avez termin\'e
un groupe avant d'avoir termin\'e le paragraphe. Par exemple~:
\csdisplay
{\narrower She very soon came to an open field, with
a wood on the other side of it: it looked much darker
than the last wood, and Alice felt a little timid
about going into it.}
|
Ce paragraphe ne sera par compos\'e en resserr\'e parce que l'accolade fermante
termine le groupe |\narrower| avant que \TeX\ ait eu une chance de
couper le paragraphe en lignes.  \`a la place, mettez un |\par| avant 
l'accolade fermante~; ensuite vous  obtiendrez l'effet que vous voulez.
^^|\par//en changeant la forme du paragraphe|
\eix^^{paragraphes//forme}


\section Mettre des paragraphes dans une bo\^\i te

Supposez que vous ayez quelques paragraphes de texte que vous voulez mettre 
\`a un endroit particulier sur la page.  La mani\`ere \'evidente de faire cela est
d'englober les paragraphes dans une hbox d'une taille appropri\'ee et ensuite de
placer la hbox o\`u vous voulez qu'elle soit. H\'elas, la mani\`ere \'evidente
ne marche pas parce que \TeX\ ne fait pas de coupure de ligne dans 
le mode horizontal restreint.
^^{mode restreint//horizontal}
Si vous l'essayez,
vous obtiendrez un message d'erreur trompeur vous sugg\'erant que vous
avez oubli\'e la fin d'un groupe.
Le moyen de contourner cette restriction est d'\'ecrire~:
\csdisplay
\vbox{\hsize = !<dimen> !dots !<paragraphs> !dots}
|
o\`u \<dimen> est la longueur de ligne que vous voulez pour les paragraphes.
C'est ce dont vous avez besoin, en particulier, quand vous voulez englober 
des paragraphes dans une bo\^\i te (une bo\^\i te entour\'ee de traits droits, pas une 
bo\^\i te \TeX).

\section Dessiner des lignes

\null
\bix^^{filets}
Vous pouvez utiliser les commandes ^|\hrule| et ^|\vrule| (\xref\hrule)
pour tracer des lignes, c'est-\`a-dire, des filets.  Vous devez
savoir (a)~o\`u vous pouvez utiliser chaque commandes et
(b)~comment \TeX\ d\'etermine les longueurs des filets quand
vous n'avez pas donn\'e les longueurs explicitement.
\ulist
\li Vous pouvez utiliser |\hrule| quand \TeX\ est dans un mode vertical et |\vrule|
quand \TeX\ est dans un mode horizontal.
Ces r\`egles signifient que 
vous ne pouvez mettre un filet horizontal dans une hbox ou un filet vertical
dans une vbox.
Vous pouvez, n\'eanmoins, construire un filet horizontal qui semble vertical en
sp\'ecifiant les trois dimensions et en le rendant grand et fin.
De m\^eme, vous pouvez construire un filet vertical qui semble horizontal
en le rendant court, plat et allong\'e.

\li Un filet horizontal \`a l'int\'erieur d'une vbox
a la m\^eme largeur que la vbox si vous n'avez pas
donn\'e la largeur du filet explicitement.
Des filets verticaux
\`a l'int\'erieur de hbox r\'eagissent de mani\`ere analogue.
Si vos filets ressortent trop longs ou trop courts,
r\'eglez les dimensions de la bo\^\i te englobante.
\endulist

Comme exemple, supposon que vous voulez produire~:
\display{%
\hbox{\vrule
   \vbox{\hrule\vskip 3pt
      \hbox{\hskip 3pt
          \vbox{\hsize .7in\raggedright
             \noindent Help! Let me out of here!}%
      \hskip 3pt}
   \vskip 3pt\hrule}%
\vrule}}
L'entr\'ee suivante le fera~:
\csdisplay
\hbox{\vrule
   \vbox{\hrule \vskip 3pt
      \hbox{\hskip 3pt
          \vbox{\hsize = .7in \raggedright
             \noindent Help!! Let me out of here!!}%
      \hskip 3pt}%
   \vskip 3pt \hrule}%
\vrule}
|
Nous devons mettre le texte dans un vbox de fa\c con \`a ce que \TeX\ 
l'ex\'ecute comme un paragraphe.
Les quatre niveaux d'embo\^\i tement sont r\'eellement
n\'ecessaires---si vous en doutez, essayez d'ex\'ecuter cet exemple avec moins de
niveaux.
\eix^^{filets}


\section Cr\'eer des ent\^etes ou des pieds de page multi-lignes

\null
\xrdef{bighead}
\bix^^{ent\^etes//multi-lignes}
\bix^^{pieds de page//multi-lignes}
Vous pouvez utiliser les commandes ^|\headline| et ^|\footline| 
(\xref\footline) pour produire des ent\^etes et des pieds de page, mais 
elles ne marchent pas proprement pour des ent\^etes et des pieds de page 
de plus d'une ligne. N\'eanmoins, vous pouvez obtenir des ent\^etes et des pieds
de page multi-lignes en red\'efinissant certaines des macros subsidiaires dans
la routine de sortie de \TeX.

Pour un ent\^ete multi-lignes, vous devez faire trois choses~:
\olist\compact
\li Red\'efinir la macro ^|\makeheadline| qui est appel\'ee de la routine de
sortie de \TeX.
\li Augmenter ^|\voffset| du montant d'espace vertical consomm\'e par les
lignes en plus.
\li Diminuer ^|\vsize| du m\^eme montant.
\endolist
\noindent L'exemple suivant montre comment vous pourriez faire cela~:
\csdisplay
\advance\voffset by 2\baselineskip
\advance\vsize by -2\baselineskip
\def\makeheadline{\vbox to 0pt{\vss\noindent
   Header line 1\hfil Page \folio\break
   Header line 2\hfil\break
   Header line 3\hfil}%
   \vskip\baselineskip}
|
Vous pouvez normalement suivre le mod\`ele de cette d\'efinition, substituez 
simplement vos propres lignes d'ent\^ete et choisissez un multiple de
|\baselineskip| appropri\'e (un de moins que le nombre de lignes dans l'ent\^ete).

Pour un pied de page multi-lignes, la m\'ethode est similaire~:
\olist
\li Red\'efinissez la macro ^|\makefootline| qui est appel\'ee 
de la routine de sortie de \TeX.
\li Diminuez ^|\vsize| du montant d'espace vertical consomm\'e par les
lignes en plus.
\endolist
\noindent L'exemple suivant montre comment vous pouvez faire cela~:
\csdisplay
\advance\vsize by -2\baselineskip
\def\makefootline{%
   \lineskip = 24pt
   \vbox{\raggedright\noindent
   Footer line 1\hfil\break
   Footer line 2\hfil\break
   Footer line 3\hfil}}
|
Encore une fois, vous pouvez normalement suivre le mod\`ele de cette d\'efinition.
La valeur de |\lineskip| d\'etermine le montant d'espace entre la ligne de
base de la derni\`ere ligne du texte principal sur la page et la ligne de 
base de la premi\`ere ligne du pied de page.
\eix^^{ent\^etes//multi-lignes}
\eix^^{pieds de page//multi-lignes}


\section Trouver des accolades orphelines

\bix^^{accolades//orphelines}
\xrdef{mismatched}
La plupart de temps, quand votre entr\'ee \TeX\ souffre d'accolades non concordantes, 
vous obtenez un diagnostic de \TeX\ assez proche de l'endroit o\`u vous avez 
r\'eellement fait l'erreur.
Mais une des erreurs les plus frustrantes que vous puissiez subir d'une 
ex\'ecution de \TeX,
juste avant que \TeX\ s'arr\^ete, est
la suivante~:
\csdisplay
(\end occurred inside a group at level 1)
|
Cela indique qu'il y a une accolade ouvrante en trop
ou une accolade fermante manquante quelque part
dans votre document, mais il ne vous donne aucune indication du tout
sur l'endroit o\`u le probl\`eme arrive.  Donc comment pouvez vous trouver~?

Un truc de d\'ebuggage que nous trouvons pratique est
d'ins\'erer la ligne suivante ou son \'equivalente
\`a cinq ou six endroits \'egalement espac\'es dans le document (et pas dans
un groupe connu)~:
\csdisplay
}% une fausse fermante
|
supposons que le probl\`eme soit une accolade ouvrante en trop.
Si elle est, disons entre la troisi\`eme et la quatri\`eme fausse fermante,
vous obtiendrez des messages d'erreur des trois premi\`eres fausses fermantes 
mais pas de la quatri\`eme. La raison est que \TeX\ ignorera les trois premi\`ere
fausses fermantes apr\`es s'en \^etre plaint, mais la quatri\`eme fausse fermante 
appariera l'accolade ouvrante en trop. Ainsi vous savez que l'accolade ouvrante
en trop est quelque part entre la troisi\`eme et la quatri\`eme fausse fermante.
Si la r\'egion de l'erreur est encore trop large pour que vous la trouviez,
enlevez simplement le jeu original de fausse fermantes et r\'ep\'etez le
processus dans cette r\'egion.
Si le probl\`eme est une accolade fermante manquante plut\^ot qu'une ouvrante en trop,
vous serez capable de la d\'ecouvrir quand vous aurez trouv\'e sa compagne.

Cette m\'ethode ne marche pas dans toutes les circonstances.  En particulier, 
elle ne marche pas si votre document consiste en plusieurs groupes r\'eellement grands.
Mais souvent vous pourrez trouver des variations de cette m\'ethode  qui vous
m\`eneront vers cette accolade insaisissable.

Si tout le reste \'echoue, essayez de raccourcir votre entr\'ee en retirant 
la derni\`ere moiti\'e du fichier
(apr\`es sauvegarde de la version originale d'abord~!) ou en ins\'erant une
commande |\bye| au milieu.
Si l'erreur persiste, vous saurez qu'elle est dans la premi\`ere moiti\'e~; 
Si \c ca tourne, vous saurez qu'elle est dans la seconde.
En r\'ep\'etant ce processus vous trouverez \'eventuellement l'erreur.
\eix^^{accolades//orphelines}


\section Fixer des dimensions

\null
\bix^^{\<dimension>}
La mani\`ere la plus simple de d\'efinir une dimension est de la sp\'ecifier directement, c'est-\`a-dire~:
\csdisplay
\hsize = 6in
|
Vous pouvez aussi sp\'ecifier une dimension en terme d'autres dimensions ou comme un m\'elange
de diff\'erentes unit\'es, mais c'est du boulot.  Il y a deux fa\c cons
de construire une dimension comme une combinaison~:
\olist\compact
\li Vous pouvez ajouter une dimension \`a un param\`etre de dimension ou \`a un registre de
dimension.
Par exemple~:
\csdisplay
\hsize = 6in \advance\hsize by 3pc % 6in + 3pc
|
\li Vous pouvez indiquer une dimension comme un multiple d'un param\`etre 
ou un registre de dimension ou de ressort.
Dans ce cas, \TeX\ convertit le ressort en une dimension en sacrifiant
l'\'etirement et le r\'etr\'ecissement. Par exemple~:
\csdisplay
\parindent = .15\hsize
\advance\vsize by -2\parskip
|
\endolist
\eix^^{\<dimension>}


\section Cr\'eer des polices composites

\null
\bix^^{polices//composites}
Il est parfois utile de cr\'eer une ``police composite'',
nomm\'ee par une s\'equence de contr\^ole $\cal F$, dans laquelle tous les caract\`eres
sont pris d'une police $f_1$ sauf pour certains qui sont emprunt\'es d'une autre
police $f_2$.
Vous pourrez alors mettre du texte dans la police composite en utilisant $\cal F$ juste 
comme vous utilisez toute autre identifiant de police.

Vous pouvez cr\'eer une telle police composite en d\'efinissant $\cal F$ comme une macro.
Dans la d\'efinition de $\cal F$, vous s\'electionnez d'abord la police $f_1$ et ensuite
d\'efinissez des s\'equences de contr\^ole qui produisent les caract\`eres emprunt\'es,
mis dans $f_2$.
Par exemple, supposons que vous voulez cr\'eer une police composite |\britrm| 
qui a tous les caract\`eres de |cmr10|
sauf pour le signe dollar, pour lequel vous voulez emprunter
le symbole de la livre sterling de la police |cmti10|.
Le symbole de la livre sterling de |cmti10| 
apparait \`a la m\^eme position de police que le signe dollar dans |cmr10|.
Voici comment faire~:
\csdisplay
\def\britrm{%
   \tenrm % \tenrm names the cmr10 font
   \def\${{\tenit\char `\$}}% \tenit names the cmti10 font.
}
|
Maintenant \`a chaque fois que vous lancerez la police appel\'ee |\britrm|,
|\$| produira un symbole de livre sterling.

Vous pouvez aussi avoir le m\^eme effet en changeant les codes de cat\'egorie
des caract\`eres en question pour rendre ces caract\`eres actifs et ensuite
procurer une d\'efinition pour le caract\`ere.  Par exemple~:
\csdisplay
\catcode `* = \active
\def*{{\tentt \char `\*}}
|
Dans ce cas l'ast\'erisque sera pris de la police |\tentt|.
Si cous saisissez alors la ligne d'entr\'ee~:
\csdisplay
Debbie was the * of the show.
|
elle sera compos\'ee ainsi~:
{\font\tentt=cmtt10%
\catcode `* = \active
\def*{{\tentt \char `\*}}%
\display{Debbie was the * of the show.}}
\noindent

\eix^^{polices//composites}


\section Reproduire du texte verbatim

\null
^^{texte verbatim}\xrdef{verbatim}
Du texte verbatim est du texte qui est reproduit dans un document
compos\'e exactement comme il appara\^\i t dans son entr\'ee.
L'usage le plus commun du texte verbatim est dans la composition
d'entr\'ee informatique,
incluant les programmes pour ordinateurs et les entr\'ees de \TeX\ lui-m\^eme.
^^{programmes informatiques, composer des}
l'entr\'ee informatique n'est pas simple \`a reproduire pour deux raisons~:
\olist\compact
\li Certains caract\`eres (symboles de contr\^ole, caract\`eres d'\'echappement, accolades,
etc.) ont
une signification sp\'eciale en \TeX.
\li Les fins de ligne et les espaces multiples sont traduits en espaces simples.
\endolist
\noindent
Dans le but de produire du texte verbatim, vous devez effacer les significations sp\'eciales
et d\'ebrancher la traduction.  C'est beaucoup mieux fait par des macros.

Pour effacer les signification sp\'eciales, vous devez changer les codes de cat\'egorie
des caract\`eres qui ont des significations sp\'eciales.
^^{codes de cat\'egorie//pour texte verbatim}
La macro suivante illustre comment vous devez le faire~:
\csdisplay
\chardef \other = 12
\def\deactivate{%
   \catcode`\\ = \other   \catcode`\{ = \other
   \catcode`\} = \other   \catcode`\$ = \other
   \catcode`\& = \other   \catcode`\# = \other
   \catcode`\% = \other   \catcode`\~ = \other
   \catcode`\^ = \other   \catcode`\_ = \other
}
|
Mais attention~! Une fois que vous avez chang\'e les codes de cat\'egorie de ce fa\c con, vous perdez
la facult\'e d'utiliser des s\'equences de contr\^ole puisqu'il n'y a plus de caract\`ere
d'\'echappement. Vous avez besoin d'un moyen de revenir dans le mode normal 
d'op\'eration. Nous expliquerons comment faire cela dans un moment, apr\`es avoir consid\'er\'e
l'autre probl\`eme~: d\'ebrancher la traduction des espaces et des fins de ligne.

\PlainTeX\ a deux commandes qui ensemble r\'esolvent en partie le probl\`eme~:
^|\obeyspaces| \ctsref{\obeyspaces} et ^|\obeylines| \ctsref{\obeylines}.
Les deux choses qu'elles ne font pas sont de pr\'eserver les espaces au d\'ebut 
d'une ligne
et de pr\'eserver les lignes blanches.
Pour cela vous avez besoin de mesures plus fortes---qui sont apport\'ees par
la macro ^|\obeywhitespace| que nous sommes sur le point de d\'efinir.

\TeX\ normalement insiste pour collecter des lignes par paragraphes. 
Un moyen de le convaincre de prendre litt\'eralement les bords des lignes
est de transformer les lignes individuelles en paragraphes.\footnote{%
Un autre moyen est de transformer le caract\`ere de fin de ligne en une commande 
|\break| et d'ajouter un ressort infini \`a la fin de chaque ligne.
^^|\break//fin de ligne sur|
}
Vous pouvez faire cela en red\'efinissant le caract\`ere de fin de ligne pour produire
la s\'equence de contr\^ole |\par|. Les trois d\'efinitions de macro suivantes
montrent comment~:

^^{espace blanc, pr\'eserver de l'}
\xrdef{\obeywhitespace}
\csdisplay
\def\makeactive#1{\catcode`#1 = \active \ignorespaces}
{% The group delimits the text over which ^^M is active.
   \makeactive\^^M %
   \gdef\obeywhitespace{%
   % Use \gdef so the definition survives the group.
      \makeactive\^^M %
      \let^^M = \newline %
      \aftergroup\removebox % Kill extra paragraph at end.
      \obeyspaces %
   }%
}
\def\newline{\par\indent}
\def\removebox{\setbox0=\lastbox}

|
Un point subtil de la d\'efinition de |\obeywhitespace| est que
|^^M| doit \^etre rendu actif \`a la fois 
quand |\obeywhitespace| est \emph{d\'efinie} et quand
elle est \emph{utilis\'ee}.

Pour \^etre capable de revenir \`a des op\'erations normales apr\`es du texte verbatim,
vous devez choisir un caract\`ere qui
appara\^\i t rarement voire pas du tout dans le texte verbatim.  Ce caract\`ere 
sert comme caract\`ere d'\'echappement temporaire.
La barre verticale (|!||) est parfois un bon choix.
Avec ce choix, les macros~:
\csdisplay
\def\verbatim{\par\begingroup\deactivate\obeywhitespace
   \catcode `\!| = 0 % Make !| the new escape character.
}

\def\endverbatim{\endgroup\endpar}

\def\!|{!|}
|
fera l'affaire. Dans le texte verbatim, vous pouvez utiliser une double
barre verticale (|!|!||) pour en faire une, et vous terminez le texte verbatim
avec |!|endverbatim|.

Il y a plusieurs variations de cette technique~:
\ulist
\li Si un langage informatique a des mots-cl\'es, vous pouvez convertir 
chaque mot-cl\'e en une commande qui compose
ce mot-cl\'e en caract\`ere gras.  Chaque mot-cl\'e de l'entr\'ee doit \^etre alors
pr\'ec\'ed\'e par le caract\`ere d'\'echappement.
\li Si vous avez un caract\`ere (encore, supposons qu'il s'agisse de la barre verticale)
qui n'appara\^\i t
\emph{jamais} dans le texte verbatim, vous pouvez le rendre actif et
lui faire finir le texte verbatim. Les d\'efinitions de macro ressemblent alors 
\`a cela~:
\csdisplay
{\catcode `\!| = \active
\gdef\verbatim{%
   \par\begingroup\deactivate\obeywhitespace
   \catcode `!| = \active
   \def !|{\endgroup\par}%
}}
|
\endulist

Les id\'ees pr\'esent\'ees ici ne procurent qu'une simple approche de la composition
de programmes informatiques.
Le reproduction verbatim n'est souvent pas aussi r\'ev\'elatrice ou lisible 
qu'une version qui utilise des conventions typographiques qui refl\`etent la 
syntaxe et m\^eme les s\'emantiques du programme.
Si vous d\'esirez poursuivre ce sujet plus loin, nous vous recommandons le livre suivant~:

\smallskip{\narrower\noindent
Baecker, Ronald M., and Marcus, Aaron, {\sl Human Factors
and Typography for More Readable Programs}. Reading, Mass.:
Addison-Wesley, 1990.\par}


\section Utiliser des macros externes

\null
^^{s\'equence de contr\^ole interdite}^^{condition incompl\`ete}
Si \TeX\ se plaint d'une ``s\'equence de contr\^ole interdite [forbidden control 
sequence]'', vous avez probablement utilis\'e une macro externe dans un contexte
non-externe \seeconcept{outer}.
^^{macros//outer}
Une macro externe est une macro dont la d\'efinition est
pr\'ec\'ed\'ee par ^|\outer|.
Une macro externe ne peut pas \^etre utilis\'ee dans un argument de macro, dans une
d\'efinition de macro,
dans le pr\'eambule d'un alignement ou dans un texte conditionnel,
c'est-\`a-dire, un texte qui ne sera d\'evelopp\'e que quand un test conditionnel
aura un r\'esultat particulier.
^^{alignements//s\'equence de contr\^ole outer dans des}
Certaines macros ont \'et\'e d\'efinies comme externes parce qu'elles n'ont pas de
raison d'\^etre utilis\'ees dans ces contextes et qu'un tel usage est probablement une erreur.
Le seul moyen de contourner ce probl\`eme est de red\'efinir la
macro ou de d\'eplacer son utilisation dans un contexte acceptable.

Utiliser une macro externe dans un contexte impropre peut aussi provoquer
que \TeX\ se plaigne d'un ``runaway situation'' ou d'un ``incomplete conditional''.
Le probl\`eme peut \^etre difficile \`a diagnostiquer parce que le message d'erreur
ne donne aucun indice ni ce qui se passe. Si vous obtenez un tel message 
d'erreur, recherchez autour un appel \`a une macro externe.
Vous ne pouvez pas toujours savoir si une macro particuli\`ere est externe, mais 
la commande `^|\show||\a|' \ctsref{\show}
vous montrera la d\'efinition de |\a| et vous dira aussi
si |\a| est externe.


\section Changer des codes de cat\'egorie

\null
\bix^^{codes de cat\'egorie//changement}
Il est parfois pratique de faire des changements locaux au code de cat\'egorie
d'un caract\`ere \`a une certaine partie de votre document. Par exemple, vous devez
composer un programme informatique 
^^{programmes informatiques, composer des}
ou quelque chose d'autre qui utilise normalement des caract\`eres actifs
pour un usage sp\'ecial. Vous voudrez alors d\'esactiver ces caract\`eres pour que
\TeX\ les traite comme tout autre caract\`ere.

Si vous faites un tel changement local au code de cat\'egorie d'un caract\`ere,
vous serez parfois constern\'e de trouver que \TeX\ semble ne pr\^eter aucune 
attention quelconque a votre changement.
Deux aspects du comportement de \TeX\ sont vraisemblablement en cause~:
\olist
\li \TeX\ d\'etermine le code de cat\'egorie d'un caract\`ere entr\'ee
^^{caract\`eres entr\'ees}
et l'attache au caract\`ere quand il le lit.
Supposons que vous lisiez un tilde (|~|) et qu'ensuite vous
changiez le code de cat\'egorie des tildes,
mais fassiez le changement
avant que l'estomac de \TeX\ ait r\'eellement ex\'ecut\'e de tilde \emph{particulier\/} 
\seeconcept{\anatomy}.
\TeX\ r\'epondra encore que ce 
tilde utilise le code de cat\'egorie comme il \'etait avant le changement.  
Cette difficult\'e survient typiquement 
quand le tilde fait partie d'un argument d'une macro
et que la macro elle-m\^eme change le code de cat\'egorie du tilde.

\li Quand \TeX\ assortit un appel d'une macro \`a la d\'efinition de cette macro,
il n'assortit pas seulement les caract\`eres du mod\`ele de param\`etre mais aussi 
leurs codes de cat\'egorie.
^^{macros//arguments de}
^^{macros//param\`etres de}
Si le code de cat\'egorie d'un mod\`ele caract\`ere n'est pas \'egal au
code de cat\'egorie du m\^eme caract\`ere dans l'appel, \TeX\ ne consid\`erera pas
les caract\`eres comme concordants.
Cet effet peut produire de myst\'erieux r\'esultats parce que il 
\emph{fait} comme si le mod\`ele concorde.
Par exemple, si vous avez d\'efini une macro~:
\csdisplay
\def\eurodate#1/#2/#3{#2.#1.#3}
|
alors le caract\`ere slash devra avoir le m\^eme code de cat\'egorie quand vous
appelez |\eurodate| que quand vous avez d\'efini |\eurodate|.
\endolist
Si le probl\`eme surgit parce que le caract\`ere g\^enant est un argument d'une 
macro, alors
le rem\`ede usuel est de red\'efinir la macro comme une paire
de macros |\mstart| et |\mfinish|, o\`u
|\mstart| doit \^etre appel\'ee avant le texte d'argument
et |\mfinish| doit \^etre appel\'e apr\`es.
|\mstart| alors initialise les codes de cat\'egorie et |\mfinish| 
d\'efait le changement, peut-\^etre simplement en finissant un groupe.
\eix^^{codes de cat\'egorie//changement}


\section Faire des fichiers de macro plus lisibles

\null
\bix^^{macros//rendre lisible des}
Vous pouvez faire un fichier de macros plus lisible en
mettant les codes de cat\'egories de l'espace \`a $9$ (caract\`ere ignor\'e)
et ^|\endlinechar| \ctsref{\endlinechar} \`a $-1$ au d\'ebut du fichier.
Vous pourrez alors utiliser des espaces et des fins de lignes librement dans les
d\'efinitions de macro sans obtenir d'espaces ind\'esirables quand vous appelez
les macros.
Les caract\`eres ignor\'es ne g\'en\`ereront pas d'espaces, mais agiront encore
comme terminateurs pour des s\'equences de contr\^ole.
Si vous voulez r\'eellement un espace, vous pouvez encore l'obtenir avec la 
commande ^|\space| \ctsref\space.

Bien s\^ur vous devrez restaurer les codes de cat\'egories de l'espace et de la fin de ligne
\`a leur valeur normale ($10$ et $5$, respectivement) \`a la fin du fichier.
Vous pouvez faire cela soit en englobant tout le fichier dans un groupe soit 
en restaurant les valeurs explicitement.  Si vous choisissez d'englober le 
fichier dans un groupe, vous devrez alors aussi mettre ^|\globaldefs| \`a $1$ 
pour que toutes les d\'efinitions de macro soient globales et donc visibles 
en dehors du groupe.

Un exemple miniature d'un fichier de macro de cette forme est~:

\csdisplay
\catcode `\  = 9  \endlinechar = -1

\def \makeblankbox #1 #2 {
   \hbox{\lower \dp0 \vbox{\hidehrule {#1} {#2}
   \kern -#1 % overlap rules
   \hbox to \wd0{\hidevrule {#1} {#2}%
      \raise \ht0  \vbox to #1{} % vrule height
      \lower \dp0 \vtop to #1{}  % vrule depth
      \hfil \hidevrule {#2} {#1} }
   \kern -#1 \hidehrule {#2} {#1} } }

\def\hidehrule #1 #2 {
   \kern -#1 \hrule height#1 depth#2 \kern -#2 }
\def\hidevrule #1 #2 {
   \kern -#1 {\dimen0 = #1 \advance \dimen0 by #2
   \vrule width \dimen0 } \kern -#2 }

\catcode `\  = 10  \endlinechar = `\^^M
|
\noindent
Sans les changement de code de cat\'egorie,
ces macros auraient \'et\'e \'ecrites de mani\`ere beaucoup plus compacte, utilisant moins
d'espaces et plus de `|%|' \`a la fin des lignes.
\eix^^{macros//rendre lisible des}

\endchapter\byebye