Ce code dissocie le texte en une longue série de mots puis les écrits dans l’espace de la fenêtre en respectant leur longueur, et en restant à angle droit. La barre d’espacement permet de démarrer ou stopper le processus d’écriture, permettant de déplacer le point d’écriture à différents endroits de la surface.

C’est une base améliorable évidemment, on peut imaginer changer typo, tailles et couleurs assez facilement.
// placer le curseur au bon endroit
// puis appuyer sur la barre d'espacement
// pour démarrer/stopper l'ecriture
String[] mots;
PFont p;
int compteur=0;
int px=200;
int py=200;
int lastrx=-2;
int lastry=-2;
boolean dessin=false;
void setup() {
size(800, 600);
stroke(0);
fill(0);
background(255);
// preparation du texte
String[] texte=loadStrings("alice_pays_merveilles-total.txt");
String tout=join(texte, " ");
// splitter mais garder les points et virugules.
mots=splitTokens(tout, " \"();:-…°*«»");
println(mots.length);
p=createFont("staticBold", 18);
textFont(p, 18);
textAlign(LEFT, CENTER);
}
void draw() {
}
void keyPressed() { // start/stop du dessin
if (dessin==true) {
dessin=false;
}
else {
dessin=true;
px=mouseX;
py=mouseY;
lastrx=0;
lastry=0;
}
}
void mouseMoved() {
if (dessin==true) { // permet de controler start / stop de l'ecriture
float longueur=textWidth(mots[compteur]+" ");
float l=dist(mouseX, mouseY, px, py);
if (l > longueur) {
// déterminer la direction
int rx=mouseX-px;
int ry=mouseY-py;
int addx, addy;
if (abs(rx)-abs(ry) > 0) { // deplacement plutot vertical ou horizontal ?
// deplacement horizontal
rx=constrain(rx, -1, 1);
ry=0;
}
else {
// deplacement vertical
ry=constrain(ry, -1, 1);
rx=0;
}
if ((rx !=-lastrx && rx !=0) || (ry != -lastry && ry != 0)) { // ne jamais revenir en arrière
fill(0);
translate(px, py);
rotate(-atan2(rx, ry)+HALF_PI); // calcul de la rotation
text(mots[compteur], 0, 0);
// le mot est ecrit, preparer le suivant
px=int(px+(rx*longueur));
py=int(py+(ry*longueur));
lastrx=rx;
lastry=ry;
compteur++;
if (compteur>=mots.length) {
compteur=0;
}
}
}
}
}