Eppure ero sicuro di averci provato, prima di scrivere…
Grazie, come sempre.
TeX non ha un “goto”: quando una riga di testo è digerita sparisce. Perciò \loop è realizzato essenzialmente definendo una macro che contiene tutto il testo fino a \repeat, escluso; questa macro viene eseguita finché la condizione è vera perché richiama sé stessa:
`\def\loop#1\repeat{\def\iterate{#1\relax\expandafter\iterate\fi}%
\iterate \let\iterate\relax}
\let\repeat\fi`
La macro si chiama sempre \iterate; dopo che è stata definita, viene espansa: l’espansione comincia con il condizionale che viene valutato: se è vero, viene eseguito il codice e viene richiamata \iterate. Alla fine di tutto il valore di \iterate viene annullato.
Nel caso di un \loop interno (tra graffe), non c’è alcun problema perché il valore di \iterate viene cambiato localmente.
Il valore di tempb viene modificato durante il \loop interno, ma \stepcounter esegue un’assegnazione globale: per questo devi riportare il valore a zero associando tempb alla lista di azzeramento di tempa.
L’equivalenza tra \repeat e \fi serve nel caso il \loop sia in un condizionale, per bilanciare l’\if…; questo è il motivo dello strano errore “Extra \fi” che ottenevi.
Ciao
Enrico