Projections
Le but est d'arriver à un fichier en format PDF qu'il est possible de projeter, page par page; en outre, la durée pendant laquelle une page reste visible doit pouvoir être réglée séparément pour chaque page.
Fabrication du fichier PDF
Je suis parti d'un fichier de texte brut où tous les caractères à signes diacritiques (é, è, ç, à, ... â, ê, ... ä, ÿ, ... Ä, Ö, ...) ont été remplacés par leur équivalent en TeX.
Comme PSTricks, un paquetage faisant partie de la collection TeX/LaTeX, a des difficultés pour effectuer des calculs (en effet, TeX est un système de balisage et non pas un langage de programmation au sens actuel), les calculs des points et lignes graphiques sont effectués par Python. On arrive à rédiger ainsi un fichier ".tex" balisé correctement.
À partir de là, s'applique la chaîne de fabrication latex, dvips, ps2pdf ce que résume la méthode ci-après:
def close(self, texte_string, nomf="fichier"): "écrit le fichier '.tex' et effectue la suite de compilation" info_str = " ".join([self.nomtexte, str(len(self.lignes)), "lignes\n", str(len(self.mots)), "mots\n", str(self.alea) ]) open("i" + nomf + ".info", "w").write(info_str) open(nomf + ".tex", "w").write(texte_string) comm = " ".join(["latex", nomf]) os.system(comm) comm = " ".join(["dvips", nomf]) os.system(comm) comm = " ".join(["ps2pdf", nomf + ".ps"]) os.system(comm)
Une autre solution, tout en Python, est d'utiliser reportLab.
Projection
Pour projeter le fichier PDF, j'utilise xpdf. Pour obtenir un défilement automatique avec des durées de projections spécifiques à chaque page, il faut écrire une méthode
def execute(self, ecarts, pageini, nomf="fichier"): """projection rythmée La projection commence avec la page 'pageini' et continue jusqu'à la la 'pagenini + len(ecarts) - 1' """ np = str(pagenini) comm = " ".join(["xpdf -remote monserveur -fullscreen", nomf + ".pdf", np, "&"]) os.system(comm) comm = 'xpdf -remote monserveur -exec "nextPage"' for ecart in ecarts: time.sleep(ecart) os.system(comm) comm = 'xpdf -remote monserveur -quit' os.system(comm)
Lancement de xpdf
par l'option -remote serveur xpdf est informé que les ordres ne lui parviendront
pas du clavier, mais d'un «tuyau» installé pour la circonstance (NB que la dénomination "monserveur" est arbitraire)
l'option & indique que le processus xpdf ne doit pas s'arrêter
l'option -fullscreen indique simplement que seule la page affichée doit apparaître
sur l'écran.
Approvisionnement des pages
on approvisionne xpdf en lui envoyant par le truchement de monserveur
l'option -exec "nextPage" qui remplace la touche PageDown en fonctionnement interactif habituel. Ce qui n'est pas bien décryptable dans la man-page, c'est qu'il faut mettre nextPage entre " ". Je n'ai compris le fonctionnement que grâce aux informaticiens de la Liste Python.
Clôture du processus
On envoie l'option -quit de nouveau par le «tuyau» monserveur
Pour finir
Les deux bouts de code illustrent l'intégration par Python de plusieurs processus. Python apporte sa clarté dans l'ordonnancement et sa puissance de calcul et permet ainsi de se concentrer sur le projet lui-même au lieu de recourir à des logiciels de calcul à la syntaxe obsolète (p.ex. metapost, qui au premier abord a l'air plus perfectionné que PSTricks, mais est visiblement antérieur aux notions de la Programmation OO; donc un balisage statique selon PSTRicks écrit en Python est bien plus efficace et plus clair.).
rb