1 math.randomseed(os.time())
2 function dobble(prefixe,p)
3 -- prefixe : préfixe des fichiers d'image
4 -- (symboles présents sur les cartes) pdf
5 -- les noms fichiers doivent être de la forme prefixe001.pdf etc.
6 -- p : nombre premier (génération de 1+p+p² cartes à partir
7 -- du même nombre de symboles
8 -- on va générer un tableau où chaque case correspond
9 -- à une carte et contient la liste des numéros de symbole à mettre
16 printcard(cartes[0],p,prefixe);
25 -- on place les symboles aléatoirement
26 table.insert(cartes[i],intrand(j),i*p+j);
29 printcard(cartes[i],p,prefixe);
32 cartes[p+(i-1)*p+j]={};
35 cartes[p+(i-1)*p+j][k]=i;
37 -- on place les symboles aléatoirement
38 table.insert(cartes[p+(i-1)*p+j],intrand(k),(k)*p+((k*i+j-1)%p)+1);
41 printcard(cartes[p+(i-1)*p+j],p,prefixe);
47 function printcard(carte,p,prefixe)
48 -- prend une carte en entrée (tableau de p+1 éléments)
49 -- et génère le code tex d'une page à partir des images
50 -- nommées suivant le prefixe
51 tex.sprint("\\newpage\\begin{tikzpicture}[remember picture, overlay]\\coordinate(Or) at (current page.north west);");
53 tex.sprint("\\draw[rounded corners=0.5cm, line width=.2cm] ($(Or)+(0.1,-0.1)$) rectangle ($(Or)+(7.9,-7.9)$);");
54 -- entier aléatoire pour l'élément au centre
55 local has=intrand(p+1);
60 tex.sprint("\\node[scale="..scalerand(0.7,1.3)..",rotate="..intrand(360).."] at ($(Or)+(4,-4)$) {\\includegraphics[width=1cm]{"..prefixe..string.format("%02d",carte[i]+1).."}};");
62 -- les autres tout le tour, taille aléatoire, rayon variant, rotation aléatoire
63 tex.sprint("\\node[scale="..scalerand(0.7,1.3)..",rotate="..intrand(360).."] at ($("..(360/(p)*compt)..":"..scalerand(2.3,3)..")+(Or)+(4,-4)$) {\\includegraphics[width=1cm]{"..prefixe..string.format("%02d",carte[i]+1).."}};");
67 tex.sprint("\\end{tikzpicture}");
71 function intrand(p) -- retourne un entier entre 0 et p-1
72 return math.floor(p*math.random());
75 function scalerand(a,b) -- retourne un nombre aléatoire entre a et b
76 return a+(b-a)*math.random();