Dans la mise en page conçue par Klaus, le curseur temporel apparaît sous la forme d'une petite barre verticale évoluant de page en page selon un minuscule incrément. L'animation ci-dessous illustre seulement les premiers pas. Dans le PDF complet, le curseur commence sa course en page 1 et l'achève en page 430, il y a donc 430 occurrences du composant. Vous vous voyez coller et positionner à la main 430 fois le même objet ?

Page-timeline-indicator on Ibsen Brand's ebook, design by Klaus Nordby

La puissance du scripting est de réduire ce genre de corvée à un simple clic. Quelquefois un long développement sera nécessaire, ici la solution semble couler de source : l'utilisateur n'a qu'à créer et positionner l'objet à son emplacement initial, puis à en placer un duplicata à l'emplacement final, sur la même page. Il ne lui reste plus qu'à sélectionner le premier puis le second composant, et à lancer le script.

Avant de lancer le script, l'utilisateur crée deux instances du curseur, indiquant sa position initiale et sa position finale

Côté script, nous demandons à l'utilisateur d'indiquer combien de pages l'objet va ainsi traverser. Notre tâche ne consiste qu'à calculer le déplacement parfait à appliquer d'une page à l'autre afin que l'objet atteigne la position prévue lorsqu'il sera instancié sur la dernière page.

Voici le pseudo-code du script :

var objs = [ app.selection[0] , app.selection[1] ];
// objs[0] reflects the object at its initial state
// objs[1] reflects the final state and need to
// be removed from the current page
 
var b0 = objs[0].geometricBounds; // position of obj0
var b1 = objs[1].geometricBounds; // position of obj1
 
var d = [ b1[1]-b0[1] , b1[0] - b0[0] ];
 
var pg0 = app.activeWindow.activePage;
var pgs = app.activeDocument.pages;
 
var p1 = ... /*here we will ask the user for the last page*/;
 
var p0 = pg0.documentOffset;
var n = p1 - p0; // how many steps?
 
var dx = d[0] / n;
var dy = d[1] / n;
 
for ( var i = 1 ; i <= n ; i++ )
    {
    objs[0].duplicate(pgs[p0+i] , [i*dx,i*dy]);
    }
 
objs[1].remove();
 
 

Résultat en images

État initial

État final