Effetto LaTeX3

  • Creatore
    Topic
  • #80127
    robitex
    Amministratore del forum
      Up
      0
      Down
      ::


      Ciao.
      Dopo l’intervento di Enrico su LaTeX3 al meeting, vorrei inserire nella Gallery del sito anche la versione l3 per stampare 100 volte una stringa.
      E questo mi serve anche per incominciare.

      Il codice che ho scritto è il seguente, adattato da quello che ho trovato nel documetno interface3 (potete aprirlo con il comando da console ‘texdoc interface3’):
      `\documentclass{minimal}
      \usepackage{expl3}

      \begin{document}
      \ExplSyntaxOn
      \cs_set:Npn \repvl_func:n #1 { Viva~\LaTeX3!\par }

      \int_step_function:nnnN { 1 } % initial
      { 1 } % step
      { 100 } % final
      \repvl_func:n
      \ExplSyntaxOff
      \end{document}`

      Il codice funziona e non avrei nulla da chiedere, ma l’appetito vien mangiando.
      Domanda 1
      perché per instanziare la funzione che ho chiamato \repvl_func:n (repeat viva latex) uso \cs_set:Npn e non \cs_new:Npn?

      Domanda 2
      posso fare a meno di definire una funzione?

      Grazie.
      R.

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


          Ho provato un’altra semplice soluzione (bastava leggere bene il manuale di expl3 (il file interface3.pdf) alla sezione Integer step functions):
          `\documentclass{minimal}
          \usepackage{expl3}

          \begin{document}
          \ExplSyntaxOn
          \int_step_inline:nnnn { 1 } % initial
          { 1 } % step
          { 50*2 } % final
          { Viva~\LaTeX3!\par } % codice
          \ExplSyntaxOff
          \end{document}`

          Al primo impatto LaTeX3 è notevolemente più prevedibile di TeX.
          Per numerare le linee posso semplicemente fare così:
          `\documentclass{minimal}
          \usepackage{expl3}

          \begin{document}
          \ExplSyntaxOn
          \int_step_inline:nnnn { 1 } % initial
          { 1 } % step
          { 50*2 } % final
          { #1~Viva~\LaTeX3!\par }
          \ExplSyntaxOff
          \end{document}`

          Molto interessante no?
          R.

        • #80129
          Up
          0
          Down
          ::

          robitex” post=79314Ciao.
          Dopo l’intervento di Enrico su LaTeX3 al meeting, vorrei inserire nella Gallery del sito anche la versione l3 per stampare 100 volte una stringa.
          E questo mi serve anche per incominciare.

          Il codice che ho scritto è il seguente, adattato da quello che ho trovato nel documetno interface3 (potete aprirlo con il comando da console ‘texdoc interface3’):
          `\documentclass{minimal}
          \usepackage{expl3}
          \usepackage{guit}

          \begin{document}
          \ExplSyntaxOn
          \cs_set:Npn \repvl_func:n #1 { Viva~\LaTeX3!\par }

          \int_step_function:nnnN { 1 } % initial
          { 1 } % step
          { 100 } % final
          \repvl_func:n
          \ExplSyntaxOff
          \end{document}`

          Il codice funziona e non avrei nulla da chiedere, ma l’appetito vien mangiando.
          Domanda 1
          perché per instanziare la funzione che ho chiamato \repvl_func:n (repeat viva latex) uso \cs_set:Npn e non \cs_new:Npn?

          Domanda 2
          posso fare a meno di definire una funzione?

          Grazie.
          R.

          Si può fare in modo un pochino più semplice. 🙂
          `\documentclass[a4paper]{article}
          \usepackage{xparse}
          \ExplSyntaxOn
          \NewDocumentCommand{\ripeti}{ O{100} m }
          {
          \robitex_ripeti:nn { #1 } { #2 }
          }
          \cs_new:Npn \robitex_ripeti:nn #1 #2
          {
          \prg_replicate:nn { #1 } { #2 \par }
          }
          \ExplSyntaxOff
          \begin{document}
          \ripeti{Viva \LaTeX3}

          \bigskip

          \ripeti[200]{Viva il \GuIT}

          \end{document}`

          Veniamo alle risposte.

          Domanda 1
          perché per instanziare la funzione che ho chiamato \repvl_func:n (repeat viva latex) uso \cs_set:Npn e non \cs_new:Npn?

          E che ne so? 🙂 L’hai scritto tu!

          Domanda 2
          posso fare a meno di definire una funzione?

          Se usi [tt]\int_step_inline:nnnN[/tt] l’ultimo argomento deve essere una funzione con un argomento. Altrimenti puoi usare [tt]\int_step_inline:nnnn[/tt] e, nell’ultimo argomento puoi usare [tt]#1[/tt] per riferirti al valore del contatore interno che tiene conto dei cicli.

          Una soluzione con [tt]\int_step_inline:nnnn[/tt] in cui vuoi numerare le righe, ma con un comando definito in precedenza:
          `\usepackage{xparse}
          \ExplSyntaxOn
          \NewDocumentCommand{\ripetiA}{ O{100} m }
          {
          \robitex_ripeti_A:nn { #1 } { #2 }
          }
          \cs_new_protected:Npn \robitex_ripeti_A:nn #1 #2
          {
          \int_step_inline:nnnn
          { 1 } % initial
          { 1 } % step
          { #1 } % final
          { ##1 ~ #2 }
          }
          \ExplSyntaxOff`
          Così [tt]\ripetiA{Viva \LaTeX3!}[/tt] e [tt]\ripetiA[5*10]{Viva \LaTeX3!}[/tt] nel documento ripeteranno rispettivamente 100 e 50 volte.

          Nota che [tt]\int_step_inline:nnnn[/tt] rende ancora disponibile il valore, ma questa volta va chiamato [tt]##1[/tt] perché siamo dentro una definizione.

          Perché nel primo codice ho usato [tt]\cs_new:Npn[/tt] e nel secondo [tt]\cs_new_protected:Npn[/tt]? La funzione [tt]\prg_replicate:nn[/tt] è completamente espandibile (in parole povere, non esegue alcuna assegnazione), mentre [tt]\int_step_inline:nnnn[/tt] non lo è. Quando una funzione è definita in termini di funzioni non completamente espandibili, va sempre dichiarata come [tt]protected[/tt].

          In linea generale, [tt]\ExplSyntaxOn[/tt] non deve essere usato nell’ambiente [tt]document[/tt].

          Ciao
          Enrico

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


            Ciao Enrico.
            🙂 intendevo chiedere le funzioni si definiscono con \cs_set o con \cs_new. A logica si dovrebbe usare new…
            ma sto appunto leggendo l’articolo su Ars 13:
            con \cs_new si controlla che la funzione non sia già stata definita.
            Sono bravo vero?
            R.

            Ps. Non avevo notato la presenza del modulo prg…
            Ci sentiamo su questi thread per aggiornamenti

          • #80131
            Up
            0
            Down
            ::

            robitex” post=79333Ciao Enrico.
            🙂 intendevo chiedere le funzioni si definiscono con \cs_set o con \cs_new. A logica si dovrebbe usare new…
            ma sto appunto leggendo l’articolo su Ars 13:
            con \cs_new si controlla che la funzione non sia già stata definita.
            Sono bravo vero?
            R.

            Ps. Non avevo notato la presenza del modulo prg…
            Ci sentiamo su questi thread per aggiornamenti

            Esattamente: [tt]\cs_new…[/tt] controlla che la funzione non sia già definita. Ma c’è un’altra “lieve” differenza: [tt]\cs_new…[/tt] agisce sempre globalmente; la famiglia [tt]\cs_set…[/tt] serve normalmente per ridefinire una funzione localmente; ma c’è anche la famiglia [tt]\cs_gset…[tt].

            Ciao
            Enrico

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


              Ciao. Rieccomi.
              Ho rapidamente ed efficientemente scritto questo codice:
              `\documentclass{minimal}
              \usepackage{xparse}

              \ExplSyntaxOn
              \NewDocumentCommand{\vivaLatexTre}{}
              {
              \vl_repeat:
              }

              \cs_set:Nn \vl_repeat:
              {
              \prg_replicate:nn { 100 } { Viva~\LaTeX3\par }
              }
              \ExplSyntaxOff

              \begin{document}
              \vivaLatexTre
              \end{document}`

              Si tratta di una versione più semplice di quella di Enrico perché è prevista la duplicazione di un numero fisso di volte.
              Le funzioni senza argomento hanno solo il due punti finale.
              Adesso posso decidere quale versione mettere nella Gallery.
              Grazie3.

            • #80133
              Up
              0
              Down
              ::


              [tt]\cs_new_protected:Nn[/tt], non [tt]\cs_set:Nn[/tt]. Occorre [tt]new[/tt] perché è una nuova funzione; occorre [tt]protected[/tt] perché usa [tt]\LaTeX[/tt] che non è completamente espandibile.

              Ciao
              Enrico

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


                Ok grazie.
                Ti riporto anche il codice postato sulla Gallery aggiornato con le tue ultime osservazioni:
                `\documentclass{minimal}
                \usepackage{xparse}

                %%% versione LaTeX3
                \ExplSyntaxOn
                \NewDocumentCommand{\vivaLatexTre}{}
                {
                \vl_repeat:
                }

                \cs_new_protected:Nn \vl_repeat:
                {
                \int_step_inline:nnnn { 1 }{ 1 }{ 100 }
                { ##1~–~Viva~LaTeX3\par }
                }
                \ExplSyntaxOff

                \begin{document}
                \vivaLatexTre
                \end{document}`

                Un saluto.
                R.

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

            Go to top