ifthen con verifica lunghezza stringa…

  • Creatore
    Topic
  • #21263
    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 ?

    grazie.

Visualizzazione 1 filone di risposte
  • Autore
    Risposte
    • #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

    • #21265
      Up
      0
      Down
      ::


      Grazie. molto gentile.

      Proverò !

Visualizzazione 1 filone di risposte
  • Devi essere connesso per rispondere a questo topic.

Go to top