-
Notifications
You must be signed in to change notification settings - Fork 0
/
presentation.fr.html
913 lines (748 loc) · 35.5 KB
/
presentation.fr.html
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
<html>
<head>
<title>LATEX -O fun</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<style>
<!--
.mauvais { background-color: pink}
.bon { background-color: palegreen}
-->
</style>
</head>
<body>
<h1>L<sup>A</sup>T<sub>E</sub>X -O fun</h1>
<p>Ou comment utiliser L<sup>A</sup>T<sub>E</sub>X en optimisant
le facteur de plaisir.</p>
<h2>Encodages</h2>
<p>Commençons par l'aspect pénible de l'utilisation de tout logiciel
scriptable, les encodages.</p>
<p>Supposons que l'on veuille écrire </p>
<img src="ex.png" alt="texte : Grâce à Archimède, nous connaissons par coeur la valeur de pi, 3,1415926535" />
<p>et que, contrairement à ce que l'on déclare dans le
document, on n'arrive pas à se rappeler la valeur numérique de π.</p>
<p>Remarque : la couleur jaunâtre ne vient pas du fait que j'ai
imprimé mon fichier L<sup>A</sup>T<sub>E</sub>X sur du papier vieilli.
J'ai tout simplement effectué une copie d'écran, que j'ai coloriée ensuite
avec <i>The GIMP</i> pour faire ressortir ces copies d'écran
par rapport au texte de la présentation.</p>
<p>Pour écrire un source L<sup>A</sup>T<sub>E</sub>X, nous disposons
de trois encodages, l'ASCII à 7 bits, ISO-8859 ou UTF-8.</p>
<h3>ASCII 7-bits</h3>
<p>Avec les premières versions de T<sub>E</sub>X, il fallait
coder en ASCII 7 bits. Ce n'était pas agréable à manipuler.</p>
<p><em>fichier ex1.tex</em></p>
<pre>
\documentclass[a4paper]{article}
\begin{document}
Gr<span class='mauvais'>\^a</span>ce <span class='mauvais'>\`a</span> Archim<span class='mauvais'>\`e</span>de, nous connaissons
par c<span class='mauvais'>\oe{}</span>ur la valeur de $\pi$,
% que j'aime a faire apprendre un nombre utile aux sages
% 123 1 1234 1 12345 123456789 12 123456 12345 123 12345
3,1415926535.
\end{document}
</pre>
<p>
Pour les « œ » dans l'exemple ci-dessus et pour les
« ç », il y a deux façons de coder. La première
façon, qui me déplaît,
est <tt>c\oe ur</tt> et <tt>re\c cu</tt>, le blanc servant
à marquer la fin de la commande <tt>\oe</tt> (o-e liés) ou de la
commande <tt>\c</tt> (cédille), mais sans que cela représente la fin
d'un mot. La seconde, celle que je préfère, est <tt>c\oe{}ur</tt>
et <tt>re\c{c}u</tt>, dans laquelle la fin de la commande est marquée
par autre chose qu'un blanc, en l'occurrence une ou deux
accolades, ce qui fait que les blancs sont ainsi
toujours des séparations de mots.
Il n'y a pas de paramètre en ligne de commande ni d'option à insérer dans le fichier
source pour utiliser l'une ou l'autre de ces deux syntaxes.
Elles sont toujours reconnues dans un fichier L<sup>A</sup>T<sub>E</sub>X.
</p>
<h3>ISO-8859-1</h3>
<p>À partir de la version 3 de T<sub>E</sub>X, il a été possible
d'écrire en ISO-8859-1, ou en <tt>latin-1</tt> si vous préférez.</p>
<p><em>fichier ex2.tex</em></p>
<pre>
<span class='bon'>% -*- encoding: iso-8859-1 -*-</span>
\documentclass[a4paper]{article}
<span class='bon'>\usepackage[T1]{fontenc}</span>
\begin{document}
Gr<span class='bon'>â</span>ce <span class='bon'>à</span> Archim<span class='bon'>è</span>de, nous connaissons
par c<span class='mauvais'>\oe{}</span>ur la valeur de $\pi$,
% que j'aime à faire apprendre un nombre utile aux sages
% 123 1 1234 1 12345 123456789 12 123456 12345 123 12345
3,1415926535.
\end{document}
</pre>
<p>Le commentaire avec <tt>-*-</tt> permet de dire à Emacs que l'encodage
est ISO-8859-1, mais L<sup>A</sup>T<sub>E</sub>X n'en tient aucun compte.
L'utilisation du module <tt>fontenc</tt>
sert à indiquer à L<sup>A</sup>T<sub>E</sub>X que l'on utilise
des polices compatibles avec l'encodage ISO-8859-1, mais Emacs n'en tient
aucun compte. Quant à Vim, des utilisateurs
de cet éditeur m'ont signalé que Vim détecte automatiquement l'encodage
du fichier. Cette détection automatique fonctionne mieux que l'utilisation
de la <i lang='en'>mode line</i>. Je n'ai pas vérifié, car le clone de vi
que j'utilise est Emacs en mode Viper.</p>
<p> Maintenant, les voyelles accentuées et les « c » cédille
peuvent se taper sans mal, mais il reste un problème avec les « o-e »
liés.</p>
<h3>UTF-8</h3>
<p>Mais maintenant, dans la deuxième décennie du XXI<sup>e</sup> siècle,
c'est Unicode et l'UTF-8 qui s'imposent.</p>
<p><em>fichier ex3.tex</em></p>
<pre>
<span class='bon'>% -*- encoding: utf-8 -*-</span>
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
<span class='bon'>\usepackage[utf8]{inputenc}</span>
\begin{document}
Gr<span class='bon'>â</span>ce <span class='bon'>à</span> Archim<span class='bon'>è</span>de, nous connaissons
par c<span class='bon'>œ</span>ur la valeur de $\pi$,
% que j'aime à faire apprendre un nombre utile aux sages
% 123 1 1234 1 12345 123456789 12 123456 12345 123 12345
3,1415926535.
\end{document}
</pre>
<p>Le problème des « o-e » liés est résolu. Normalement, on
devrait même pouvoir taper le π (U+3C0) directement dans le texte, mais je n'y
suis pas arrivé. De plus, j'ai des problèmes lorsque
j'utilise « ° » (U+B0) pour représenter le degré.
Toujours est-il que cela ne nous donne pas la valeur numérique
de π pour autant.</p>
<h2>Et maintenant, amusons-nous !</h2>
<p>Même si T<sub>E</sub>X et L<sup>A</sup>T<sub>E</sub>X sont des langages
de programmation, il faut reconnaître que leur syntaxe n'est pas
agréable. Par exemple, c'est assez difficile de faire des boucles,
c'est difficile de calculer des formules, c'est difficile d'avoir la
valeur numérique de π.
Je ne dis pas que c'est impossible, voir l'article de
Myriam Lagarde dans
<a href='http://www.unixgarden.com/index.php/category/gnu-linux-magazine'><cite>Gnu Linux Magazine France</cite></a>
<a href='http://www.unixgarden.com/index.php/gnu-linux-magazine/gnulinux-magazine-n-143-novembre-2011-chez-votre-marchand-de-journaux-2'>143</a>,
à partir de la page 18. Je dis plutôt que
c'est difficile, lourdingue et moche.
Heureusement, il y a...</p>
<h3>LuaL<sup>A</sup>T<sub>E</sub>X</h3>
<p>LuaT<sub>E</sub>X, également connu sous le nom de LuaL<sup>A</sup>T<sub>E</sub>X,
est une refonte du moteur T<sub>E</sub>X, qui incorpore un certain
nombre d'améliorations.</p>
<ol>
<li>Sortie au format PDF à la place de DVI,</li>
<li>utilisation des polices TTF et OTF en plus de METAFONT,</li>
<li>et surtout, un interpréteur incorporé !</li>
</ol>
<p>En effet, le rédacteur du document a accès à un interprétateur
Lua dans le corps du document. Exemple :</p>
<p><em>fichier ex4.tex</em></p>
<pre>
% -*- encoding: utf-8 -*-
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
<span class='bon'>\usepackage[utf8]{luainputenc}</span>
\begin{document}
Grâce à Archimède, nous connaissons
par cœur la valeur de $\pi$,
<span class='bon'>\directlua{tex.sprint(math.pi)}</span>.
\end{document}
</pre>
<p>La génération du document se fait par :</p>
<pre>
lualatex ex4
</pre>
<p>tout simplement. Remarquons que le résultat est légèrement différent, nous disposons
de quelques décimales supplémentaires.</p>
<img src="ex4.png" alt="texte : Grâce à Archimède, nous connaissons par coeur la valeur de pi, 3,1415926535898" />
<p>Quelques remarques.</p>
<p>En fait, l'utilisation de l'interpréteur Lua incorporé
ne se limite pas à générer des fragments de source L<sup>A</sup>T<sub>E</sub>X.
Il est possible d'écrire des « fonctions de rappel »
(<i lang='en'>callbacks</i>), pour <em>intervenir dans le fonctionnement
du moteur</em>, par exemple pour modifier les règles de césure, ou pour
travailler sur les « attributs » (une nouveauté du moteur
LuaT<sub>E</sub>X). Réservé aux gourous et aux sorciers, moi je n'en
ai pas besoin pour m'amuser en composant des documents.</p>
<p>LuaT<sub>E</sub>X est encore en version béta. La version stable
est promise pour 2012. Je pense que si l'on
se limite comme moi aux fonctionnalités standards de L<sup>A</sup>T<sub>E</sub>X
avec en plus l'ajout de morceaux de texte générés par Lua, mais que l'on
ne cherche pas à écrire de <i lang='en'>callbacks</i>, il n'y a pas de crainte
à avoir pour d'éventuelles régressions ou incompatibilités.</p>
<p>Un paradoxe : les auteurs de Lua font clairement savoir qu'ils
ne prévoient pas d'ajouter le support d'Unicode à Lua. Lua fait quand même
attention à ne pas bousiller votre chaîne de caractères, qu'il considère
lui comme une chaîne d'octets. Mais les fonctions qui travaillent sur les
caractères, comme les découpages de chaîne
et les expressions régulières, considèrent que l'encodage
est ISO-8859, voire ASCII. Le paradoxe est que pour
LuaL<sup>A</sup>T<sub>E</sub>X, le seul encodage prévu est justement
UTF-8, qui n'est pas et qui ne sera jamais l'encodage natif de Lua.</p>
<p>Il y a des interférences entre l'analyse du source par L<sup>A</sup>T<sub>E</sub>X
et celle par l'interpréteur Lua. Vous aurez beau coder votre programme
Lua sur plusieurs lignes, avec une indentation soignée, Lua recevra
un « uniligne » (<i lang='en'>one-liner</i>). Et donc, en particulier,
si vous commentez votre script ainsi :</p>
<pre>
\directlua{-- on affiche la valeur de pi
tex.sprint(math.pi)
}
</pre>
<p>Lua ne recevra qu'un immense commentaire et ne fera donc rien.
Cela dit, vous pouvez utiliser le pourcent pour les commentaires :</p>
<pre>
\directlua{% on affiche la valeur de pi
tex.sprint(math.pi)
}
</pre>
<p>Le corollaire de cette remarque est qu'il est très difficile
d'utiliser l'opérateur modulo et les expressions régulières dans un script Lua
inclus dans un document LuaL<sup>A</sup>T<sub>E</sub>X.</p>
<p>La solution préconisée consiste donc à séparer une partie
du code Lua dans un fichier externe qui sera analysé uniquement
par l'interpréteur Lua et non par l'interpréteur L<sup>A</sup>T<sub>E</sub>X.
Oublions pour un moment L<sup>A</sup>T<sub>E</sub>X et faisons uniquement
du Lua. Pour afficher la valeur de π en se basant sur un poême
mnémotechnique et non pas sur des fonctions mathématiques, il est possible d'écrire le
programme suivant :</p>
<p><em>fichier ex5.lua</em></p>
<pre>
-- -*- encoding: latin-1 -*-
--[[
Fonction pour obtenir un nombre à partir d'un poême mnémotechnique
lg_part_ent : nombre de chiffres de la partie entière
poeme : chaîne de caractères contenant le texte du poême
renvoie une chaîne représentant le nombre
]]
local transco = { ["à"] = "a", ["è"] = "e", ["é"] = "e", ["ê"] = "e",
};
function mnemo_to_num(lg_part_ent, poeme)
-- élimination des accents
poeme = string.gsub(poeme, ".", transco);
-- extraire les chiffres du nombre
local nombre = "";
for mot in string.gmatch(poeme, "%a+") do
nombre = nombre .. (string.len(mot) % 10)
end
-- séparer la partie entière et la partie décimale
local part_ent = string.sub(nombre, 1, lg_part_ent)
local part_dec = string.sub(nombre, lg_part_ent + 1, string.len(nombre))
-- insérer des blancs pour former des groupes de trois chiffres
part_ent = string.reverse(part_ent)
part_ent = string.gsub(part_ent, "(%d%d%d)", "%1 ")
part_ent = string.reverse(part_ent)
part_dec = string.gsub(part_dec, "(%d%d%d)", "%1 ")
-- reconstituer le nombre
nombre = part_ent .. "," .. part_dec
return nombre
end
</pre>
<p><em>fichier ex5-bis.lua</em></p>
<pre>
-- -*- encoding: latin-1 -*-
<span class='bon'>dofile "ex5.lua";</span>
print(mnemo_to_num(1, [[
Que j'aime à faire apprendre un nombre utile aux sages,
Immortel Archimède, artiste, ingénieur,
Qui, de ton jugement, peut priser la valeur ?
Pour moi, ton problème eut de pareils avantages.
]] ))
</pre>
<p>Cet exemple vous permet de voir comment appeler un script Lua
externe dans un autre script Lua. Il vous montre également la syntaxe
Lua avec « <tt>[[</tt> » puis « <tt>]]</tt> »
pour les chaînes de caractères contenant des sauts de ligne
(la syntaxe <tt>\n</tt> est autorisée dans une chaîne délimitée
par des doubles quotes, mais c'est pénible si les lignes
sont longues et nombreuses). Voici ce que cela donne avec
LuaL<sup>A</sup>T<sub>E</sub>X :</p>
<p><em>fichier ex5.tex</em></p>
<pre>
% -*- encoding: utf-8 -*-
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{luainputenc}
\begin{document}
Grâce à Archimède, nous connaissons
par cœur la valeur de $\pi$,
\directlua{
dofile "ex5.lua";
tex.sprint(mnemo_to_num(1, "
Que j'aime a faire apprendre un nombre utile aux sages,
Immortel Archimede, artiste, ingenieur,
Qui, de ton jugement, peut priser la valeur ?
Pour moi, ton probleme eut de pareils avantages.
"))}
\end{document}
</pre>
<p>Il y a deux choses à remarquer. Tout d'abord, la chaîne transmise ne contient
aucun caractère accentué parce que le script <tt>ex5.lua</tt> attend une chaîne
en ISO-8859-1 (qu'il convertit immédiatement en ASCII, au moins pour les lettres)
et le document <tt>ex5.tex</tt> est codé en UTF-8.
D'autre part, la chaîne transmise est délimitée par des doubles-quotes parce
que, de toutes façons, les sauts de ligne sont perdus
au moment où LuaL<sup>A</sup>T<sub>E</sub>X exécute le code Lua.</p>
<img src="ex5.png" alt="texte : Grâce à Archimède, nous connaissons par coeur la valeur de pi, 3,141 592 653 589 793 238 462 643 383 279" />
<p>Ainsi donc, il est possible de disposer d'un langage algorithmique
puissant et agréable lors de la composition d'un document.
Les exemples ci-dessus sont simplistes, mais dans la réalité,
il est possible d'avoir une logique de traitement plus évoluée,
avec des boucles par exemple, ou bien des accès à une base de données ou
à Internet. Le peu de Lua que je connais
pour l'instant me montre que c'est un langage sympathique
et agréable, mais je continue à préférer Perl.</p>
<h3>LuaL<sup>A</sup>T<sub>E</sub>X et MetaPost</h3>
<p>En fait, ce n'est pas un interpréteur qui est inclus dans LuaL<sup>A</sup>T<sub>E</sub>X,
mais deux ! Il y a en effet également un interpréteur
MetaPost en plus de l'interpréteur Lua.
MetaPost est un langage de script pour dessins, inspiré
de METAFONT, langage de définition de polices de caractères. À l'époque de
L<sup>A</sup>T<sub>E</sub>X, c'était un exécutable séparé
<tt>mpost</tt> qui interprétait un fichier source séparé <tt>toto.mp</tt> et
générait un ou plusieurs fichiers PostScript <tt>toto.1</tt>, <tt>toto.2</tt>, <tt>toto.3</tt>
et ainsi de suite.
L'inclusion de dessins dans un document L<sup>A</sup>T<sub>E</sub>X
nécessitait ainsi le lancement de plusieurs commandes, donc il fallait
écrire un script ou un <tt>makefile</tt> pour enchaîner la
commande <tt>mpost</tt> de
génération des dessins avec la commande <tt>latex</tt> de génération du document. Avec
LuaL<sup>A</sup>T<sub>E</sub>X, tout se fait à l'intérieur du même fichier
source :</p>
<p><em>fichier ex6.tex</em></p>
<pre>
% -*- encoding: utf-8 -*-
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{luainputenc}
<span class='bon'>\usepackage{luamplib}</span>
\begin{document}
Grâce à Archimède, nous connaissons
par cœur la valeur de $\pi$,
\directlua{tex.sprint(math.pi)}.
Et remercions également ce mathématicien anonyme
qui nous a donné l'équation~:
zéro plus zéro égale, la tête à Toto~!
<span class='bon'>\begin{mplibcode}
beginfig(1);
z1 = (-15, 10); % oeil gauche
z2 = ( 15, 10); % oeil droit
rayon = 5;
largeur_egale = 1.5 * rayon;
grosrayon = 30;
% zéro
draw ((0, rayon) .. (rayon, 0) .. (0, - rayon) .. (- rayon, 0) .. cycle) shifted z1;
% plus
draw (0, rayon) -- (0, - rayon);
draw (- rayon, 0) -- (rayon, 0);
% zéro
draw ((0, rayon) .. (rayon, 0) .. (0, - rayon) .. (- rayon, 0) .. cycle) shifted z2;
% égale
draw ((-largeur_egale, 0) -- (largeur_egale, 0)) shifted (0, -2 * rayon);
draw ((-largeur_egale, 0) -- (largeur_egale, 0)) shifted (0, -3 * rayon);
% la tête à Toto
draw (grosrayon, 0) .. (0, grosrayon) .. (- grosrayon, 0) .. (0, - grosrayon) .. cycle;
endfig;
\end{mplibcode}</span>
\end{document}
</pre>
<p>Et la génération se fait en une seule commande :</p>
<pre>
lualatex ex6
</pre>
<img src="ex6.png" alt="La même chose, avec 'zéro plus zéro égale la tête à Toto" />
<p>Je réitère la conclusion du paragraphe précédent.
Ainsi donc, il est possible de disposer de deux langages algorithmiques
puissants et agréables lors de la composition d'un document.
Les exemples ci-dessus sont simplistes, mais dans la réalité,
il est possible d'avoir une logique de traitement plus évoluée,
avec des boucles par exemple, aussi bien en MetaPost qu'en Lua,
et des accès à une base de données ou à Internet en Lua. Le peu de Lua que je connais
pour l'instant me montre que c'est un langage sympathique
et agréable et d'autre part j'aime bien MetaPost, mais je continue à préférer Perl.</p>
<p>Heureusement, il y a...</p>
<h3>Perltex</h3>
<p>Perltex n'est pas un nouveau moteur T<sub>E</sub>X, concurrent
de LuaT<sub>E</sub>X. C'est un script « de glu »
faisant communiquer un moteur T<sub>E</sub>X avec un exécutable
Perl. Il n'est pas disponible sur
<a href='http://www.cpan.org/'>CPAN</a>, mais sur
<a href='http://www.ctan.org/'>CTAN</a> (<i lang='en'>Comprehensive T<sub>E</sub>X Archive Network</i>)
qui est presque aussi riche.
</p>
<p>Le fichier source a l'allure suivante :</p>
<p><em>fichier ex7.tex</em></p>
<pre>
% -*- encoding: utf-8 -*-
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
<span class='bon'>\usepackage{perltex}</span>
<span class='bon'>\perlnewcommand{\pinum}[0]{ 4 * atan2(1, 1) }</span>
\begin{document}
Grâce à Archimède, nous connaissons
par cœur la valeur de $\pi$, <span class='bon'>\pinum</span>.
\end{document}
</pre>
<p>Et le lancement se fait ainsi :</p>
<pre>
perltex --nosafe ex7.tex
</pre>
<p>si vous voulez avoir la sortie en format DVI ou bien ainsi :</p>
<pre>
perltex --latex=pdflatex --nosafe ex7.tex
</pre>
<p>si vous voulez avoir la sortie en PDF. Et vous obtenez</p>
<img src="ex7.png" alt="texte : Grâce à Archimède, nous connaissons par coeur la valeur de pi, 3,14159265358979" />
<p>Quelques remarques.</p>
<p>Comme vous pouvez le deviner, les instructions Perl
définies par <tt>\perlnewcommand</tt>
sont compilées et exécutées par un <tt>eval</tt>.
Par défaut, elles sont lancées dans un
« bac à sable » (<i lang='en'>sandbox</i>), grâce
au module <tt>Safe.pm</tt>.
Le paramètre <tt>--nosafe</tt> permet de désactiver ce module,
dans la mesure où l'auteur du document est le même que l'auteur
du script Perl. Si votre document L<sup>A</sup>T<sub>E</sub>X
fait appel à un script dont l'origine est douteuse, alors
il faut utiliser l'option <tt>--safe</tt>. Il est possible
d'adopter une attitude intermédiaire avec un ou plusieurs paramètres
<tt>--permit:</tt><var>xxx</var>.</p>
<p>Par opposition à LuaL<sup>A</sup>T<sub>E</sub>X,
vous ne pouvez plus utiliser MetaPost de façon intégrée,
vous êtes de nouveau obligés d'écrire deux fichiers séparés
et de lancer deux commandes à la suite, <tt>mpost</tt>
puis <tt>perltex</tt>. Ou bien alors, programmez
vos dessins avec GD.pm, GIMP.pm, Image::Magick ou un module
similaire et incluez le dessin obtenu dans votre document.</p>
<p>En revanche, vous avez de nouveau le choix entre un document codé
en ISO-8859 ou codé en UTF-8. Mais en 2012, qui veut
revenir à ISO-8859 ?</p>
<p>Avec PerlT<sub>E</sub>X, vous pouvez utiliser la syntaxe des
environnements (<tt>\begin{<var>xxx</var>}</tt> ... <tt>\end{<var>xxx</var>}</tt>)
pour définir un script « avant » et
un script « après », encadrant une portion de texte.
Tandis qu'avec LuaL<sup>A</sup>T<sub>E</sub>X, seul le fonctionnement
en commande est possible.</p>
<h3>Metaperlualatex</h3>
<p>Faut-il choisir LuaL<sup>A</sup>T<sub>E</sub>X et supporter les
inconvénients de Lua en mode uniligne ? Faut-il choisir PerlT<sub>E</sub>X et se lamenter de
l'absence de MetaPost ? Non ! J'ai créé un programme qui
réunit les avantages des deux outils, ce qui permet d'éviter les
inconvénients. Cet outil, une variante de L<sup>A</sup>T<sub>E</sub>X
combinant un interpréteur MetaPost, un interpréteur Perl et un interpréteur
Lua, s'appelle <strong>Metaperlualatex</strong>.</p>
<p>Son principe de fonctionnement tient en une ligne shell :</p>
<pre>
perltex --latex=lualatex $*
</pre>
<p>En fait, l'implémentation est un peu plus compliquée, mais vous avez ici
l'essentiel du programme. Un document ressemble à :</p>
<p><em>fichier ex8.tex</em></p>
<pre>
% -*- encoding: utf-8 -*-
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
<span class='bon'>\usepackage[utf8]{luainputenc}
\usepackage{perltex}
\usepackage{luamplib}</span>
<span class='bon'>\perlnewcommand{\mnemotonum}[2]</span>{ my ($lg_part_ent, $mnemo) = @_;
use v5.10;
$mnemo =~ s/\\[`']//g;
my @mots = $mnemo =~ /(\w+)/g;
my $nombre = join '', map { length($_) % 10 } @mots;
my $partie_ent = reverse substr($nombre, 0, $lg_part_ent);
$partie_ent =~ s/(\d\d\d)/$1 /g;
$partie_ent = reverse $partie_ent;
my $partie_dec = substr($nombre, $lg_part_ent);
$partie_dec =~ s/(\d\d\d)/$1 /g;
$partie_dec =~ s/\s+$//;
return "$partie_ent,$partie_dec"; }
\begin{document}
Grâce à Archimède, nous connaissons
par cœur la valeur de $\pi$,
<span class='bon'>\directlua{tex.sprint(math.pi)}</span>,
ou plus précisément
<span class='bon'>\mnemotonum</span>{1}{Que j'aime à faire apprendre un nombre utile aux sages
Immortel Archimède, artiste, ingénieur,
Toi de qui Syracuse aime encore la gloire,
Soit ton nom conservé par de savants grimoires !
Jadis, mystérieux, un problème bloquait
Tout l'admirable procédé, l'oeuvre grandiose
Que Pythagore découvrit aux anciens Grecs.
Ô quadrature ! vieux tourment du philosophe !
Insoluble rondeur, trop longtemps vous avez
Défié Pythagore et ses imitateurs.
Comment intégrer l'espace plan circulaire ?
Former un triangle auquel il équivaudra ?
Nouvelle invention : Archimède inscrira
Dedans un hexagone ; appréciera son aire
Fonction du rayon. Pas trop ne s'y tiendra :
Dédoublera chaque élément antérieur ;
Toujours de l'orbe calculée approchera ;
Définira limite ; enfin l'arc, le limiteur
De cet inquiétant cercle, ennemi trop rebelle !
Professeur, enseignez son problème avec zèle !...
}.
Et remercions également ce mathématicien anonyme
qui nous a donné l'équation~:
zéro plus zéro égale, la tête à Toto~!
<span class='bon'>\begin{mplibcode}</span>
beginfig(1);
z1 = (-15, 10); % oeil gauche
z2 = ( 15, 10); % oeil droit
rayon = 5;
largeur_egale = 1.5 * rayon;
grosrayon = 30;
% zéro
draw ((0, rayon) .. (rayon, 0) .. (0, - rayon) .. (- rayon, 0) .. cycle) shifted z1;
% plus
draw (0, rayon) -- (0, - rayon);
draw (- rayon, 0) -- (rayon, 0);
% zéro
draw ((0, rayon) .. (rayon, 0) .. (0, - rayon) .. (- rayon, 0) .. cycle) shifted z2;
% égale
draw ((-largeur_egale, 0) -- (largeur_egale, 0)) shifted (0, -2 * rayon);
draw ((-largeur_egale, 0) -- (largeur_egale, 0)) shifted (0, -3 * rayon);
% la tête à Toto
draw (grosrayon, 0) .. (0, grosrayon) .. (- grosrayon, 0) .. (0, - grosrayon) .. cycle;
endfig;
<span class='bon'>\end{mplibcode}</span>
\end{document}
</pre>
<p>La génération du document se fait par :</p>
<pre>
mpll --nosafe ex8
</pre>
<img src="ex8.png" alt="texte : Grâce à Archimède, nous connaissons par coeur la valeur de pi, 3,1415926535898, ou plus précisément 3,14159265358979" />
<h3>Débugage</h3>
<p>Alors qu'il existe de très bons débugueurs pour Perl, la méthode
habituellement utilisée consiste à insérer des <tt>print</tt> (ou
variantes comme <tt>warn</tt>) dans le programme à débuguer. C'est
cette méthode que j'utilise pour le débugage de documents metaperlualatex.</p>
<p><em>fichier ex9.tex</em></p>
<pre>
% -*- encoding: utf-8 -*-
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{luainputenc}
\usepackage{perltex}
\usepackage{luamplib}
\perlnewcommand{\cmdperl}[0]{ <span class='bon'>print "\ndébug Perl\n";</span> return "Hello" }
\begin{document}
\cmdperl{}
\luadirect{<span class='bon'>print();print("débug Lua");</span> tex.sprint("world")},
<span class='bon'>\message{débug Latex}</span>
\end{document}
</pre>
<p>Ce qui donne dans la sortie standard :</p>
<pre>
This is LuaTeX, Version beta-0.50.0-2010010505
[ coupé ]
(/usr/share/texmf-texlive/tex/luatex/luamplib/luamplib.lua)) (./ex9.pipe)
(./ex9.pipe) (./ex9.frpl) (./ex9.aux) (./ex9.pipe
<span class='bon'>d'ebug Perl</span>
) (./ex9.pipe) (./ex9.frpl)
<span class='bon'>débug Lua</span>
<span class='bon'>débug Latex</span> [1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./ex9.aux)
)
[ coupé ]
</pre>
<p>Néanmoins, pour la partie Perl, vous pouvez consulter le fichier <tt>ex9.lgpl</tt>,
qui vous donne le journal (<i lang='en'>log</i>) des échanges entre L<sup>A</sup>T<sub>E</sub>X
et Perl :</p>
<pre>
############################### PERL CODE ################################
sub latex_cmdperl { print "\nd\'ebug Perl\n"; return "Hello" }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LATEX RESULT %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
############################### PERL CODE ################################
latex_cmdperl ();
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LATEX RESULT %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Hello
</pre>
<p>Cela dit, pour MetaPost, le manuel de John Hobby
présente plusieurs outils intégrés au langage et
qui permettent de débuguer le diagramme en cours
de compilation.</p>
<h3>Pour aller plus loin</h3>
<p>Le source de l'outil <tt>mpll</tt> se trouve sur
<a href="https://github.com/">Github</a>, sur
<a href="https://github.com/jforget/metaperlualatex"><tt>https://github.com/jforget/metaperlualatex</tt></a>.
Dans le même dépôt, vous trouverez cette présentation
ainsi qu'un document complet mettant à profit Perl et MetaPost
(et un tout petit peu Lua). Ce document explique le phénomène
que l'on peut observer dans les régions tempérées de
l'hémisphère nord au mois de décembre. Pendant l'automne,
le soleil se lève de plus en plus tard et se couche de plus en
plus tôt. Cela n'étonne personne. De même, au printemps, le
soleil se lève de plus en plus tôt et se couche de plus
en plus tard. Aucun paradoxe là non plus.
Mais pendant quelques jours au mois de décembre,
le soleil se lève de plus en plus tard et se couche
également de plus en plus tard. En d'autres termes,
le jour commence à gagner sur la nuit au moment du coucher
du soleil, mais continue à perdre sur la nuit au moment du lever
du soleil. Ce document, destiné à expliquer ce paradoxe, fait appel à
<a href='https://metacpan.org/module/DateTime::Event::Sunrise'><tt>DateTime::Event::Sunrise</tt></a>
comme vous auriez pu deviner.</p>
<h3>Quelques remarques</h3>
<p>À l'origine, j'ai installé LuaL<sup>A</sup>T<sub>E</sub>X en utilisant
le gestionnaire de paquets d'Ubuntu 10.4 <i lang='en'>Lucid Lynx</i>.
La version obtenue datait de janvier 2010. Avec cette version,
certains dessins MetaPost ont provoqué l'erreur :</p>
<pre>
! MetaPost capacity exceeded, sorry [main memory size=5000].
</pre>
<p>Après avoir <a href='http://tug.org/pipermail/luatex/2012-May/003652.html'>posé une question</a>
et <a href='http://tug.org/pipermail/luatex/2012-May/003653.html'>obtenu une réponse</a>
sur la <a href='http://tug.org/pipermail/luatex/'>liste de diffusion</a>,
j'ai installé la version de fin mai 2012 de LuaT<sub>E</sub>X et le problème
a été résolu.</p>
<p>Avant d'envoyer ce message, j'avais contrôlé si les exemples de figures MetaPost
figurant dans le
<a href='http://melusine.eu.org/syracuse/metapost/mpman/'>manuel écrit par John Hobby</a>
produisaient cette erreur. J'avais reproduit ce dépassement de capacité
et j'avais quelques autres erreurs. Ces erreurs
ne sont pas encore corrigées avec la version de mai 2012.</p>
<p>Une autre remarque, à propos des éditeurs de texte.
Comment font-ils pour afficher un source contenant à la fois
du L<sup>A</sup>T<sub>E</sub>X, du Lua, du Perl et du MetaPost ?
Tout d'abord, concernant le coloriage syntaxique, je l'ai désactivé
dans mon fichier de configuration <tt>.emacs</tt> avec :</p>
<pre>
(global-font-lock-mode -1)
</pre>
<p>Vous me connaissez, j'estime que les stabilisateurs pour
deux-roues sont réservés aux enfants apprenant à monter à vélo.
Lorsque l'on a un vélo de compèt', les stabilisateurs se révèlent
plus une gêne qu'un avantage. C'est la même chose avec le coloriage
syntaxique. Lorsque l'on connaît au minimum le langage utilisé,
il est préférable de voir tout le source affiché avec un bon contraste
en noir sur blanc, plutôt que de voir un source bariolé avec les
chaînes de caractères en jaune sur fond blanc, les mots-clés en bleu-ciel
sur fond blanc et les commentaires en vert pâle sur fond blanc.</p>
<p>Néanmoins, mon éditeur de texte adopte le mode L<sup>A</sup>T<sub>E</sub>X,
en raison entre autres de l'extension <tt>.tex</tt> de mon fichier source.
Donc, chaque fois que je tape une double-quote <tt>U+22</tt>,
Emacs la transforme en deux apostrophes <tt>U+27 U+27</tt>
ou en deux apostrophes inverses <tt>U+60 U+60</tt>, en fonction
du caractère précédent. Très pratique lorsque l'on tape du L<sup>A</sup>T<sub>E</sub>X,
mais très pénible lorsque l'on tape du Lua ou du Perl.
Dans ce cas, je passe en <tt>fundamental-mode</tt>.</p>
<h2>Bibliographie</h2>
<p>Sur papier et en anglais :</p>
<ul>
<li><cite lang='en'>Programming in Lua</cite>, par
Roberto Ierusalimschy, éditions Lua.org (si, si), ISBN 85-903798-2-5.
</li>
<li><cite lang='en'>Programming Perl</cite>,
<cite lang='en'>Perl Cookbook</cite>,
<cite lang='en'>Advanced Perl Programming</cite>,
<cite lang='en'>Perl Best Practices</cite>,
<cite lang='en'>Perl Hacks</cite>,
etc., en général aux éditions O'Reilly.
</li>
</ul>
<p>Sur papier et en français :</p>
<ul>
<li><cite>La maîtrise de T<sub>E</sub>X et L<sup>A</sup>T<sub>E</sub>X</cite>, T. Lachand-Robert,
éditions Masson, ISBN 2-225-84832-7.
</li>
<li><cite>L<sup>A</sup>T<sub>E</sub>X guide pratique</cite>
Christian Rolland, éditions Addison-Wesley, ISBN 2-87908-104-1.
</li>
<li><cite>Les Cahiers GUTenberg n° 41</cite>, novembre 2001 : MetaPost, le dessin sous *T<sub>E</sub>X, ISSN 1140-9304.
</li>
<li><cite>Les Cahiers GUTenberg n° 52--53</cite>, octobre 2009 : MetaPost raconté aux piétons, ISSN 1140-9304.
</li>
<li><cite>Les Cahiers GUTenberg n° 54--55</cite>, octobre 2010 : LuaT<sub>E</sub>X, ISSN 1140-9304.
</li>
<li><cite>Programmation en Perl</cite>, troisième édition en français, Larry Wall, Tom Christiansen et Jon
Orwant, éditions O'Reilly France, ISBN 2-84177-140-7.
</li>
<li><cite>De l'Art de Programmer en Perl</cite>, Damian Conway, éditions O'Reilly France, ISBN 2-84177-369-8.
</li>
<li><cite>Perl Moderne</cite>, Sébastien Aperghis-Tramoni, Philippe Bruhat, Damien Krotkine et Jérôme Quelin, éditions Pearson, ISBN 978-2-7440-2419-1.
</li>
</ul>
<p>Sous forme électronique :</p>
<ul>
<li>Le site web <a href="http://www.luatex.org/">LuaT<sub>E</sub>X</a></li>
<li><a href='http://tug.org/mailman/listinfo/luatex'>liste de diffusion</a> pour LuaT<sub>E</sub>X</li>
<li><a href='http://wiki.luatex.org/index.php/Main_Page'>wiki</a> pour LuaT<sub>E</sub>X</li>
<li><a href='http://www.ctan.org/tex-archive/macros/latex/contrib/perltex/'>PerlT<sub>E</sub>X</a></li>
<li><a href='http://www.ctan.org/az.html'>CTAN</a> en général</li>
<li>Si cela ne suffit pas, vous pouvez tenter votre chance avec <a href='http://www.duckduckgo.com'>Duck Duck Go</a>.</li>
</ul>
<h2>Remerciements</h2>
<p>Je tiens à remercier</p>
<ul>
<li><a href='http://www.c3.lanl.gov/~pakin/'>Scott Pakin</a>, l'auteur de
<a href='http://www.ctan.org/pkg/perltex'>Perltex</a>, l'un des outils à la base de <tt>mpll</tt>,
</li>
<li>l'<a href='http://www.luatex.org/team.html'>équipe</a> de LuaT<sub>E</sub>X / LuaL<sup>A</sup>T<sub>E</sub>X,
avec Hans Hagen, Harmut Henkel, Tako Hoekwater et beaucoup d'autres, pour avoir
créé l'<a href='http://www.luatex.org/'>autre outil</a> à la base de <tt>mpll</tt>,
</li>
<li><a href='http://www.inf.puc-rio.br/~roberto/'>Roberto Ierusalimschy</a>,
<a href='http://www.inf.puc-rio.br/~celes/'>Waldemar Celes</a>
et <a href='http://www.tecgraf.puc-rio.br/~lhf/'>Luiz Henrique de Figueiredo</a>,
les créateurs de <a href='http://www.lua.org/'>Lua</a>,
élément crucial de LuaL<sup>A</sup>T<sub>E</sub>X et LuaT<sub>E</sub>X,
</li>
<li><a href='http://ect.bell-labs.com/who/hobby/index.shtml'>John Hobby</a>,
dont le langage <a href='http://melusine.eu.org/syracuse/metapost/'>MetaPost</a>
et le programme <tt>mpost</tt>
ont inspiré l'équipe de LuaL<sup>A</sup>T<sub>E</sub>X,
</li>
<li><a href='http://research.microsoft.com/en-us/um/people/lamport/'>Leslie Lamport</a>
créateur de <a href='http://www.tuteurs.ens.fr/logiciels/latex/'>L<sup>A</sup>T<sub>E</sub>X</a>,
qui a inspiré LuaL<sup>A</sup>T<sub>E</sub>X et Perltex,
</li>
<li><a href='http://www-cs-faculty.stanford.edu/~uno/'>Donald Knuth</a>, dont le
langage <a href='http://www.gutenberg.eu.org/MetaFont'>MetaFont</a>
est à l'origine de MetaPost et dont le programme
<a href='https://fr.wikipedia.org/wiki/TeX'>T<sub>E</sub>X</a>
a conduit à L<sup>A</sup>T<sub>E</sub>X, LuaT<sub>E</sub>X
et Perltex.
</li>
<li><a href='http://www.wall.org/~larry/'>Larry Wall</a>, ainsi que les
<a href='https://www.ohloh.net/p/perl/contributors/19393924876974'>P5P</a>,
pour avoir créé et développé <a href='http://www.perl.org/'>le langage Perl</a>,
</li>
<li><a href='http://www1.cs.columbia.edu/~aho/'>Alfred Aho</a>,
<a href='http://www.chessbase.com/newsdetail.asp?newsid=791'>Peter Weinberger</a>
et <a href='http://cm.bell-labs.com/cm/cs/who/bwk/'>Brian Kernighan</a>,
dont le langage <a href='http://nyal.developpez.com/tutoriel/gawk/index.php'>awk</a>
est l'un des précurseurs de Perl,
</li>
<li><a href='http://linuxfr.org/news/dennis%C2%A0ritchie-un-p%C3%A8re-d%E2%80%99unix-nous-a-quitt%C3%A9s'>Dennis Ritchie</a>
et <a href='http://www.cs.princeton.edu/~bwk/'>Brian Kernighan</a>
(encore), dont le
<a href='http://www.commentcamarche.net/contents/c/cintro.php3'>langage C</a>
est un autre précurseur de Perl,
</li>
<li><a href='http://fr.wikipedia.org/wiki/Stephen_Bourne'>Stephen Bourne</a>,
dont l'interpréteur <a href='http://www.shellunix.com/sh.html'>shell</a>
est le troisième précurseur principal de Perl,
</li>
<li><a href='https://fr.wikipedia.org/wiki/Ken_Thompson'>Ken Thompson</a>
et <a href='http://www.ecrans.fr/Deces-de-Dennis-Ritchie-printf,13393.html'>Dennis Ritchie</a>
(encore), les créateurs d'<a href='http://www.commentcamarche.net/contents/unix/unixintro.php3'>Unix</a>
sur lequel se fonde le shell de Stephen Bourne.
</li>
<li>Alan Turing, dont les travaux ont ouvert le chemin à tous les autres
de la présente liste.
</li>
</ul>
<p>Merci également à l'équipe de rédaction du
<cite>Petit Archimède</cite>, pour le supplément au
numéro 64-65, dans lequel j'ai puisé mon inspiration poétique.</p>
<h2>Mentions légales</h2>
<p>Le programme <tt>mpll</tt>, ainsi que les scripts Perl et Lua
inclus dans le document, sont diffusés sous les mêmes termes que
Perl : GPL et Artistic License.</p>
<p>
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.fr"><img alt="Licence Creative Commons" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" /></a>
<br />Cette présentation est mise à disposition selon les termes de la
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.fr">Licence Creative Commons Attribution -- Pas d’Utilisation Commerciale -- Partage dans les Mêmes Conditions 3.0 non transposé</a>.
</p>
</body>
</html>