Newsgroup: it.comp.software.tex
Titolo: Looppare delle righe di una tabella

Salve a tutti,
	facendo il loop di una tabella tutto ok:
	\newcount\Contatore
	\Contatore=0
	\loop
	\ifnum\Contatore<5
	\begin{tabular}{|c|c|c|}%
	\hline
	P&P&P\\
	\hline
	\end{tabular}\\
	\advance\Contatore+1
	\repeat
Questo funziona bene, e anzi mi sono meravigliato di avr capito come 
usare \loop \repeat :-P
Al contrario, mettendo fuori dal loop solo il begin e end, cosě:
	\newcount\Contatore
	\Contatore=0
	\begin{tabular}{|c|c|c|}%
	\loop
	\ifnum\Contatore<5
	\hline
	P&P&P\\
	\hline
	\advance\Contatore+1
	\repeat
	\end{tabular}\\
Mi arrivano tutti e 4 i seguenti errori:
! Misplaced \noalign.
\hline ->\noalign
                   {\ifnum 0=`}\fi \hrule \@height \arrayrulewidth 
\futurelet...
l.377 	\repeat
I expect to see \noalign only after the \cr of
an alignment. Proceed, and I'll ignore this case.
! You can't use `\hrule' here except with leaders.
\hline ->\noalign {\ifnum 0=`}\fi \hrule
                                          \@height \arrayrulewidth 
\futurelet...
l.377 	\repeat
To put a horizontal rule in an hbox or an alignment,
you should use \leaders or \hrulefill (see The TeXbook).
! Missing number, treated as zero.
<to be read again>
                    \futurelet
l.377 	\repeat
A number should have been here; I inserted `0'.
(If you can't figure out why I needed to see a number,
look up `weird error' in the index to The TeXbook.)
! Illegal unit of measure (pt inserted).
<to be read again>
                    \futurelet
l.377 	\repeat
Dimensions can be in units of em, ex, in, pt, pc,
cm, mm, dd, cc, bp, or sp; but yours is a new one!
I'll assume that you meant to say pt, for printer's points.
To recover gracefully from this error, it's best to
delete the erroneous units; e.g., type `2' to delete
two letters. (See Chapter 27 of The TeXbook.)
Come fare a ripetere solo le righe di una tabella?
Grazie a tutti in anticipo!!!
	Homer!!!

Come fare a ripetere solo le righe di una tabella?
Mi sembra di poter intuire quale sia il problema, (o, almeno, un problema),
ma non credo di essere in grado di costruire la soluzione.
Occorre, fondamentalmente, che le espansioni avvengano nel momento
"giusto". TeX provvede, naturalmente, dei comandi a tal fine: \noexpand,
\expandafter, ecc. Capire quale sia il momento "giusto" e combinarli
insieme in modo da ottenere il comportamento desiderato è però un po' oltre
le mie competenze.
In mancanza di meglio, posso suggerirti perltex, che senz'altro risolve il
problema in modo un po' più umano, ma mettendo in campo un marchingegno
forse eccessivo e probabilmente soggetto a qualche fragilità.
Ciao.

forse eccessivo e probabilmente soggetto a qualche fragilità.
Per esempio:
    \documentclass{article}
    \usepackage{perlmacros}
    \perlnewcommand{\tabella}{
        my $tabella = '\begin{tabular}{|c|c|c|}' . "\n";
        $tabella .= "\\hline P&P&P\\\\\\hline\n" x 5;
        $tabella .= '\end{tabular}' . "\n";
        return $tabella;
    }
    \begin{document}
    \tabella
    \end{document}
ma sono possibili anche cose più interessanti.
Ciao.


Interessante, ora mi ci metto e vedo come gestirmi il problema.
Per il \noexpand e l'\expandafter dove trovo info?
Ciao!!!
	Grazie tante, è già un buon punto di partenza, visto che avevo provato 
con vari cicli e nessuno aveva voglia di funzionare.
	Homer!!!

Per il \noexpand e l'\expandafter dove trovo info?
Posto che siano effettivamente quello che serve, nel TeXbook, senz'altro
(in ogni caso, lì ci trovi tutto). In rete, non saprei.
Immagino che nelle FAQ, o ai soliti 
www.dante.de
, 
http://www.tex.ac.uk
,
http://www.guit.sssup.it
, ci possa essere qualche riferimento.
Un'altra strada (analoga a perltex, ma meno macchinosa) potrebbe essere
utilizzare un vero linguaggio di programmazione per generare il documento
LaTeX, e lasciare fare a LaTeX quello che sa fare meglio. Strumenti come
eperl, epython o simili per il trattamento di template potrebbero
semplificare il lavoro.
Ciao.