Salve a tutti,
ho un file di latex che viene processato e mi sostituisce una variabile con il campo da stampare…
<%customernumber%>
ora vorrei controllare il campo,
se è lungo 16 caratteri allora devo scrivere C.F.
se è lungo 11 P.I.
se è vuoto non scrivo niente.qualche idea?
Se sei sicuro che ci siano solo caratteri alfanumerici, si può fare così:
`\def\CFPI#1{%
\begingroup
\count0=0
\calcstringlen#1\end
\ifnum\count0=16 C.F. #1\fi
\ifnum\count0=11 P.I. #1\fi
\endgroup}
\def\calcstringlen#1{%
\ifx#1\end
\else
\advance\count0 by 1
\expandafter\calcstringlen
\fi}`
Ti basterà fare in modo che il tuo preprocessore scriva il testo variabile come argomento di \CFPI, cioè che nel .tex risulti scritto, per esempio,
`\CFPI{XXXYYY00Z00Z999X}
\CFPI{12345678901}`
Spiegazione: passiamo prima di tutto l’argomento di \CFPI alla macro \calcstringlen; svolgiamo tutto in un gruppo perché voglio usare un contatore temporaneo che abbiamo azzerato.
La macro \calcstringlen agisce ricorsivamente sulla lista di token #1\end (#1 sta ovviamente per l’argomento di \CFPI); il suo primo argomento è il primo token nella lista “#1\end”; se questo token è \end non c’è nulla da fare e il contatore vale 0. Altrimenti il contatore viene aumentato di 1 e viene richiamata \calcstringlen sulla lista di token che rimane dopo aver tolto il primo. E così via, a un certo punto si trova \end che termina la ricorsione. Non c’è niente di speciale in \end, un qualunque comando sarebbe andato bene allo stesso modo.
Una piccola osservazione sull’expandafter: se non lo mettessimo, il token seguente a \calcstringlen sarebbe \fi, che non va bene; l’espansione di \fi è vuota, quindi \calcstringlen si trova davanti proprio il token successivo della lista originale.
Ora si guarda il valore del contatore temporaneo: se è 16 si stampa C.F. e l’argomento; se il valore è 11 si stampa P.I. e l’argomento; altrimenti non esce nulla.
Ciao
Enrico