Codice fiscale

  • Creatore
    Topic
  • #73247
    Up
    0
    Down
    ::


    Vedendo che OldClaudio ha inviato su CTAN un nuovo pacchetto, ne presento una versione LaTeX3 🙂

    `\documentclass{article}
    \usepackage{xparse}
    \ExplSyntaxOn
    \prop_new:N \g_cf_odd_prop
    \prop_new:N \g_cf_even_prop
    \prop_put:Nnn \g_cf_odd_prop { 0 } { 1 }
    \prop_put:Nnn \g_cf_odd_prop { 1 } { 0 }
    \prop_put:Nnn \g_cf_odd_prop { 2 } { 5 }
    \prop_put:Nnn \g_cf_odd_prop { 3 } { 7 }
    \prop_put:Nnn \g_cf_odd_prop { 4 } { 9 }
    \prop_put:Nnn \g_cf_odd_prop { 5 } { 13 }
    \prop_put:Nnn \g_cf_odd_prop { 6 } { 15 }
    \prop_put:Nnn \g_cf_odd_prop { 7 } { 17 }
    \prop_put:Nnn \g_cf_odd_prop { 8 } { 19 }
    \prop_put:Nnn \g_cf_odd_prop { 9 } { 21 }
    \prop_put:Nnn \g_cf_odd_prop { A } { 1 }
    \prop_put:Nnn \g_cf_odd_prop { B } { 0 }
    \prop_put:Nnn \g_cf_odd_prop { C } { 5 }
    \prop_put:Nnn \g_cf_odd_prop { D } { 7 }
    \prop_put:Nnn \g_cf_odd_prop { E } { 9 }
    \prop_put:Nnn \g_cf_odd_prop { F } { 13 }
    \prop_put:Nnn \g_cf_odd_prop { G } { 15 }
    \prop_put:Nnn \g_cf_odd_prop { H } { 17 }
    \prop_put:Nnn \g_cf_odd_prop { I } { 19 }
    \prop_put:Nnn \g_cf_odd_prop { J } { 21 }
    \prop_put:Nnn \g_cf_odd_prop { K } { 2 }
    \prop_put:Nnn \g_cf_odd_prop { L } { 4 }
    \prop_put:Nnn \g_cf_odd_prop { M } { 18 }
    \prop_put:Nnn \g_cf_odd_prop { N } { 20 }
    \prop_put:Nnn \g_cf_odd_prop { O } { 11 }
    \prop_put:Nnn \g_cf_odd_prop { P } { 3 }
    \prop_put:Nnn \g_cf_odd_prop { Q } { 6 }
    \prop_put:Nnn \g_cf_odd_prop { R } { 8 }
    \prop_put:Nnn \g_cf_odd_prop { S } { 12 }
    \prop_put:Nnn \g_cf_odd_prop { T } { 14 }
    \prop_put:Nnn \g_cf_odd_prop { U } { 16 }
    \prop_put:Nnn \g_cf_odd_prop { V } { 10 }
    \prop_put:Nnn \g_cf_odd_prop { W } { 22 }
    \prop_put:Nnn \g_cf_odd_prop { X } { 25 }
    \prop_put:Nnn \g_cf_odd_prop { Y } { 24 }
    \prop_put:Nnn \g_cf_odd_prop { Z } { 23 }

    \prop_put:Nnn \g_cf_even_prop { 0 } { 0 }
    \prop_put:Nnn \g_cf_even_prop { 1 } { 1 }
    \prop_put:Nnn \g_cf_even_prop { 2 } { 2 }
    \prop_put:Nnn \g_cf_even_prop { 3 } { 3 }
    \prop_put:Nnn \g_cf_even_prop { 4 } { 4 }
    \prop_put:Nnn \g_cf_even_prop { 5 } { 5 }
    \prop_put:Nnn \g_cf_even_prop { 6 } { 6 }
    \prop_put:Nnn \g_cf_even_prop { 7 } { 7 }
    \prop_put:Nnn \g_cf_even_prop { 8 } { 8 }
    \prop_put:Nnn \g_cf_even_prop { 9 } { 9 }
    \prop_put:Nnn \g_cf_even_prop { A } { 0 }
    \prop_put:Nnn \g_cf_even_prop { B } { 1 }
    \prop_put:Nnn \g_cf_even_prop { C } { 2 }
    \prop_put:Nnn \g_cf_even_prop { D } { 3 }
    \prop_put:Nnn \g_cf_even_prop { E } { 4 }
    \prop_put:Nnn \g_cf_even_prop { F } { 5 }
    \prop_put:Nnn \g_cf_even_prop { G } { 6 }
    \prop_put:Nnn \g_cf_even_prop { H } { 7 }
    \prop_put:Nnn \g_cf_even_prop { I } { 8 }
    \prop_put:Nnn \g_cf_even_prop { J } { 9 }
    \prop_put:Nnn \g_cf_even_prop { K } { 10 }
    \prop_put:Nnn \g_cf_even_prop { L } { 11 }
    \prop_put:Nnn \g_cf_even_prop { M } { 12 }
    \prop_put:Nnn \g_cf_even_prop { N } { 13 }
    \prop_put:Nnn \g_cf_even_prop { O } { 14 }
    \prop_put:Nnn \g_cf_even_prop { P } { 15 }
    \prop_put:Nnn \g_cf_even_prop { Q } { 16 }
    \prop_put:Nnn \g_cf_even_prop { R } { 17 }
    \prop_put:Nnn \g_cf_even_prop { S } { 18 }
    \prop_put:Nnn \g_cf_even_prop { T } { 19 }
    \prop_put:Nnn \g_cf_even_prop { U } { 20 }
    \prop_put:Nnn \g_cf_even_prop { V } { 21 }
    \prop_put:Nnn \g_cf_even_prop { W } { 22 }
    \prop_put:Nnn \g_cf_even_prop { X } { 23 }
    \prop_put:Nnn \g_cf_even_prop { Y } { 24 }
    \prop_put:Nnn \g_cf_even_prop { Z } { 25 }

    \seq_new:N \l_cf_codice_seq
    \tl_new:N \l_cf_checksum_tl
    \tl_new:N \l_cf_tmpa_tl
    \int_new:N \l_cf_position_int
    \int_new:N \l_cf_checksum_int

    \msg_new:nnn { codicefiscale } { corretto }
    {
    Codice~fiscale~#1:~corretto
    }
    \msg_new:nnnn { codicefiscale } { errato }
    {
    Codice~fiscale~#1: errato!
    }
    {
    Il~codice~#1~deve~essere~controllato\\
    Premere~~per~continuare
    }

    \NewDocumentCommand{\codicefiscaleitaliano}{m}
    {
    \seq_set_split:Nnn \l_cf_codice_seq { } { #1 }
    \cs_gset:Npx \CFisc { \seq_use:N \l_cf_codice_seq }
    \int_compare:nTF { \seq_length:N \l_cf_codice_seq == 16 }
    { \cf_compute: }
    { \msg_error:nnx { codicefiscale } { errato } { \CFisc } }
    }
    \cs_new_protected:Npn \cf_compute:
    {
    \seq_pop_right:NN \l_cf_codice_seq \l_cf_checksum_tl
    \int_zero:N \l_cf_position_int
    \int_zero:N \l_cf_checksum_int
    \seq_map_inline:Nn \l_cf_codice_seq
    {
    \int_incr:N \l_cf_position_int
    \cf_add:n { ##1 }
    }
    \int_set:Nn \l_cf_checksum_int { \int_mod:nn { \l_cf_checksum_int } { 26 } }
    \prop_get:NVN \g_cf_even_prop \l_cf_checksum_tl \l_cf_tmpa_tl
    \int_compare:nTF { \l_cf_checksum_int == \l_cf_tmpa_tl }
    {
    \msg_warning:nnx { codicefiscale } { corretto } { \CFisc }
    }
    {
    \msg_error:nnx { codicefiscale } { errato } { \CFisc }
    }
    }
    \cs_new_protected:Npn \cf_add:n #1
    {
    \int_if_odd:nTF { \l_cf_position_int }
    {
    \prop_get:NnN \g_cf_odd_prop { #1 } \l_cf_tmpa_tl
    }
    {
    \prop_get:NnN \g_cf_even_prop { #1 } \l_cf_tmpa_tl
    }
    \int_add:Nn \l_cf_checksum_int { \l_cf_tmpa_tl }
    }
    \ExplSyntaxOff

    \codicefiscaleitaliano{NGL MRA 08M64 L500 N}
    \codicefiscaleitaliano{NGL MRA 08M64 L500}`

    Come si vede il codice può essere inserito anche con spazi. I valori dei simboli (divisi per posizione dispari e pari) sono conservati in due “property list”; il codice inserito viene suddiviso nelle sue componenti in una “sequence” da cui viene staccato l’ultimo simbolo. Sui primi quindici viene eseguito il comando \cf_add:n che somma i valori ricavati consultando la “property list” appropriata perché a ogni passo un contatore viene incrementato; i valori ottenuti vengono sommati in un contatore.

    Alla fine il totale viene ridotto modulo 26 e confrontato con il valore (posto pari) dell’ultimo simbolo. Se il codice non ha la lunghezza prescritta viene subito mostrato il messaggio di errore. Come nel pacchetto di Claudio, il comando [tt]\CFisc[/tt] si espande all’ultimo codice verificato (senza spazi).

    Penso che possa essere utile per chi è interessato a LaTeX3. 🙂

    Ciao
    Enrico

Visualizzazione 8 filoni di risposte
  • Autore
    Risposte
    • #73248
      robitex
      Amministratore del forum
        Up
        0
        Down
        ::


        Ciao Enrico,
        è un piacere risponderti ad un messaggio come questo.
        Spero tu stia attivamente valutando la possibilità di scrivere articoli per ArsTeXnica che ci introducano nel nuovo mondo di LaTeX3.
        (o almeno una guida tematica; non penso che i treni siano nel frattempo divenuti tanto rispettosi dell’orario da non permetterti di lavorare 🙂 )

        R.

        PS.
        il codice asserisce che il mio codice fiscale è corretto!
        pensa se ci fosse un pacchetto LaTeX3 per le verifiche fiscali…

      • #73249
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Bel codice, non c’è che dire.

          Sottoscrivo la richiesta di Roberto; latex3 fa cose meravigliose, ma la sua sintassi è decisamente ostica; probabilmente non è più complessa del linguaggio primitivo di TeX, salvo il fatto che fa cose incredibili, ma i suoi comandi sono decisamente criptici e bisogna prenderci la mano; una guida tematica sarebbe una buona introduzione.

          Grazie Enrico

          Ciao
          Claudio

        • #73250
          robitex
          Amministratore del forum
            Up
            0
            Down
            ::

            OldClaudio” post=72340Bel codice, non c’è che dire.

            Sottoscrivo la richiesta di Roberto; latex3 fa cose meravigliose, ma la sua sintassi è decisamente ostica; probabilmente non è più complessa del linguaggio primitivo di TeX, salvo il fatto che fa cose incredibili, ma i suoi comandi sono decisamente criptici e bisogna prenderci la mano; una guida tematica sarebbe una buona introduzione.

            Grazie Enrico

            Ciao
            Claudio

            Magari si potrebbe cominciare da un esempio di programmazione LaTeX3 da mettere nella Gallery del sito.
            (da fare con calma)
            R.

          • #73251
            Up
            0
            Down
            ::

            robitex” post=72343Magari si potrebbe cominciare da un esempio di programmazione LaTeX3 da mettere nella Gallery del sito.

            Vediamo; nel codice si usano tre strutture base di LaTeX3:

            • token list
            • sequence
            • property list

            Si tratta di tre tipi di contenitori di dati, che hanno impieghi diversi per via di come sono strutturati.

            • Una “token list” non ha alcuna struttura, a parte quella naturale dell’ordine dei token che la compongono. Una macro definita come [tt]\def\xyz{testo}[/tt] è esattamente una token list.

            • Una “sequence” è una collezione di token list ordinata linearmente. Nel codice si mostra come definirne una a partire da un argomento, nel nostro caso si assegna un posto a ciascun token dell’argomento (si spezza a “niente”). Con questa struttura è facile eseguire compiti ripetitivi o estrarre l’inizio e la fine.

            • Una “property list” è una collezione “indirizzata” di token list. Gli elementi sono accessibili con una chiave. Nel nostro caso la chiave è un carattere alfanumerico, a cui associamo un valore numerico (potrebbe essere qualsiasi cosa).

            Nel codice si esegue un tipico compito ripetitivo su una sequence:
            `\seq_map_inline:N \seq_map_inline:Nn \l_cf_codice_seq
            {
            \int_incr:N \l_cf_position_int
            \cf_add:n { ##1 }
            }`
            Il codice dato come secondo argomento viene eseguito per ciascun elemento della sequence (che viene denotato con [tt]##1[/tt], perché siamo dentro una definizione).

            Per motivi di compattezza del codice, invece di scrivere tutta l’azione da eseguire nell’argomento di [tt]\seq_map_inline:Nn[/tt], è preferibile usare una funzione separata. La funzione [tt]\cf_add:n[/tt] ha un argomento (e sappiamo che è un unico carattere alfanumerico); ciò che fa è usare questo valore come chiave per ottenere il valore corrispondente dalla property list opportuna (posto dispari o pari, a seconda del valore di [tt]\l_cf_position_int[/tt]) e somma il valore a quello di [tt]\l_cf_checksum_int[/tt].

            Il confronto finale avviene allo stesso modo: si calcola [tt]\l_cf_checksum_int[/tt] modulo 26 e si confronta con il valore corrispondente all’ultimo carattere.

            Ciao
            Enrico

          • #73252
            Up
            0
            Down
            ::

            robitex” post=72343

            Bel codice, non c’è che dire.

            Sottoscrivo la richiesta di Roberto; latex3 fa cose meravigliose, ma la sua sintassi è decisamente ostica; probabilmente non è più complessa del linguaggio primitivo di TeX, salvo il fatto che fa cose incredibili, ma i suoi comandi sono decisamente criptici e bisogna prenderci la mano; una guida tematica sarebbe una buona introduzione.

            Grazie Enrico

            Ciao
            Claudio

            Magari si potrebbe cominciare da un esempio di programmazione LaTeX3 da mettere nella Gallery del sito.
            (da fare con calma)
            R.

            Nel frattempo EG o chi ne è già in qualche modo un esperto potrebbe linkare qualche riferimento a suo parere ‘buono’ (non di 2 strabilioni di pagine )?
            Grazie ciao 🙂

          • #73253
            Up
            0
            Down
            ::


            Nuova versione per stare in pari con le modifiche del pacchetto apportate da OldClaudio. 🙂

            L’aggiunta è la variante asterisco a \codicefiscaleitaliano che stampa il codice, se corretto. Qualche altra semplificazione, usando la versione espandibile [tt]\prop_get:cn[/tt] (un po’ più lenta di [tt]\prop_get:cnN[/tt], ma con liste non troppo affollate la differenza è poco significativa. Si noti che i messaggi di errore o avviso possono avere fino a quattro argomenti: uso questa possibilità per due versioni distinte del messaggio “errato” per lunghezza o perché il controllo è fallito. Nel primo caso il controllo nemmeno è iniziato, nel secondo viene emesso un comando [tt]\use_none:nnn[/tt] che ingoia [tt]\IfBooleanT{#1}{\CFisc}[/tt].

            Un comando con variante asterisco si definisce facilmente con [tt]\NewDocumentCommand[/tt]: basta specificare [tt]s[/tt] nella lista dei tipi di argomento; la presenza dell’asterisco rende vero [tt]\IfBooleanTF{#1}[/tt] che segue il ramo “vero”; si può anche, come qui, usare [tt]\IfBooleanT{#1}[/tt], specificando solo il ramo “vero”; nulla sarà eseguito in mancanza di *.

            `\documentclass{article}
            \usepackage{xparse}
            \ExplSyntaxOn
            \prop_new:N \g_cf_odd_prop
            \prop_new:N \g_cf_even_prop
            \prop_put:Nnn \g_cf_odd_prop { 0 } { 1 }
            \prop_put:Nnn \g_cf_odd_prop { 1 } { 0 }
            \prop_put:Nnn \g_cf_odd_prop { 2 } { 5 }
            \prop_put:Nnn \g_cf_odd_prop { 3 } { 7 }
            \prop_put:Nnn \g_cf_odd_prop { 4 } { 9 }
            \prop_put:Nnn \g_cf_odd_prop { 5 } { 13 }
            \prop_put:Nnn \g_cf_odd_prop { 6 } { 15 }
            \prop_put:Nnn \g_cf_odd_prop { 7 } { 17 }
            \prop_put:Nnn \g_cf_odd_prop { 8 } { 19 }
            \prop_put:Nnn \g_cf_odd_prop { 9 } { 21 }
            \prop_put:Nnn \g_cf_odd_prop { A } { 1 }
            \prop_put:Nnn \g_cf_odd_prop { B } { 0 }
            \prop_put:Nnn \g_cf_odd_prop { C } { 5 }
            \prop_put:Nnn \g_cf_odd_prop { D } { 7 }
            \prop_put:Nnn \g_cf_odd_prop { E } { 9 }
            \prop_put:Nnn \g_cf_odd_prop { F } { 13 }
            \prop_put:Nnn \g_cf_odd_prop { G } { 15 }
            \prop_put:Nnn \g_cf_odd_prop { H } { 17 }
            \prop_put:Nnn \g_cf_odd_prop { I } { 19 }
            \prop_put:Nnn \g_cf_odd_prop { J } { 21 }
            \prop_put:Nnn \g_cf_odd_prop { K } { 2 }
            \prop_put:Nnn \g_cf_odd_prop { L } { 4 }
            \prop_put:Nnn \g_cf_odd_prop { M } { 18 }
            \prop_put:Nnn \g_cf_odd_prop { N } { 20 }
            \prop_put:Nnn \g_cf_odd_prop { O } { 11 }
            \prop_put:Nnn \g_cf_odd_prop { P } { 3 }
            \prop_put:Nnn \g_cf_odd_prop { Q } { 6 }
            \prop_put:Nnn \g_cf_odd_prop { R } { 8 }
            \prop_put:Nnn \g_cf_odd_prop { S } { 12 }
            \prop_put:Nnn \g_cf_odd_prop { T } { 14 }
            \prop_put:Nnn \g_cf_odd_prop { U } { 16 }
            \prop_put:Nnn \g_cf_odd_prop { V } { 10 }
            \prop_put:Nnn \g_cf_odd_prop { W } { 22 }
            \prop_put:Nnn \g_cf_odd_prop { X } { 25 }
            \prop_put:Nnn \g_cf_odd_prop { Y } { 24 }
            \prop_put:Nnn \g_cf_odd_prop { Z } { 23 }

            \prop_put:Nnn \g_cf_even_prop { 0 } { 0 }
            \prop_put:Nnn \g_cf_even_prop { 1 } { 1 }
            \prop_put:Nnn \g_cf_even_prop { 2 } { 2 }
            \prop_put:Nnn \g_cf_even_prop { 3 } { 3 }
            \prop_put:Nnn \g_cf_even_prop { 4 } { 4 }
            \prop_put:Nnn \g_cf_even_prop { 5 } { 5 }
            \prop_put:Nnn \g_cf_even_prop { 6 } { 6 }
            \prop_put:Nnn \g_cf_even_prop { 7 } { 7 }
            \prop_put:Nnn \g_cf_even_prop { 8 } { 8 }
            \prop_put:Nnn \g_cf_even_prop { 9 } { 9 }
            \prop_put:Nnn \g_cf_even_prop { A } { 0 }
            \prop_put:Nnn \g_cf_even_prop { B } { 1 }
            \prop_put:Nnn \g_cf_even_prop { C } { 2 }
            \prop_put:Nnn \g_cf_even_prop { D } { 3 }
            \prop_put:Nnn \g_cf_even_prop { E } { 4 }
            \prop_put:Nnn \g_cf_even_prop { F } { 5 }
            \prop_put:Nnn \g_cf_even_prop { G } { 6 }
            \prop_put:Nnn \g_cf_even_prop { H } { 7 }
            \prop_put:Nnn \g_cf_even_prop { I } { 8 }
            \prop_put:Nnn \g_cf_even_prop { J } { 9 }
            \prop_put:Nnn \g_cf_even_prop { K } { 10 }
            \prop_put:Nnn \g_cf_even_prop { L } { 11 }
            \prop_put:Nnn \g_cf_even_prop { M } { 12 }
            \prop_put:Nnn \g_cf_even_prop { N } { 13 }
            \prop_put:Nnn \g_cf_even_prop { O } { 14 }
            \prop_put:Nnn \g_cf_even_prop { P } { 15 }
            \prop_put:Nnn \g_cf_even_prop { Q } { 16 }
            \prop_put:Nnn \g_cf_even_prop { R } { 17 }
            \prop_put:Nnn \g_cf_even_prop { S } { 18 }
            \prop_put:Nnn \g_cf_even_prop { T } { 19 }
            \prop_put:Nnn \g_cf_even_prop { U } { 20 }
            \prop_put:Nnn \g_cf_even_prop { V } { 21 }
            \prop_put:Nnn \g_cf_even_prop { W } { 22 }
            \prop_put:Nnn \g_cf_even_prop { X } { 23 }
            \prop_put:Nnn \g_cf_even_prop { Y } { 24 }
            \prop_put:Nnn \g_cf_even_prop { Z } { 25 }

            \seq_new:N \l_cf_codice_seq
            \tl_new:N \l_cf_checksum_tl
            \int_new:N \l_cf_position_int
            \int_new:N \l_cf_checksum_int

            \msg_new:nnn { codicefiscale } { corretto }
            {
            Codice~fiscale~#1:~corretto
            }
            \msg_new:nnnn { codicefiscale } { errato }
            {
            Codice~fiscale~#1:~#2!
            }
            {
            Il~codice~#1~deve~essere~controllato\\
            Premere~~per~continuare
            }

            \NewDocumentCommand{\codicefiscaleitaliano}{sm}
            {
            \seq_set_split:Nnn \l_cf_codice_seq { } { #2 }
            \cs_set:Npx \CFisc { \seq_use:N \l_cf_codice_seq }
            \int_compare:nTF { \seq_length:N \l_cf_codice_seq == 16 }
            { \cf_compute: \IfBooleanT { #1 }{ \CFisc } }
            { \msg_error:nnxx { codicefiscale } { errato } { \CFisc } { non~ha~16~caratteri } }
            }
            \cs_new_protected:Npn \cf_compute:
            {
            \seq_pop_right:NN \l_cf_codice_seq \l_cf_checksum_tl
            \int_zero:N \l_cf_position_int
            \int_zero:N \l_cf_checksum_int
            \seq_map_inline:Nn \l_cf_codice_seq
            {
            \int_incr:N \l_cf_position_int
            \cf_add:n { ##1 }
            }
            \int_set:Nn \l_cf_checksum_int { \int_mod:nn { \l_cf_checksum_int } { 26 } }
            \int_compare:nTF { \l_cf_checksum_int == \prop_get:NV \g_cf_even_prop \l_cf_checksum_tl }
            {
            \msg_warning:nnx { codicefiscale } { corretto } { \CFisc }
            }
            {
            \msg_error:nnxx { codicefiscale } { errato } { \CFisc } { errato }
            \use_none:nnn
            }
            }
            \cs_generate_variant:Nn \prop_get:Nn {NV}
            \cs_new_protected:Npn \cf_add:n #1
            {
            \int_add:Nn \l_cf_checksum_int
            {
            \prop_get:cn { g_cf_ \int_if_odd:nTF { \l_cf_position_int }{ odd }{ even } _prop } { #1 }
            }
            }
            \ExplSyntaxOff

            \begin{document}
            \codicefiscaleitaliano{NGL MRA 08M64 L500 N}

            \codicefiscaleitaliano*{NGLMRA08M64L500N}

            \codicefiscaleitaliano*{NGL MRA 08M64 L500 U}

            \codicefiscaleitaliano*{NGL MRA 08M64 L500}
            \end{document}`

            Ciao
            Enrico

          • #73254
            OldClaudio
            Partecipante
              Up
              0
              Down
              ::


              Bello, sempre bellissimo il codice quando ci metti le mani tu; io non ci riesco ancora.
              Ciao
              Claudio

            • #73255
              Up
              0
              Down
              ::

              OldClaudio” post=72507Bello, sempre bellissimo il codice quando ci metti le mani tu; io non ci riesco ancora.
              Ciao
              Claudio

              [OT]

              Io so fare MOLTO meglio di Enrico. Il fatto è che non ve l’ho mai dimostrato! 😀

              Ciao
              Tommaso

              [/OT]

            • #73256
              franen
              Partecipante
                Up
                0
                Down
                ::

                DirkPitt” post=72361
                Nel frattempo EG o chi ne è già in qualche modo un esperto potrebbe linkare qualche riferimento a suo parere ‘buono’ (non di 2 strabilioni di pagine )?
                Grazie ciao 🙂

                Ciao, prova a guardare i file contenuti nella cartella CTAN di l3kernel, qui.
                (Ah, non sono esperto, ho appena iniziato a guardarli, ma non ho torvato molto altro…)
                Fran

            Visualizzazione 8 filoni di risposte
            • Devi essere connesso per rispondere a questo topic.

            Go to top