Comment répéter une action pour chaque élément d’un ensemble ?#

À faire

Ajouter des exemples

Comme expliqué en réponse à la question « Comment répéter une commande N fois ? », n’est pas vraiment conçu pour les opérations de programmation « ordinaire ». On doit ainsi recourir à des astuces pour effectuer la tâche apparemment simple de répéter une opération. Cette réponse propose des solutions pour répéter une opération pour chaque élément d’un ensemble donné d’objets.

1.  Avec l’extension etoolbox#

L’extension etoolbox permet d’itérer sur une liste d’éléments séparés par des virgules, grâce à ses commandes \docsvlist et \forcsvlist (dans les noms de ces commandes, csv veut dire comma separated values) ; elles sont bien décrites dans la documentation de l’extension.

2.  Avec l’extension datatool#

L’extension datatool gère des « bases de données » (d’après les termes de sa propre documentation) et vous pouvez itérer sur les entrées d’une telle base de données à l’aide de la commande \DTLforeach.

3.  Avec l’extension forarray#

L’extension forarray définit ses propres structures de liste (list) et de tableau (array), ainsi que les commandes \ForEach et \ForArray qui permettent d’exécuter une commande pour chaque élément d’une liste ou d’un tableau, respectivement.

4.  Avec l’extension dowith#

L’extension dowith définit une paire de macros \DoWith et \StopDoing qui applique la commande fournie en premier argument à chaque item passé ensuite entre elles; un exemple trivial d’utilisation pourrait être :

\documentclass[french]{article}
  \usepackage[T1]{fontenc}    % Encodage T1 (adapté au français)
  \usepackage{lmodern}        % Caractères plus lisibles
  \usepackage{babel}          % Réglages linguistiques (avec french)
  \pagestyle{empty}           % N'affiche pas de numéro de page
  \usepackage{dowith}

  \newcommand{\chaine}[1]{\textbf{#1-}}

\begin{document}
  \DoWith\chaine a{BBB}c\StopDoing
\end{document}

Ainsi, les commandes ont trouvé 3 « items », dont un entouré d’accolades. De fait, la seule contrainte est que toutes les commandes à l’intérieur de la structure doivent être « développables » (ce qui signifie, par exemple, que vous ne pouvez pas utiliser de commandes avec des arguments optionnels).

5.  Avec l’extension commado#

Du même développeur que dowith, il y a aussi l’extension commado, qui fournit les commandes \DoWithCSL (appliquer une commande à chaque élément d’une liste séparée par des virgules (CSL pour [comma-separated list]) et \DoWithBasesExts (appliquer une commande à chacun des fichiers d’un ensemble, définis par un nom de base et un suffixe [extension]). L’utilisation de ces commandes \DoWith* est également développable (si la commande appliquée aux éléments de la liste est elle-même développable).