Re: ifthen con verifica lunghezza stringa…

#21264
Up
0
Down
::

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

Go to top