Aller au contenu

Le package listofitems

Un nouveau package, tiens… Ça faisait longtemps ! Il répond au doux nom de listofitems et il fait suite à une correspondance assez soutenue que j’ai eue avec Steven B. Segletes. En effet, Steven a publié le package getargs sur le CTAN le 22 mai 2016. Par simple curiosité (et connaissant un peu la façon de coder de l’individu, j’avoue), j’ai été voir le code et j’en suis ressorti carrément refroidi ! Le code est buggué et il manque des fonctionnalités, ce que j’ai immédiatement signalé à Steven. Au fil de presque 3 mois d’échanges d’email, j’ai donc écrit un package ressemblant à getargs, mais n’ayant pas ses travers.

Il s’agit d’un package qui lit une liste d’éléments et qui les stocke dans ce qui, pour l’utilisateur final, ressemble à une structure de type tableau de sorte qu’ensuite, il devient facile, d’accéder à tout élément de la liste en spécifiant son index. Bien évidemment, le (ou les) caractère de séparation entre les éléments est au choix de l’utilisateur.

Bien entendu, rien ne vaut d’aller jeter un coup d’œil au manuel, d’autant qu’il est court, mais au chapitre des fonctionnalités, voici les principales :

  • le séparateur des éléments peut être un simple token (ou même plusieurs) mais surtout, le séparateur peut être choisi entre plusieurs grâce à l’opérateur logique OU (codé «  || »)
  • la récursivité dans le recherche des éléments est possible ce qui signifie qu’à ce moment, listofitems considère que chaque élément dans une liste est lui-même une liste dont le séparateur est différent de ceux des listes de plus haut niveau ;
  • listofitems peut, à la demande, ignorer les éléments vides et/ou enlever les espaces extrêmes de chaque élément ;
  • les index peuvent être des entiers positif ou négatifs auquel cas, l’indexation se fait à partir de la fin de la liste ;
  • il est possible d’accéder facilement à la longueur de toute liste, qu’elle soit principale ou sous-liste dans le cas de recherche récursive
  • un itérateur \foreachitem a été programmé ;
  • à des fins de débogage, un itérateur particulier \showitems, affichant tous les éléments d’une liste est mis à disposition ;
  • un assignateur \itemtomacro, est disponible, qui permet d’assigner à une macro l’élément d’une liste.

Un exemple

Comment accéder au 4e terme dans cette somme algébrique : 20-7+1-8+4 ?

Un autre exemple

Comment afficher les rimes dans un poème (exemple inspiré de celui dans le fichier test) ? Il faut faire une recherche récursive : tout d’abord, isoler les vers puis dans chaque vers, isoler les mots. Une fois ceci fait, il suffit d’afficher le dernier élément dans la sous liste.

Voici le poeme, il s’agit de « À Aimée d’Alton », d’Alfred de Musset. On le stocke dans une macro \poeme :

Les 2 strophes sont séparées par \bigbreak. Dans chaque strophe, les vers sont séparés par \par. Dans chaque vers, les mots sont séparés par l’espace, l’apostrophe, le tiret, la virgule, le point et le point d’interrogation. Il y aura donc une profondeur récursive de 3 et il faudra dire :

Ensuite, il faudra ignorer les éléments vides. Par exemple, en fin du 1er vers, il y a un élément vide entre la virgule et \par qu’il faut ignorer :

Puis, il faut lire le poème avec le régime de séparateurs vu ci-dessus, en supprimant les espaces extreêmes (version étoilée) :

Une fois ceci fait :

  • le 3e vers de la 2e strophe s’affiche avec \foo[2,3] ;
  • le 4e mot du dernier vers de la 2e strophe (qui est divins) s’obtient avec \foo[2,-1,4] ;
  • on encadre chaque mot du 1er vers de la 2e strophe avec \showitems\foo[2,1] ;
  • le nombre de vers de la première strophe s’obtient avec \listlen\foo[1] ;
  • Le nombre de mots du 2e vers de la 1re strophe s’obtient avec \listlen\foo[1,2] ;
  • Pour afficher tous les dernier mots des vers de la 2e strophe : \foreachitem\mot\in\foo[2]{\foo[2,\motcnt,-1]\par}

 

En espérant que ce package sera utile à quelques uns…

Laisser un commentaire