Listing du fichier pagsd3.php
00001 <?php
00002 # # (gH) -_- pagsd3.php ; TimeStamp (unix) : 07 Janvier 2019 vers 13:25
00003 error_reporting(E_ALL | E_NOTICE | E_STRICT) ;
00004 include("std7.php") ;
00005 include("pagsd_inc.php") ;
00006 include_once("../statuno.php") ;
00007
00008 #######################################################################################
00009
00010 debutPage("PAGSD 3/5","strict","","pagsd.js") ;
00011
00012 debutSection() ;
00013 h1(s_span("P","gbleu")."roduction ".s_span("A","gbleu")."utomatisée de") ;
00014 h1(s_span("G","gbleu")."raphiques, ".s_span("S","gbleu")."tatistiques et ".s_span("D","gbleu")."ocuments") ;
00015 $gh = s_nbsp(20)." gilles.hunault \"at\" univ-angers.fr" ;
00016 h2($gh,"gvert") ;
00017 pvide() ;
00018 h2(" -- partie 3 sur 5 : Documents via $rtf, $csv et $latex ");
00019 finSection() ;
00020
00021 ##############################################################################################
00022
00023 sdl(3) ; echo cmt(' pour afficher toutes les solutions : pagsd1.php?solutions=1') ; sdl(3) ;
00024
00025 ## -------------------------------------------------------------------------------------------
00026
00027 debutSection() ;
00028
00029 $tableauDesRubriques = array() ;
00030 $idr = 0 ;
00031 $idr++; $tableauDesRubriques[$idr] = "Petites manipulations avec $gawk" ;
00032 $idr++; $tableauDesRubriques[$idr] = "Des exemples pas si simples que cela en $latex " ;
00033 $idr++; $tableauDesRubriques[$idr] = "Un tracé de courbe en $gnuplot+$latex ou $r via $php" ;
00034 $idr++; $tableauDesRubriques[$idr] = "Un graphe multi-états en $latex " ;
00035 $idr++; $tableauDesRubriques[$idr] = "Affichettes triangulaires de présentation en $latex pour le Web" ;
00036 $idr++; $tableauDesRubriques[$idr] = "Production de documents pour une liste d'émargement" ;
00037 #$idr++; $tableauDesRubriques[$idr] = "Production d'un document $rtf via $php pour une liste d'émargement" ;
00038 #$idr++; $tableauDesRubriques[$idr] = "Production d'un document $latex via $perl et $php pour une liste d'émargement" ;
00039 #$idr++; $tableauDesRubriques[$idr] = "Production d'un document $rtf , $csv ou Latex via $php pour une liste d'émargement" ;
00040 $idr++; $tableauDesRubriques[$idr] = "Liste de fonctions pour documentation" ;
00041 $tdmCRLM = new tdm($tableauDesRubriques) ;
00042 $tdmCRLM->titre() ;
00043 $tdmCRLM->menu("oui","oui","nou") ;
00044
00045 pvide() ;
00046
00047 p() ;
00048 echo "Il est possible d'afficher toutes les solutions via " ;
00049 echo href("pagsd3.php?solutions=1","?solutions=1","bouton_fin vert_pastel nou") ;
00050 echo " et de toutes les masquer avec " ;
00051 echo href("pagsd3.php?solutions=0","?solutions=0","bouton_fin jaune_pastel nou").". " ;
00052 finp() ;
00053
00054 finSection() ;
00055
00056 debutSection() ;
00057
00058 $numSerie = 1 ;
00059 $numExo = 0 ;
00060
00061 ## -------------------------------------------------------------------------------------------
00062
00063 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Petites manipualtions avec AWK
00064
00065 ## -------------------------------------------------------------------------------------------
00066
00067 blockquote() ;
00068
00069 blockquote() ;
00070
00071 p() ;
00072 echo "Il arrive souvent qu'on doive réaliser des \"petites manipulations de texte\" comme par exemple inverser le nom et " ;
00073 echo " le prénom dans le fichier suivant nommé ".href("prenomNom1.txt")." :" ;
00074 finp() ;
00075
00076 pre_fichier("prenomNom1.txt","cadrebleu") ;
00077
00078 p() ;
00079 echo "Réaliser cette inversion en moins d'une minute avec $gawk." ;
00080 finp() ;
00081
00082 p() ;
00083 echo "Etendre à des informations noms et prénoms séparées par des points-virgules, comme dans le fichier ".href("prenomNom2.txt")." :" ;
00084 finp() ;
00085
00086 pre_fichier("prenomNom2.txt","cadrebleu") ;
00087
00088 p() ;
00089 echo "Au passage, comment produire une liste triée par nom quand on utilise le format \"prénom suivi de nom\" ?" ;
00090 finp() ;
00091
00092 finblockquote() ;
00093
00094 solution($numExo,$numSerie) ;
00095
00096 p("texte") ;
00097 echo " $gawk est un [petit] langage de scripts conçu pour ce genre de problèmes. Le mot numéro 1 d'une ligne est " ;
00098 echo b("\$"."1") ;
00099 echo ", le mot 2 est " ;
00100 echo b("\$"."2") ;
00101 echo" donc en gros " ;
00102 echo b("print "."\$"."2 \" \" "."\$"."1")." permet d'inverser les mots 1 et 2. Démonstration :" ;
00103 finp() ;
00104
00105 pre_fichier("prenomNom1_sol.txt","cadre") ;
00106
00107 p() ;
00108 echo "Si les informations noms et prénoms sont séparés par des points-virgules, comme dans le fichier ".href("prenomNom2.txt").", il suffit de " ;
00109 echo " prévenir $gawk d'utiliser le point virgule comme séparateur, soit :" ;
00110 finp() ;
00111
00112 pre_fichier("prenomNom2_sol.txt","cadre") ;
00113
00114
00115 p() ;
00116 echo "Pour produire une liste triée par nom quand on utilise le format \"prénom suivi de nom\", il suffit de préciser à ".b("sort") ;
00117 echo " que le critère de tri est la clé (".em("key")." en anglais, soit l'initiale ".b("k").") numéro 2 :" ;
00118 finp() ;
00119
00120 pre_fichier("prenomNom3_sol.txt","cadre") ;
00121
00122 finsolution() ;
00123
00124 finblockquote() ;
00125
00126 ## -------------------------------------------------------------------------------------------
00127
00128 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Un exemple simple en LaTeX
00129
00130 ## -------------------------------------------------------------------------------------------
00131
00132 blockquote() ;
00133
00134 blockquote() ;
00135
00136 p() ;
00137 echo "Essayer de reproduire séparément en $latex les pages 3, 28, 61 et 64 du document " ;
00138 echo href("rapm.pdf","rapm","gbleuf nou")." dont nous donnons des copies-écran ci-dessous (images cliquables)." ;
00139 finp() ;
00140
00141 table(0,20,"cadre") ;
00142 tr() ;
00143 td("C","valigntop") ; $img = "page3.png" ; echo href($img,img($img,"",400)) ; fintd() ;
00144 td("C","valigntop") ; $img = "page28.png" ; echo href($img,img($img,"",400)) ; fintd() ;
00145 fintr() ;
00146 tr() ;
00147 td("C") ; echo "Page 3 " ; fintd() ;
00148 td("C") ; echo "Page 28 " ; fintd() ;
00149 fintr() ;
00150 tr() ;
00151 td("C","valigntop") ; $img = "page61.png" ; echo href($img,img($img,"",400)) ; fintd() ;
00152 td("C","valigntop") ; $img = "page64.png" ; echo href($img,img($img,"",400)) ; fintd() ;
00153 fintr() ;
00154 tr() ;
00155 td("C") ; echo "Page 61 " ; fintd() ;
00156 td("C") ; echo "Page 64 " ; fintd() ;
00157 fintr() ;
00158 fintable() ;
00159
00160 p("texte") ;
00161 echo "Afin d'éviter la resaisie du contenu de ces pages, les fichiers " ;
00162 echo href("page3.txt").", " ;
00163 echo href("page28.txt").", " ;
00164 echo href("page61.txt")." et " ;
00165 echo href("page64.txt")." " ;
00166 echo " en contiennent le texte ".em("brut").". On viendra recoder la page 3 en ".b("ASCII 7 bits")." donc sans " ;
00167 echo " aucun caractère accentué explicite, la page 28 en ".b("UTF-8")." et les pages 61 et 64 en ".b("ISO8859-15")." afin " ;
00168 echo " de comprendre comment on prévient $latex de ces encodages." ;
00169 finp() ;
00170
00171 p("texte") ;
00172 echo "Pour la page 28, le tracé de la fonction est dans le fichier postscript encapsulé ".href("rapm03a.eps").". " ;
00173 finp() ;
00174
00175 p("texte") ;
00176 echo "Après avoir consulté les quatre fichiers de l'archive ".href("rapm_pagsd.zip") ;
00177 echo " expliquer comment fonctionne la numérotation et l'affichage des exercices et de leurs solutions." ;
00178 echo " Au passage, on pourra essayer de deviner comment l'image de la page 28 a été générée. " ;
00179 finp() ;
00180
00181 finblockquote() ;
00182
00183 $sous = 0 ;
00184 solution($numExo,$numSerie) ;
00185
00186 $sous++ ; h3($numExo.".".$sous." Reproduction de la page 3") ;
00187
00188 p("texte") ;
00189 echo "Il n'y a pas beaucoup de difficultés à produire ce début de chapitre $latex. " ;
00190 echo " Il faut utiliser la classe ".b("book").", sans doute utiliser ".b("a4paper")." pour avoir une dimension de page " ;
00191 echo " française. Il y a trois notations spéciales : les symboles pour l'ensemble N des entiers et pour l'ensemble R " ;
00192 echo " des réels et le symbole losange pour la fin d'énoncé d'exercice. " ;
00193 echo " On trouvera ci-dessous le code $latex correspondant nommé ".href("page3.tex").". " ;
00194 finp() ;
00195
00196 pre_fichier("page3.tex","cadrebleu") ;
00197
00198 p("texte") ;
00199 echo "Après compilation de ce fichier, on obtient le fichier ".href("page3.pdf")." qui pour un " ;
00200 echo " oeil averti contient quelques différences avec la page originale. " ;
00201 sdl() ;
00202 echo " Tout d'abord il y a marqué ".b("chapter")." et non pas ".b("chapitre").". " ;
00203 echo " $latex est \"francisable\" mais il faut rajouter quelques instructions pour cela, comme par exemple " ;
00204 echo b("\\usepackage[french]{babel}").". " ;
00205 echo " Pour plus de détails, voir notamment " ;
00206 echo href("http://daniel.flipo.free.fr/frenchb/frenchb-doc.pdf","frenchb-doc").". " ;
00207 echo " Ensuite, il manque un point juste après le chiffre 1 de ".b("chapitre 1").", " ;
00208 echo " ce qui peut se faire en redéfinissant la commande ".b("\\thechapter").". \n " ;
00209 echo " On pourra consulter le fichier ".href("rapm.sty")." utilisable via ".b("\\usepackage{rapm}")." pour voir cette redéfinition. " ;
00210 sdl() ;
00211 echo " Le deuxième paragraphe a un retrait de première ligne que n'a pas l'original, de même que " ;
00212 echo " l'intitulé de l'exercice et son énoncé, mais on pourra se contenter de cette version presque identique à " ;
00213 echo " celle proposée." ;
00214 finp() ;
00215
00216 $sous++ ; h3($numExo.".".$sous." Reproduction de la page 28") ;
00217
00218 p("texte") ;
00219 echo "Si on excepte le haut de page qui reprend le numéro et le titre du chapitre, il y a une seule difficulté dans " ;
00220 echo " cette page, à savoir le tableau de variations puisque le tracé de la fonction est fourni dans le fichier " ;
00221 echo href("rapm03a.eps").". " ;
00222 finp() ;
00223
00224 p("texte") ;
00225 echo "Pour ce tableau de variations, une solution simple mais un peu longue consiste à définir une " ;
00226 echo href("http://fr.wikibooks.org/wiki/Programmation_LaTeX/Dessiner_avec_LaTeX/Dessiner_en_LaTeX_pur","figure pour $latex") ;
00227 echo " ou plutot à utiliser un " ;
00228 echo href("http://en.wikibooks.org/wiki/LaTeX/Picture","environnement picture").". " ;
00229 echo " On commence en générall par ébaucher à l'aide d'un papier et d'un crayon le tableau de variations et en déduire des " ;
00230 echo " coordonnées approximatives de tracé qu'on reprend ensuite sous $latex avec les instructions " ;
00231 echo b("\\put").", " ;
00232 echo b("\\line")." et " ;
00233 echo b("\\vector").". " ;
00234 finp() ;
00235
00236 # http://www.tuteurs.ens.fr/logiciels/latex/figures.html
00237 # http://fr.openclassrooms.com/informatique/cours/redigez-des-documents-de-qualite-avec-latex/les-figures-1
00238 # http://fr.openclassrooms.com/informatique/cours/redigez-des-documents-de-qualite-avec-latex/memento-2#r-1621909
00239 # http://www.grad.iit.edu/latex/LaTeX/FigureHelp1.pdf
00240 # http://www.math.wvu.edu/~mays/696/latex_picture_env.pdf
00241
00242 p("texte") ;
00243 echo " On trouvera ci-dessous le code $latex correspondant nommé ".href("page28.tex").". " ;
00244 # géré par le paramètre $utf de pre_fichier :
00245 # echo " (les caractères \"bizarres\" correspondent au rendu ".b("ISO8859-15")." des codes ".b("UTF-8")."). " ;
00246 echo " Le rendu est dans le fichier ".href("page28.pdf").". " ;
00247 finp() ;
00248
00249 pre_fichier("page28.tex","cadrebleu","",1) ;
00250
00251 $sous++ ; h3($numExo.".".$sous." Reproduction de la page 61") ;
00252
00253 p("texte") ;
00254 echo " On trouvera ci-dessous le code $latex correspondant nommé ".href("page61.tex").". " ;
00255 echo " Le rendu est dans le fichier ".href("page61.pdf").". " ;
00256 finp() ;
00257
00258 $sous++ ; h3($numExo.".".$sous." Reproduction de la page 64") ;
00259
00260 p("texte") ;
00261 echo " On trouvera ci-dessous le code $latex correspondant nommé ".href("page64.tex").". " ;
00262 echo " Le rendu est dans le fichier ".href("page64.pdf").". " ;
00263 finp() ;
00264
00265 $sous++ ; h3($numExo.".".$sous." Numérotation et affichage des exercices et de leurs solutions") ;
00266
00267
00268 p("texte") ;
00269 echo "La numérotation et l'affichage des exercices et de leurs solutions sont assurés par des macros LaTEX. " ;
00270 finp() ;
00271
00272 p("texte") ;
00273 echo " Les voici, extraites des fichiers de l'archive ".href("rapm_pagsd.zip") ;
00274 finp() ;
00275
00276 pre_fichier("macrosExo.txt","cadrebleu") ;
00277
00278 $sous++ ; h3($numExo.".".$sous." Génération de la figure pour la page 28") ;
00279
00280
00281 p("texte") ;
00282 echo "L'image est générée via le script suivant pour " ;
00283 echo href("http://www.gnuplot.info/","gnuplot"). " dont une documentation en français est " ;
00284 echo href("https://doc.ubuntu-fr.org/gnuplot","ici").". " ;
00285 finp() ;
00286
00287 pre_fichier("rapm03a.pls","cadrebleu") ;
00288
00289 p("texte") ;
00290 echo "Les deux fichiers externes pour les axes, nommés respectivement " ;
00291 echo b("rapm03a.ax1")." et " ;
00292 echo b("rapm03a.ax2")." sont affichés ci-dessous :" ;
00293 finp() ;
00294
00295 pre_fichier("rapm03a.ax1","cadrejaune") ;
00296 pre_fichier("rapm03a.ax2","cadrejaune") ;
00297
00298 finsolution() ;
00299
00300 finblockquote() ;
00301
00302 ## -------------------------------------------------------------------------------------------
00303
00304 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Un tracé de courbe en gnuplot et LaTeX ou R via PHP
00305
00306 ## -------------------------------------------------------------------------------------------
00307
00308 blockquote() ;
00309
00310 blockquote() ;
00311
00312 p("texte") ;
00313 echo "Ecrire une page $web en $php qui demande la définition d'une fonction, la plage de " ;
00314 echo " variations de x puis qui produit un ".b("PDF")." de la courbe de la fonction via $gnuplot et $latex" ;
00315 echo " et un ".b("PNG")." de la courbe de la fonction via $r. " ;
00316 finp() ;
00317
00318 p("texte") ;
00319 echo " Y a-t-il un intérêt à générer une figure $latex via $gnuplot plutôt qu'un fichier ".b("eps")." ?" ;
00320 finp() ;
00321
00322 finblockquote() ;
00323
00324 solution($numExo,$numSerie) ;
00325
00326 #p("texte") ;
00327 #echo "Sans problème." ;
00328 #finp() ;
00329 p("texte") ;
00330 echo "Hélas, " ;
00331 echo " à ce jour (2016), aucun étudiant ni aucun internaute averti n'a fourni de solution satisfaisante. " ;
00332 finp() ;
00333
00334 p("texte") ;
00335 echo "Toutefois on pourra lire le document " ;
00336 echo href("http://math.univ-lyon1.fr/irem/IMG/pdf/LatexPourProfMaths.pdf","LatexPourProfMaths") ;
00337 echo " (".href("LatexPourProfMaths.pdf","copie locale","gbleuf nou").") et consulter " ;
00338 echo " les sites de ".href("http://www.xm1math.net/pstplus/index.html","PstPlus")." " ;
00339 echo " et ".href("http://www.xm1math.net/pdfadd/index.html","PdfAdd").". " ;
00340 finp() ;
00341
00342 p("texte") ;
00343 echo "Afin de tester " ;
00344 echo href("http://www.gnuplot.info/","Gnuplot").", " ;
00345 echo " on pourra utiliser le script ".href("pag_01.gpl")." qui affiche à l'écran, " ;
00346 echo " le script ".href("pag_02.gpl")." qui produit un fichier ".href("https://en.wikipedia.org/wiki/Encapsulated_PostScript","Postscript encapsulé") ;
00347 echo " et le script ".href("pag_03.gpl")." qui produit le fichier LATEX ".href("pagsd03.tex")."." ;
00348 finp() ;
00349
00350 p("texte") ;
00351 echo "Voici le premier script pour Gnuplot :" ;
00352 finp() ;
00353
00354 pre_fichier("pag_01.gpl","cadrebleu") ;
00355
00356 p("texte") ;
00357 echo "Contenu du second script :" ;
00358 finp() ;
00359
00360 pre_fichier("pag_02.gpl","cadrebleu") ;
00361
00362 p("texte") ;
00363 echo "Contenu du troisième script :" ;
00364 finp() ;
00365
00366 pre_fichier("pag_03.gpl","cadrebleu") ;
00367
00368 finsolution() ;
00369
00370 finblockquote() ;
00371
00372 ## -------------------------------------------------------------------------------------------
00373
00374 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Un graphe multi-états en LaTeX
00375
00376 ## -------------------------------------------------------------------------------------------
00377
00378 blockquote() ;
00379
00380 blockquote() ;
00381
00382 p("texte") ;
00383 echo "Ecrire un document $latex qui produit la page suivante :" ;
00384 finp() ;
00385
00386 pre("cadre") ;
00387 nbsp(15) ;
00388 $img = "page9.png" ;
00389 echo href($img,img($img,"",600)) ;
00390 finpre() ;
00391
00392 p("texte") ;
00393 echo "On utilisera ". href("http://tug.org/PSTricks/main.cgi","PSTricks").". On notera qu'il s'agit de la page numéro 9." ;
00394 echo " Le PDF associé est nommé ".href("page9.pdf").". " ;
00395 finp() ;
00396
00397 finblockquote() ;
00398
00399 solution($numExo,$numSerie) ;
00400
00401 p("texte") ;
00402 echo "Voici le code $latex. Le fichier-solution se nomme ".href("graphe.tex").". " ;
00403 finp() ;
00404
00405 pre_fichier("graphe.tex","cadrebleu") ;
00406
00407 finsolution() ;
00408
00409 finblockquote() ;
00410
00411 ## -------------------------------------------------------------------------------------------
00412
00413 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Affichettes triangulaires de présentation en LaTeX pour le Web
00414
00415 ## -------------------------------------------------------------------------------------------
00416
00417 blockquote() ;
00418
00419 blockquote() ;
00420
00421 p("texte") ;
00422 echo " Une affichette triangulaire de présentation est une feuille de papier A4 imprimée des deux cotés avec le nom et le prénom " ;
00423 echo " d'une personne afin que tout le monde puisse voir son nom, que ce soit les personnes en face ou les personnes à coté. " ;
00424 echo " Images de démonstration :" ;
00425 finp() ;
00426
00427 p() ;
00428 nbsp(10) ;
00429 $img = "affichette1.jpg" ;
00430 echo href($img,img($img,"",300)) ;
00431 nbsp(10) ;
00432 $img = "affichette2.jpg" ;
00433 echo href($img,img($img,"",300)) ;
00434 finp() ;
00435
00436 p("texte") ;
00437 echo "Ecrire un document $latex pour réaliser une telle affichette. On pourra utiliser le fichier ".href("affichette.pdf") ;
00438 echo " comme modèle de document à produire. " ;
00439 echo " Ecrire ensuite un programme $php en ".b("CLI")." qui demande un nom, un prénom et " ;
00440 echo " qui produit ensuite l'affichette correspondante au format $pdf." ;
00441 finp() ;
00442
00443 p("texte") ;
00444 echo "Ecrire enfin une page Web qui utilise un formulaire pour saisir des noms et des prénoms (séparés par des " ;
00445 echo " points-virgules), à raison d'une personne par ligne et qui produit un fichier $pdf avec toutes les affichettes. " ;
00446 echo " On pourra réaliser une version \"classique\" avant de passer à une solution ".b("AJAX").". " ;
00447 finp() ;
00448
00449 finblockquote() ;
00450
00451 solution($numExo,$numSerie) ;
00452
00453 p() ;
00454 echo b("Méthodologie de développement") ;
00455 finp() ;
00456
00457 blockquote() ;
00458 p("texte") ;
00459 echo "Comme il y a plusieurs difficultés dans cet exercice, il est sans doute bon de " ;
00460 echo " réfléchir à la méthodologie de développement à utiliser. On arrivera à se convaincre " ;
00461 echo " qu'il est \"raisonnable\" de :" ;
00462 finp() ;
00463
00464 ul() ;
00465 debutli() ; p("texte") ;
00466 echo " commencer par mettre au point une page $latex \"fixe\", par exemple avec " ;
00467 echo " le nom ".b("Jean DUPOND")." ou ".b("John SMITH").", histoire de régler les " ;
00468 echo " problèmes de taille de texte sur la largeur, de grande police de caractères, " ;
00469 echo " de retournement de texte" ;
00470 echo " ;" ;
00471 finp() ; finli() ;
00472 debutli() ; p("texte") ;
00473 echo " d'enchainer avec une macro ou une commande $latex, qui, à partir " ;
00474 echo " du nom et du prénom correctement écrits (nom en majuscules, notamment) " ;
00475 echo " vient tout afficher proprement et effectuer un saut de page" ;
00476 echo " ;" ;
00477 finp() ; finli() ;
00478 debutli() ; p("texte") ;
00479 echo " d'écrire ensuite un script $php qui à partir d'un fichier texte avec un nom et prénom " ;
00480 echo " par ligne, produit tout le document $latex, avec le bon formatage au passege du " ;
00481 echo " nom et du prénom" ;
00482 echo " ;" ;
00483 finp() ; finli() ;
00484 debutli() ; p("texte") ;
00485 echo " de finir en CLI par un script qui exécute le $php sur le fichier d'entrée, compile via $latex " ;
00486 echo " ou, en mode WEB, qui récupère les données via un formulaire, construit le fichier $latex, " ;
00487 echo " compile et met le fichier $pdf résultat à disposition." ;
00488 finp() ; finli() ;
00489 finul() ;
00490
00491 finblockquote() ;
00492
00493 p("texte") ;
00494 echo "En effet, pour produire l'affichette, il faut être capable de " ;
00495 finp() ;
00496
00497 ol() ;
00498 debutli() ; p() ;
00499 echo " produire un texte en grand ;" ;
00500 finp() ; finli() ;
00501 debutli() ; p() ;
00502 echo " savoir le retourner ;" ;
00503 finp() ; finli() ;
00504 debutli() ; p() ;
00505 echo " sauter exactement 5 cm et écrire des pointillés." ;
00506 finp() ; finli() ;
00507 finol() ;
00508
00509 p("texte") ;
00510 echo" Tout ceci n'est pas vraiment un problème pour $latex, comme le montre le code-source suivant :" ;
00511 finp() ;
00512
00513 pre_fichier("affichette_Dupond.tex","cadre") ;
00514
00515 p("texte") ;
00516 echo "Dans la mesure où le code précédent définit une macro ".b("\\affichette").", " ;
00517 echo" tout ce que le programme $php doit accomplir pour produire une affichette se réduit à recopier tout le code " ;
00518 echo "jusqu'à ".b("\\thispagestyle{empty}")." puis à insérer le bon appel de cette macro avant de terminer le fichier " ;
00519 echo " $latex, soit le code $php : " ;
00520 finp() ;
00521
00522 pre_fichier("affichette.php","cadrejaune") ;
00523
00524 p("texte") ;
00525 echo "sachant que le début du fichier $latex à utiliser " ;
00526 echo " est dans le fichier ".href("affichette_debut.latex").". " ;
00527 finp() ;
00528
00529 p("texte") ;
00530 echo " La page Web à réaliser pour automatiser ceci, soit " ;
00531 echo href("../affichette.php","affichette.php") ;
00532 echo " ne présente aucune difficulté car il s'agit juste de lire les noms, prénoms et insérer autant d'appels " ;
00533 echo " de la macro $latex que de personnes..." ;
00534 finp() ;
00535
00536 finsolution() ;
00537
00538 finblockquote() ;
00539
00540 ## -------------------------------------------------------------------------------------------
00541
00542 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Production de documents pour une liste d'émargement
00543
00544 ## -------------------------------------------------------------------------------------------
00545
00546 blockquote() ;
00547 $numQue = 0 ;
00548 blockquote() ;
00549
00550 p("texte") ;
00551 echo "On dispose d'une liste d'émargement comme le fichier ".href("emarge.txt")." dont le format est très simple : " ;
00552 echo " chaque ligne non vide qui n'est pas un commentaire (repéré par le symbole dièse) " ;
00553 echo " comporte une information ".b("prénom")." puis une information ".b("nom").". Un point virgule sépare ces deux informations qui sont parfois " ;
00554 echo " composées de plusieurs mots. " ;
00555 finp() ;
00556
00557 $numQue++ ; h3("Question ".$numExo.".".$numQue." : production d'un document $csv pour $excel via $php") ;
00558
00559 blockquote() ;
00560 p("texte") ;
00561 echo "Ecrire un programme $php en ".b("CLI")." qui admet comme seul paramètre le nom d'un fichier et " ;
00562 echo" qui produit une liste d'émargement pour $excel au format nom (en majuscules), prénom et signature." ;
00563 finp() ;
00564 finblockquote() ;
00565
00566 $numQue++ ; h3("Question ".$numExo.".".$numQue." : production d'un document $rtf pour $word via $php") ;
00567
00568 blockquote() ;
00569 p("texte") ;
00570 echo "Ecrire un programme $php en ".b("CLI")." qui admet comme seul paramètre le nom d'un fichier et " ;
00571 echo" qui produit une \"belle\" liste d'émargement pour $word " ;
00572 echo " au format numéro, nom (en majuscules), prénom et signature." ;
00573 finp() ;
00574 p("texte") ;
00575 echo "Pour plus d'informations sur ".b("RTF")." on pourra consulter " ;
00576 echo " l'exercice 1 de nos cours sur l'".href("../Farcompr/sacex.htm","archivage")."." ;
00577 finp() ;
00578 finblockquote() ;
00579
00580 $numQue++ ; h3("Question ".$numExo.".".$numQue." : production d'un document $latex via $perl") ;
00581
00582 blockquote() ;
00583 p("texte") ;
00584 echo "Ecrire un programme ".bleu("perl")." en ".b("CLI")." qui admet comme seul paramètre le nom d'un fichier et " ;
00585 echo" qui produit une \"belle\" liste d'émargement en PDF via LaTeX. " ;
00586 finp() ;
00587 finblockquote() ;
00588
00589 $numQue++ ; h3("Question ".$numExo.".".$numQue." : production d'une liste d'émargement via une page Web") ;
00590
00591 blockquote() ;
00592 p("texte") ;
00593 echo "Ecrire une page Web en $php qui demande via un formulaire le nom d'un fichier et une valeur d'option (".b("W").", ".b("E")." ou ".b("L").") et " ;
00594 echo" pour produire une \"belle\" liste d'émargement respectivement pour $word, $excel ou $pdf (via $latex) suivant la valeur de l'option. " ;
00595 finp() ;
00596
00597 p("texte") ;
00598 echo "On organisera ce programme à l'aide de sous-programmes et de fichiers-inclus afin d'en faire ensuite rapidement une page $web " ;
00599 echo " avec un formulaire " ;
00600 echo " où le nom du fichier est remplacé par la saisie des données dans un ".bleu("<textarea>") ;
00601 echo " ou par la sélection du fichier dans l'explorateur sous-jacent. " ;
00602 #echo " On pourra dans un premier temps se contenter d'un fichier $rtf pour $word et d'un fichier $csv pour $excel." ;
00603 echo " On réfléchira aussi à ce qu'il faut ajouter pour fournir une \"vraie\" liste d'émargement utilisable." ;
00604 finp() ;
00605 finblockquote() ;
00606
00607 finblockquote() ;
00608
00609 solution($numExo,$numSerie) ;
00610
00611 p("texte") ;
00612 echo "Hélas, " ;
00613 echo " à ce jour (2016), aucun étudiant ni aucun internaute averti n'a fourni de solution complète satisfaisante. " ;
00614 finp() ;
00615
00616 $numQue = 0 ;
00617
00618 p("texte") ;
00619 echo "Voici quelques éléments partiels de réponses..." ;
00620 finp() ;
00621
00622 $numQue++ ; h3("Réponse ".$numExo.".".$numQue." : production d'un document $csv pour $excel via $php") ;
00623
00624 p("texte") ;
00625 echo "Une liste d'émargement n'est jamais qu'un tableau à trois colonnes. Ici, tout est déjà presque prêt puisque le " ;
00626 echo " découpage en nom est repérable grâce à un point virgule. Comme le \"vrai\" séparateur est la virgule pour le " ;
00627 echo " \"vrai\" format ".href("https://fr.wikipedia.org/wiki/Comma-separated_values","CSV").", " ;
00628 echo " il reste juste à mettre le nom des colonnes en début de fichier, inverser nom et prénom et passer le nom en majuscule. " ;
00629 echo " Ce genre de traitement s'effectue plus facilement ligne à ligne que globalement et c'est pourquoi nous n'utilisons pas ici " ;
00630 echo " la fonction ".href("http://php.net/manual/fr/function.file-get-contents.php","file_get_contents")." de ".$php."." ;
00631 finp() ;
00632
00633 p("texte") ;
00634 echo "Le programme solution est ".href("montresource.php?nomfic=emarge_csv.php","ici")." et fournit, pour le fichier exemple " ;
00635 echo href("emarge.txt").", la feuille d'émargement nommée ".href("emarge_php.csv").". " ;
00636 echo " Il n'y a sans doute pas besoin de numéroter les noms et prénoms, vu qu'Excel et Open Office Calc affichent systématiquement " ;
00637 echo " des numéros de ligne. Par contre le format des cellules laisse à désirer, d'où la réponse à la question suivante." ;
00638 finp() ;
00639
00640 $numQue++ ; h3("Réponse ".$numExo.".".$numQue." : production d'un document $rtf pour $word via $php") ;
00641
00642 p("texte") ;
00643 echo "Un fichier au format ".href("https://fr.wikipedia.org/wiki/Rich_Text_Format","RTF")." n'est jamais au fond qu'un fichier texte avec des marqueurs " ;
00644 echo b("{")." et ".b("}").". Le plus simple est sans doute de mettre au point sous Word la mise en forme souhaitée puis de " ;
00645 echo " recopier l'en-tête (fixe) avant de programmer la partie variable (chacune des lignes du tableau)." ;
00646 finp() ;
00647
00648 p("texte") ;
00649 echo "Le programme solution est ".href("montresource.php?nomfic=emarge_rtf.php","ici")." et fournit, pour le fichier exemple " ;
00650 echo href("emarge.txt").", la feuille d'émargement nommée ".href("emarge_php.rtf").". " ;
00651 echo "Dans la mesure où les balises ".b("RTF")." sont écrites en minuscules, nous avons choisi de mettre dans " ;
00652 echo " la partie variable les mots variables en majuscules (voir ci-dessous) " ;
00653 echo " afin de pouvoir les remplacer facilement par les \"vrais\" noms et prénoms." ;
00654 finp() ;
00655
00656 pre_fichier("milieu_emarge_rtf.txt","cadre") ;
00657
00658 $numQue++ ; h3("Réponse ".$numExo.".".$numQue." : production d'un document $latex via $perl") ;
00659
00660 p("texte") ;
00661 echo "Le programme solution est ".href("montresource.php?nomfic=emarge_latex.pl","ici")." et fournit, pour le fichier exemple " ;
00662 echo href("emarge.txt").", la feuille d'émargement nommée ".href("lstemarge.pdf").". " ;
00663 echo " Notre programme $perl utilise des fonctions personnelles via le module " ;
00664 echo " nommé ".href("strFuncs.pm").". " ;
00665 finp() ;
00666
00667 $numQue++ ; h3("Réponse ".$numExo.".".$numQue." : production d'une liste d'émargement via une page Web") ;
00668
00669 p("texte") ;
00670 echo " Pour produire une \"vraie\" liste d'émargement utilisable, il faut sans doute " ;
00671 echo " ajouter un titre autre que «liste emargement», donner la possibilité d'utiliser " ;
00672 echo " la date du jour ou d'entrer la date à laquelle la liste doit être remplie, offrir la " ;
00673 echo " possibilité d'ajouter quelques lignes vides pour des personnes en surnombre... " ;
00674 finp() ;
00675
00676 finsolution() ;
00677 finblockquote() ;
00678
00679 ## -------------------------------------------------------------------------------------------
00680
00681 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Liste de fonctions
00682
00683 ## -------------------------------------------------------------------------------------------
00684
00685 blockquote() ;
00686 $numQue = 0 ;
00687 blockquote() ;
00688
00689 $numQue++ ; h3("Question ".$numExo.".".$numQue) ;
00690
00691 p("texte") ;
00692 echo "On dispose d'un code source, disons " ;
00693 echo href("strfun.zip","strfun.php")." et on veut la liste des fonctions du fichier, " ;
00694 echo " par ordre alphabétique, avec le numéro de ligne du début de la fonction. " ;
00695 echo " Quelle solution ".b("rapide")." en ligne de commandes ".em("Unix")." peut-on utiliser" ;
00696 echo " ?" ;
00697 finp() ;
00698
00699 p("texte") ;
00700 echo "Est-ce que les fonctions vectorielles de $R fournissent une solution concise à ce problème" ;
00701 echo " ?" ;
00702 finp() ;
00703
00704 $numQue++ ; h3("Question ".$numExo.".".$numQue) ;
00705
00706 p("texte") ;
00707 echo "On veut maintenant un affichage «propre», sans le mot ".em("function") ;
00708 echo " et avec un affichage formaté des numéros de ligne. De plus on voudrait disposer " ;
00709 echo " de toutes les fonctions en cas d'utilisation d'un fichier ".em("maitre") ;
00710 echo " avec des ".em("include")." ou des ".em("require").". On utilisera $perl." ;
00711 #".href("http://www.skilly.com/mag/cli-php-en-ligne-commande/","PHP-cli")."." ;
00712 finp() ;
00713
00714 p("texte") ;
00715 echo "Rajouter des sorties Word (RTF), PDF (LaTeX) et XHTML, le choix du format se faisant à l'aide d'un " ;
00716 echo " paramètre ".b("-o")." ou ".b("--output")."." ;
00717 finp() ;
00718
00719 $numQue++ ; h3("Question ".$numExo.".".$numQue) ;
00720
00721 p("texte") ;
00722 echo " Ce serait bien de disposer aussi d'exemples pour chaque fonction et de passer par un " ;
00723 echo " affichage Web pour voir les fonctions à afficher. On implémentera comme " ;
00724 echo " d'habitude cela dans une page Web valide pour ".b("XHTML strict").". " ;
00725 finp() ;
00726
00727 $numQue++ ; h3("Question ".$numExo.".".$numQue) ;
00728
00729 p("texte") ;
00730 echo " Compléter le fichier ".href("strfun.zip","strfun.php")." pour que la documentation soit " ;
00731 echo " au format ".b("Doxygen").". Quels sont les avantages et les inconvénients de ".b("Doxygen") ;
00732 echo " par rapport à ce que nous avons développé" ;
00733 echo " ?" ;
00734 finp() ;
00735
00736 finblockquote() ;
00737
00738 solution($numExo,$numSerie) ;
00739
00740 $numQue = 0 ;
00741
00742 ## --------------------------------------------------------------------------------
00743
00744 p("texte") ;
00745 echo "Pas encore ! " ;
00746 echo "A ce jour (2016), aucun étudiant ni aucun internaute averti n'a fourni de solution complète satisfaisante." ;
00747 finp() ;
00748
00749 p("texte") ;
00750 echo "Voici toutefois quelques éléments de réponse." ;
00751 finp() ;
00752
00753 ## --------------------------------------------------------------------------------
00754
00755 $numQue++ ; h3("Réponse ".$numExo.".$numQue -- Commandes ".em("Unix"),"gvert") ;
00756
00757 ## --------------------------------------------------------------------------------
00758
00759 p("texte") ;
00760 echo "Pour trouver les numéros de ligne d'un fichier correspondant à un mot particulier, " ;
00761 echo " le système ".em("Unix")." fournit la commande ".b("grep")." avec le paramètre ".b("-n")."." ;
00762 echo " On pourrait donc écrire pour détecter le mot ".b("function")." :" ;
00763 finp() ;
00764
00765 pre_fichier("grep01.txt","cadre") ;
00766
00767 p("texte") ;
00768 echo "Afin d'éviter de renvoyer des lignes comme ".b('"} # end of function"') ;
00769 echo " qui contiennent aussi le mot ".b("function").", on peut essayer de détecter ".b("function") ;
00770 echo " écrit en début de ligne via le symbole ".b("^")." dans l'expression régulière de recherche"." :" ;
00771 finp() ;
00772
00773 pre_fichier("grep02.txt","cadre") ;
00774
00775 p("texte") ;
00776 echo "Malheureusement, s'il y a des espaces devant le mot ".b("function")." les lignes correspondantes " ;
00777 echo " ne seront pas trouvées. Il vaut donc mieux écrire"." :" ;
00778 finp() ;
00779
00780 pre_fichier("grep03.txt","cadre") ;
00781
00782 p("texte") ;
00783 echo "Voici le résultat de l'exécution de cette commande" ;
00784 finp() ;
00785
00786 pre_fichier("grep03_sor.txt","cadrejaune") ;
00787
00788 p("texte") ;
00789 echo "On trouvera " ;
00790 echo href("http://manpagesfr.free.fr/man/man1/grep.1.html","ici") ;
00791 echo " une page d'aide complète sur ".b("grep")." en français." ;
00792 finp() ;
00793
00794 p("texte") ;
00795 echo "Il faut maintenant trier les lignes affichées et heureusement " ;
00796 echo em("Unix")." fournit la commande ".b("sort").". On pourrait penser utiliser la" ;
00797 echo " redirection des sorties via le symbole ".b(">")." soit le code " ;
00798 finp() ;
00799
00800 pre_fichier("grep04.txt","cadre") ;
00801
00802 p("texte") ;
00803 echo "mais ce n'est pas la peine car il est possible de chainer les commandes " ;
00804 echo " (la sortie d'une commande est l'entrée de la suivante) via le symbole ".b("|") ;
00805 echo " nommé ".b("pipe")." en anglais -- tuyau en français --"." :" ;
00806 finp() ;
00807
00808 pre_fichier("grep05.txt","cadre") ;
00809
00810 p("texte") ;
00811 echo b("sort")." a bien effectué un tri, mais ce n'est pas celui que nous voulions"." :" ;
00812 finp() ;
00813
00814 pre_fichier("grep05_sor.txt","cadrejaune") ;
00815
00816 p("texte") ;
00817 echo "En fait, ".b("sort")." a trié selon l'ordre alphabétique des numéros de ligne. Ce qu'on " ;
00818 echo " voudrait, c'est trier selon le deuxième mot (ou champ ou clé, ".em("key")." en anglais). " ;
00819 echo " Pour cela, il faut utiliser le paramètre ".b("-k")." :" ;
00820 finp() ;
00821
00822 pre_fichier("grep06.txt","cadre") ;
00823
00824 p("texte") ;
00825 echo "Et voilà le travail"." :" ;
00826 finp() ;
00827
00828 pre_fichier("grep06_sor.txt","cadrejaune") ;
00829
00830 p("texte") ;
00831 echo "On trouvera " ;
00832 echo href("http://manpagesfr.free.fr/man/man1/sort.1.html","ici") ;
00833 echo " une page d'aide complète sur ".b("sort")." en français." ;
00834 finp() ;
00835
00836 p("texte") ;
00837 echo "Ce n'est bien sûr pas très «propre». " ;
00838 echo " Pour avoir quelque chose de «bien beau, bien propre», on peut " ;
00839 echo " utiliser " ;
00840 echo href("http://marionpatrick.free.fr/man_html/html/gawk_1.html","gawk") ;
00841 echo " par exemple avec le code suivant " ;
00842 finp() ;
00843
00844 pre_fichier("grep07.sh","cadre") ;
00845
00846 p("texte") ;
00847 echo "Le fichier awk correspondant, soit ".href("grep07.awk").", vient juste " ;
00848 echo " réordonner les informations, avec d'abord le nom de la fonction puis le numéro de ligne, " ;
00849 echo " avec des formatages adaptés pour une meilleure lisibilité :" ;
00850 finp() ;
00851
00852 pre_fichier("grep07.awk","cadre") ;
00853
00854 ## --------------------------------------------------------------------------------
00855
00856 h3("Réponse ".$numExo.".$numQue -- Logiciel $R","gvert") ;
00857
00858 ## --------------------------------------------------------------------------------
00859
00860 p("texte") ;
00861 echo "Le logiciel $R dispose aussi d'une " ;
00862 echo " fonction ".hrrr("grep")." dans le package ".hrrp("base")." qui ressemble très fortement " ;
00863 echo " à la commande ".em("Unix")." de même nom. " ;
00864 echo "Il suffit donc d'écrire, après la lecture du fichier par ".noir("lignes <- readLines(fichier)")." \n" ;
00865 finp() ;
00866
00867 pre_fichier("grep01.r","cadre") ;
00868
00869 p("texte") ;
00870 $bs = "\\";
00871 $pg = "(";
00872 echo "L'expression régulière utilisée ici ".noir("^".$bs.$bs."s*+function")." est un tout petit peu plus compliquée \n" ;
00873 echo "que la simple chaine ".noir("^function")." \n" ;
00874 echo "car \n" ;
00875 finp() ;
00876
00877 ul() ;
00878
00879 debutli() ; p() ;
00880 echo "il peut y avoir plusieurs espaces entre ".noir("^")." et ".noir("function")." \n" ;
00881 echo "d'où la partie ".noir("\\s*")." ; \n" ;
00882 finp() ; finli() ;
00883
00884 debutli() ; p() ;
00885 echo "pour saisir un \"slash\" dans une expression régulière, il faut doubler ce symbole, d'où ".noir("\\\\s*")." ; \n" ;
00886 finp() ; finli() ;
00887
00888 finul() ;
00889
00890 p("texte") ;
00891 echo "Si de plus on utilise le paramètre ".noir("value")." avec la valeur ".noir("TRUE")." dans l'appel de " ;
00892 echo " la fonction ".hrrr("grep") ;
00893 echo ", $R renvoie la chaine détectée. Voici ce qu'on \n" ;
00894 echo "peut donc facilement obtenir avec $R juste avec ".noir("grep()")." et l'expression régulière : \n" ;
00895 finp() ;
00896
00897 pre_fichier("grep_r02.txt","cadre") ;
00898
00899 p("texte") ;
00900 echo "Pour ne garder que le deuxième mot de chaque ligne trouvée, on peut utiliser une fonction \n" ;
00901 echo "anonyme. Voici donc le texte complet de la fonction qui construit la liste des fonctions d'un fichier-script : \n" ;
00902 finp() ;
00903
00904 pre_fichier("grep_fonctions.r","cadre") ;
00905
00906 p("texte") ;
00907 echo "Et le rendu est bien conforme à ce qu'on voulait \n" ;
00908 finp() ;
00909
00910 pre_fichier("grep_fonctions_sor.txt","cadrejaune") ;
00911
00912 ## --------------------------------------------------------------------------------
00913
00914 $numQue++ ; h3("Réponse ".$numExo.".$numQue -- Programmation $perl","gvert") ;
00915
00916 ## --------------------------------------------------------------------------------
00917
00918 p("texte") ;
00919 echo "Détecter le mot function en début de ligne n'est vraiment un problème en $perl. " ;
00920 echo " Par contre pour passer en revue ".b("transitivement")." tous les ".em("include")." et " ;
00921 echo " ".em("require")." demande un toutpetit peu plus de réflexion. Voici le code complet :" ;
00922 finp() ;
00923
00924 pre_fichier("ldfPhp.pl","cadrebleu") ;
00925
00926 p("texte") ;
00927 echo "Voici un exemple de sortie pour la page Web qui correspond à l'URL ".href("../Shspdb/","Shspdb/index.php")."..." ;
00928 finp() ;
00929
00930 textarea_fichier("ldfphp","cadrejaune",30,120,"ldf","ldfPhp.sor"," ") ;
00931
00932 $numQue++ ; h3("Réponse ".$numExo.".$numQue -- Programmation $php, fonctions et exemples","gvert") ;
00933
00934 p("texte") ;
00935 $url1 = "http://forge.info.univ-angers.fr/~gh/internet/stdphp.php" ;
00936 $url2 = "http://www.info.univ-angers.fr/~gh/wstat/statghfns.php" ;
00937 echo "Nous avons déjà vu, avec ".href($url1,"std.php")." et ".href($url2,"statgh.r") ;
00938 echo " des exemples d'une telle page. Pour batir une telle interface, il faut bien sûr deux fichiers, " ;
00939 echo " celui du programme source, par exemple ".href("std.php")." et celui des exemples, comme ".href("stdphp.cmp") ;
00940 echo " pour les fonctions $php, les fichiers ".href("statgh.r")." et ".href("statgh.xmp")." pour les fonctions $R." ;
00941 echo " Le code-source de chaque page est consultable via un lien en bas de chaque page. Il est court parce qu'il n'y a " ;
00942 echo " au départ pas grand-chose à faire, à savoir construire un élément ".b("textarea")." à gauche de la page avec la " ;
00943 echo " liste alphabétique des fonctions, l'affichage pour chaque fonction étant géré par ".b("Javascript").". " ;
00944 finp() ;
00945
00946 p("texte") ;
00947 echo " Chaque fonction est consultable via l'url de la page et le paramètre ".b("lafns").". Ainsi, avec l'URL " ;
00948 finp() ;
00949
00950 pre("cadre") ;
00951 echo b(" http://forge.info.univ-angers.fr/~gh/internet/stdphp.php?lafns=entetesTableau") ;
00952 finpre() ;
00953
00954 p("texte") ;
00955 echo "il est possible d'arriver directement à l'affichage de la fonction ".b("entetesTableau").". " ;
00956 finp() ;
00957
00958 p("texte") ;
00959 echo "Comment être sûr que chaque fonction est documentée, c'est-à-dire qu'elle a au moins un exemple ?" ;
00960 echo " Un simple programme $php pour coupler les noms de fonctions définies et les appels de fonctions doit suffire, soit par " ;
00961 echo " exemple le programme $php nommé ".b("stdphp_check.php")." suivant qui s'exécute en liugne de commande :" ;
00962 finp() ;
00963
00964 pre_fichier("stdphp_check.php","cadre") ;
00965
00966 ## --------------------------------------------------------------------------------
00967
00968 $numQue++ ; h3("Réponse ".$numExo.".$numQue -- Documentation Doxygen","gvert") ;
00969
00970 ## --------------------------------------------------------------------------------
00971
00972 p("texte") ;
00973 echo b("Doxygen")." est un système de génération automatique de documentation via des codes spéciaux dans les commentaires. " ;
00974 echo " Le site officiel est ".href("http://www.stack.nl/~dimitri/doxygen/","ici") ;
00975 echo " et un tutoriel en français ".href("http://axiomcafe.fr/tutoriel-documenter-un-code-avec-doxygen","là").". " ;
00976 finp() ;
00977
00978 finsolution() ;
00979
00980 finblockquote() ;
00981
00982 ## -------------------------------------------------------------------------------------------
00983
00984 p() ;
00985 echo href("montresource.php?nomfic=pagsd3.php","Code-source de cette page","orange_stim nou")." ; " ;
00986 echo " fichiers inclus : ".href("montresource.php?nomfic=pagsd_inc.php","pagsd_inc.php","orange_stim nou") ;
00987 echo " et ".href("montresource.php?nomfic=pagsd.js","pagsd.js","orange_stim nou")."." ;
00988 finp() ;
00989
00990 finSection() ;
00991 finPage() ;
00992 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)