Ceci est une ancienne révision du document !
Comment répéter une commande N fois?
TeX n'a pas été conçu comme un langage de programmation, mais il arrive de vouloir répéter une partie d'un document, tout comme certaines parties de programmes doivent être exécutées plusieurs fois. La conception de schémas est un exemple évident. Dans l'exemple ci-dessous, vous n'avez évidemment pas envie de répéter manuellement le dessin de chaque graduation sur l'axe, alors que l'ordinateur saurait très bien le faire pour vous:
![LaTeX
\documentclass{article}
\usepackage{tikz}
\pagestyle{empty}
\begin{document}
\begin{tikzpicture}
\draw[line width=.8pt,->] (0cm,0pt) -- ++(5.5cm,0pt) ;
\foreach \x in {0,0.5,...,5.0} \draw (\x cm,4pt) -- (\x cm,-4pt) node[anchor=north,font=\footnotesize\it] {\x} ;
\end{tikzpicture}
\end{document}](/lib/exe/fetch.php?media=wiki:latex:/img0e450022512d1862f9df940ade9ce301.png)
Donc tous naturellement, l'environnement picture
de LaTeX et PGF (notamment)
fournissent des fonctions pour répéter des actions.
Même en dehors du contexte de dessin, il est souvent plus simple d'utiliser ces fonctionnalités,
plutôt que de les réimplémenter à l'aide d'obscures macros TeXniques.
Cette réponse traite de la répétition d'une opération un nombre donné de fois; si vous souhaitez exécuter une action pour chaque élément d'une liste d'objets lisez plutôt la réponse à la question «Comment répéter une action pour chaque élément d'un ensemble?».
En Plain TeX
Plain TeX fournit lui-même une structure \loop
… \repeat
, qui permet de répéter une commande
(ou un ensemble de commandes). La syntaxe est relativement simple, mais l'utilisation des structures conditionnelles de TeX
est assez inhabituelle, ce qui fait que beaucoup de personnes la trouvent déroutante.
Voici un exemple:
\newcount\foo \foo=10 \loop \message{\the\foo} \advance \foo -1 \ifnum \foo>0 \repeat
Dans ce code un peu intrigant, \loop
démarre la boucle terminée par \repeat
,
en même temps, \repeat
tient également lieu de \fi
pour le \ifnum
.
La boucle ci-dessus imprime donc les nombres de 10 à 1 dans le terminal, en utilisant la primitive TeX \message
.
Avec l'extension “multido”
L'extension multido est également «générique» (ie utilisable aussi bien avec Plain TeX que LaTeX);
elle définit une commande \multido
prenant trois arguments:
\multido{<variables>}{<répétitions>}{<choses à répéter>}
Lorsque la macro s'exécute, les <choses à répéter>
sont exécutées <répétitions>
fois;
l'argument <variables>
donne une liste de variables qui peuvent être utilisées dans les <choses>
.
Chaque variable est composée d'une suite de commandes et de la façon dont elle varie;
ainsi, la valeur \iz=2+4
définirait la variable \iz
à 2
la première fois, puis à 6
et 10
lors des deux itérations suivantes, et ainsi de suite.
(Si le nom de la variable commence par un i
, comme \iz
, elle représente un nombre entier;
les autres lettres initiales représentent d'autres types de données).
LaTeX dans sa version actuelle, ainsi que LaTeX3 (expérimental), comportent tous deux des commandes d'itération pour leur usage interne, utilisables par les auteurs de paquets; cependant leur utilisation dans un document LaTeX n'est pas recommandée.
Avec l'extension “ifthen”
L'extension ifthen, fournie avec LaTeX, propose la macro \whiledo
:
\newcounter{ct} ... \setcounter{ct}{1} \whiledo {\value{ct} < 5}% {% \thect\ \stepcounter {ct}% }
Avec l'extension “forloop”
L'extension forloop propose une unique macro, \forloop
:
\newcounter{ct} ... \forloop{ct}{1}{\value{ct} < 5}% {% \thect\ }
Comme vous pouvez le voir, les arguments sont le compteur, la valeur de départ et la condition de fin;
un argument facultatif fournit une valeur d'incrément (l'incrément par défaut est de 1
).
Avec l'environnement “picture”
The LaTeX picture
environment has a simple command for repeated drawing:
\multiput(x,y)(xstep,ystep){n}{obj}
which places <obj> (intended to be a bit of picture)
<n> times at positions (<x>, <y>),
(<x>+<xstep>, <y>+<ystep>),
(<x>+2<xstep>, <y>+2<ystep>) and so on, adding the
displacement again each time. The command was designed for use in
picture
, but it makes no check, and may even be used to
provide eccentric typesetting in a “regular” sentence, such as:
Here \multiput(0,0)(1,1){3}{we} are again.
with predictable (if not actually desirable) effect. It may be used with nothing but an iterative calculation in the braced argument, in which case its graphical capabilities have no effect.
Avec l'extension “PGF” (TikZ)
The pgffor package, which is part of the PGF distribution, also provides iterations to support the needs of graphics. Its syntax is in the style of common programming languages:
\documentclass{article} \usepackage{pgffor} \newcommand{\cmd}{-x-} \begin{document} \foreach \n in {1,...,4}{\cmd{}} \end{document}
The \foreach
command has the potential drawback that its repeated
unit is executed in a group, so that any calculations done within the
loop are lost (unless their result is made \global
); however, it
does not 'build in' its graphical origins (as \multiput
does) so
its potential outside its own graphics environment “home” is more
clear.
Source: Repeating a command ‘n’ times