Repetir algo para cada “coisa” de um conjunto

Como explicado em outra resposta (Repetir um comando n vezes) explains, o TeX não foi explicitamente criado para operações de programação “regulares”. Por isso, temos que recorrer a truques arcanos para fazer a tarefa aparentemente simples de repetir uma operação. Essa resposta trata da repetição de uma operação para cada um dos objetos de determinado conjuntos.

O pacote etoolbox fornece iteração em uma lista de itens separados por vírgulas, em seus comandos \docsvlist e \forcsvlist ; eles estão bem descritos na documentação do pacote. O pacote datatool gerencia “bancos de dados” (de sua própria definição), e você pode fazer iteração sobre entradas de um desses bancos de dados usando o comando \DTLforeach.

O pacote forarray define suas próprias estruturas de “lista” e “série”, junto com comandos \ForEach e \ForArray, que permitem que um comando seja executado para cada elemento de uma lista ou série, respectivamente. O dowith define duas macros, \DoWith e \StopDoing , que processam cada “coisa” entre elas; um exemplo trivial de uso é:

\usepackage{dowith}
...
\begin{document}
\newcommand{\foo}[1]{\message{#1+}
\DoWith\foo a{BBB}c\StopDoing
que produz saída terminal:
a+ BBB+ c+
Assim, as macros encontraram 3 “coisas”, incluindo uma com chaves em torno dela. (Os espaços interpostos vêm do comando primitivo \message.)

A única restrição é que todos os comandos incluídos sejam “expansíveis” (o que significa, por exemplo, que você não pode usar comandos com argumentos opcionais).

Do mesmo grupo (que o dowith), vem o pacote commado, que fornece comandos \DoWithCSL (aplica um comando a cada elemento de uma lista de variáveis separadas por vírgula) e \DoWithBasesExts (aplica um comando a cada um dos arquivos de um conjunto, definidos por nome e “extensão”). O uso destas macros \DoWith* também é expansível (se o comando aplicado aos elementos da lista for expansível).

commado.sty
commado
datatool.sty
datatool
dowith.sty
dowith
etoolbox.sty
etoolbox
filesdo.sty
Distributed with commado

This answer last edited: 2013-02-20


Do you have any question? Ask on: latex.net.br - we love qood questions!