Aller au contenu

Dessiner un programme « scratch » : abondance de packages !

Je viens d’écrire une petite extension pour LaTeX qui permet de dessiner un programme comme le fait le programme « scratch » (voir https://scratch.mit.edu/). Les tracés se font à l’aide de tikz, ce qui m’a permis, une fois de plus, de constater à quel point je suis incompatible avec ce langage de dessin. L’essentiel est que cela fonctionne ; l’extension se trouve ici, et la documentation est en français bien sûr. Comme dab.

En revenant de vacances, je m’aperçois qu’écrire un package pour dessiner en scratch est une activité très à la mode en ce moment. Il y a

  • scratch, le mien, basé sur tikz ;
  • scratchx, un concurrent, également basé sur tikz, qui fait exactement la même chose ;
  • mp-scratch, qui n’est pas sur le CTAN et qui utilise metapost ;
  • scratchTEX, pas encore finalisé qui s’appuie sur pstricks;
  • il y a aussi tikzcodeblocks, mais le rendu est tellement éloigné de celui du programme scratch que, malgré ce qu’il prétend, il ne peut pas être utilisé pour dessiner du scratch.

Pour se faire une idée des capacités de chaque packages et leur fidélité à l’original, j’ai essayer de comparer les protagonistes. Pour ce faire, il suffit de tester le dessin obtenu sur un algorithme naïf de niveau collège, que l’on pourrait très bien donner à faire à des élèves de 4e ou de 3e  : la décomposition en facteurs premiers d’un entier naturel.

L’original

Voici donc l’original, issue d’une capture d’écran de scratch.mit.edu :

Le package scratch

Voici ce que j’obtiens avec mon package scratch qui, à quelques bugs près, est assez proche de l’original. Il faudra que je corrige les éléments en gras ( tout et le nombre 1) et la couleur de la liste liste_facteurs_premiers dans la branche si.

Le package scratchx

Je ne l’ai jamais testé et je ne comptais pas raconter mon expérience de codage avec ce package, mais ça s’annonce assez pénible, donc je vais faire un compte-rendu.

Avant même de commencer, la documentation indique que la date du package est mars 217 ce qui est faux car ce package a été mis sur le CTAN le 27 juillet 2017, en version 1.1 (bizarre ce numéro de version). Il serait logique d’estampiller «0.1»  la première version sur le CTAN, ou à la rigueur «1.0» si l’on est très sûr de soi.

Je commence donc à coder l’algorithme et d’entrée, impossible d’utiliser le package sur une TeXLive à jour. J’ai même pensé qu’il n’était pas installé car TeX s’obstinait à me dire qu’il ne trouvait pas le fichier scratchx.sty : le problème vient des majuscules dans le nom du package. C’est donc \usepackage{ScratchX}.

Je continue : une fois le package chargé et l’environnement correctement écrit, je m’aperçois que ce package ne charge pas tikz alors même qu’il en a besoin. De plus, la librairie tikz calc et le package amssymb sont aussi nécessaires. Pourquoi une invraisemblable liste de packages est chargée par ScratchX ( xstring, fp, multido, xargs, ifthen, ifsym, calc), mais pas tikz, sa librairie calc et amssymb ?

Je commence à essayer de dessiner un bloc avec la macro \scbox{<texte>}{<couleur>}. Impossible, on a une erreur «Undefined control sequence». Après une petite enquête, c’est la macro \text du package amsmath qui provoque l’erreur : le package amsmath est aussi requis.

Après les deux premiers blocs, une impression personnelle : je n’aime pas le choix de la police employée. Elle est à empattements alors que celle utilisée par le programme scratch ne l’est pas. Je n’ai pas trouvé comment personnaliser cette police dans le manuel et plus généralement, aucune option de personnalisation ne semble disponible. Je n’aime pas non plus la couleur des traits utilisés dans les contours qui est noire, alors que ce n’est pas le cas avec le programme scratch. Enfin, le choix des noms des macros est pour le moins douteux ; il y a du français ( \boucle), de l’anglais ( \turnbox), des abréviations peu commodes à retenir ( \cb, \rb, \hb) et du délirant : il y a \sailors (où les lettres a et i sont inversées par rapport à un intuitif \sialors) et \simenon, qui fait plus penser à l’auteur du chien jaune qu’à une macro \sinon, bien plus adaptée dans ce cas ! Tout cela manque de cohérence et le choix des noms des macros fait un peu improvisation quand on sait que ce choix compte pour une bonne part dans la facilité d’utilisation d’un package.

La couleur correspondant aux listes n’est pas définie. Je considère que ce n’est pas à l’utilisateur de le faire. Tant pis, j’emploierai donc la couleur «data».

Tout se passe à peu près bien jusqu’au codage de la boucle « répéter jusqu'à». ScratchX exige que l’utilisateur calcule lui-même le nombre de blocs qui se trouvent à l’intérieur du corps de la boucle. Ainsi, toute la boucle est dessinée avant le lecture des blocs qui la composent. Cette énorme limitation a deux inconvénients : tout d’abord, l’utilisateur doit faire des calculs à la place de ScratchX, ce qui n’est pas normal. Ensuite, cette façon de procéder implique que tous les blocs doivent avoir la même hauteur. Il suffit de programmer un tant soit peu avec scratch pour savoir que ce n’est évidemment pas le cas. Par exemple, dès que des booléens sont imbriqués ou contiennent des variables, la hauteur des blocs augmente.

Parlons enfin du temps de compilation. Moi qui trouvais celui de mon package scratch très long, il fait figure de fusée face à ScratchX car le temps de compilation est carrément rédhibitoire. À tel point qu’au début, je pensais qu’il y avait une boucle infinie et j’ai arrêté la compilation manuellement plusieurs fois sans trouver mon erreur (évidemment !). Le petit programme ci-dessous met 43 secondes (sic) pour être compilé sur mon PC qui est d’une puissance «moyenne». C’est tout simplement sidérant !

Autant le dire d’emblée : utiliser le package ScratchX est désagréable et on bute très rapidement sur des limitations, des incohérences, ainsi qu’un manque de fidélité par rapport aux dessins obtenus avec le programme scratch. En l’état, je ne recommande pas l’utilisation de ce package. Il demande à être revu et amélioré pour procurer une certaine facilité d’utilisation et des fonctionnalités plus avancées.

Voici le résultat :

 

Le package mp-scratch

En ce moment, le site melusine.eu.org semble inaccessible et donc, il m’est impossible de télécharger le code source de ce package ainsi que sa documentation. Je re-essaierai plus tard…

Laisser un commentaire