expl3 e i caratteri impliciti

  • Creatore
    Topic
  • #80369
    OldClaudio
    Partecipante
      Up
      0
      Down
      ::


      Sto cercando di fare i miei primi esercizi con expl3; ovviamente sono in difficoltà sia cercando di capire il linguaggio esoterico contenuto in interface3.pdf, sia leggendo l’interessante articolo di Enrico su ArsTeXnica, sia anche leggendo la documentazione di xparse.

      Sembrerebbe che io sia riuscito a capire xparse, tanto che sono riuscito a definire una funzione senza argomenti con \NewDocumentCoomand. Fin qui va bene. poi ho cercato di trovare l’istanza di un elemento in una clist usando \clist_if_in:nnTF. Tutto semnra funzionare se l’elemento da cercare, indicato nel secondo argomento della funzione, è un carattere esplicito. La funzione dà semrpe il risultato falso se il secondo argomento è rappresentato da un carattere implicito. Faccio un esempio:
      `\ExplSyntaxOn

      \NewDocumentCommand{\vocale} { }
      { \clist_if_in:nnTF { a,e,i,o,u,A,E,I,O,U } { \let@token } { vero } { falso } }

      \ExplSyntaxOff`
      Il [tt]\let@token[/tt] viene creato con una macro vecchio stile chiamata in precedenza attraverso l’uso di un \futurelet.

      Siccome questa macro mi rende sempre il valore “falso” qualunque sia il \let@token (vocale, consonante, numero, segno di iterpunzione, spazio, eccetera, è evidente che commento un errore, ma non saprei dire se sia colpa del carattere implicito se non valga la lena di espandere il carattere impliti in una macro, nel senso che \clist potrebbe occuparsi della macro, se \token_to_meaning:N possa essere d’aiuto, se l’output di questa finzione bebba venire sottoposto a un po’ di maquillage prima di poterlo usare, se sono completamente fuori strada.

      L’importante è che io risca a trovare in una lista con elementi separati da virgole, ma anche eventualmente in una token list l’essitenza di qualcosa che io coosco solamante come token implicito.

    Visualizzazione 4 filoni di risposte
    • Autore
      Risposte
      • #80370
        Up
        0
        Down
        ::

        OldClaudio” post=79568Sto cercando di fare i miei primi esercizi con expl3; ovviamente sono in difficoltà sia cercando di capire il linguaggio esoterico contenuto in interface3.pdf, sia leggendo l’interessante articolo di Enrico su ArsTeXnica, sia anche leggendo la documentazione di xparse.

        Sembrerebbe che io sia riuscito a capire xparse, tanto che sono riuscito a definire una funzione senza argomenti con \NewDocumentCoomand. Fin qui va bene. poi ho cercato di trovare l’istanza di un elemento in una clist usando \clist_if_in:nnTF. Tutto semnra funzionare se l’elemento da cercare, indicato nel secondo argomento della funzione, è un carattere esplicito. La funzione dà semrpe il risultato falso se il secondo argomento è rappresentato da un carattere implicito. Faccio un esempio:
        `\ExplSyntaxOn

        \NewDocumentCommand{\vocale} { }
        { \clist_if_in:nnTF { a,e,i,o,u,A,E,I,O,U } { \let@token } { vero } { falso } }

        \ExplSyntaxOff`
        Il [tt]\let@token[/tt] viene creato con una macro vecchio stile chiamata in precedenza attraverso l’uso di un \futurelet.

        Siccome questa macro mi rende sempre il valore “falso” qualunque sia il \let@token (vocale, consonante, numero, segno di iterpunzione, spazio, eccetera, è evidente che commento un errore, ma non saprei dire se sia colpa del carattere implicito se non valga la lena di espandere il carattere impliti in una macro, nel senso che \clist potrebbe occuparsi della macro, se \token_to_meaning:N possa essere d’aiuto, se l’output di questa finzione bebba venire sottoposto a un po’ di maquillage prima di poterlo usare, se sono completamente fuori strada.

        L’importante è che io risca a trovare in una lista con elementi separati da virgole, ma anche eventualmente in una token list l’essitenza di qualcosa che io coosco solamante come token implicito.

        Mischiare il vecchio stile con il nuovo è sconsigliabile. Ma, evidentemente, [tt]\let@token[/tt] non compare nella lista: il paragone è fatto con liste di token “esplicite”. Potresti voler vedere se “pippo” compare in una clist, per esempio.

        Non userei, in ogni caso una clist per quel tipo di lavoro: una token list è certamente meglio. Ma se vuoi confrontare caratteri impliciti, devi farlo con [tt]\token_if_eq_charcode:NNTF[/tt]
        `RequirePackage{expl3}
        \makeatletter
        \let\let@token=a
        \ExplSyntaxOn
        \tl_map_inline:nn {aeiouAEIOU}
        {
        \token_if_eq_charcode:NNT #1 \let@token { \tl_map_break:n { \msg_term:n {Vero} } }
        \msg_term:n { Falso }
        }
        \ExplSyntaxOff`
        Questo risponderà [tt]Vero[/tt].

        Qual è lo scopo finale? Non vedo come [tt]\vocale[/tt] senza argomenti ti possa aiutare.

        Ciao
        Enrico

      • #80371
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Se volessi avere \vocale con argomenti, dovrei poi passagli \let@token che comunque dovrebbe essere già in memoria, ecco perché ho definito \vocale senza argomenti.

          Per altro \vocale senza argomenti funzionerebbe benissimo in LaTeX2e se lo definissi con un ciclo tfor del nucleo di LaTeX2e; bisognerebbe solo espandere la macro che LaTeX usa per scandire la lista di vocali, ma basta un solo expandafter per risolvere il problemino.

        • #80372
          Up
          0
          Down
          ::

          OldClaudio” post=79577Se volessi avere \vocale con argomenti, dovrei poi passagli \let@token che comunque dovrebbe essere già in memoria, ecco perché ho definito \vocale senza argomenti.

          Per altro \vocale senza argomenti funzionerebbe benissimo in LaTeX2e se lo definissi con un ciclo tfor del nucleo di LaTeX2e; bisognerebbe solo espandere la macro che LaTeX usa per scandire la lista di vocali, ma basta un solo expandafter per risolvere il problemino.

          È esattamente quello che fa [tt]\tl_map_inline:nn[/tt] che è proprio un analogo di [tt]\@tfor[/tt], mentre [tt]\token_if_eq_charcode:NNTF[/tt] è l’equivalente di [tt]\if[/tt].

          Se lo scopo è il famoso problema di scrivere in nero le vocali in una parola, si può fare così:
          `\documentclass{article}
          \usepackage{xparse}
          \ExplSyntaxOn
          \NewDocumentCommand{\segnavocali}{m}
          {
          \egreg_segna_vocali:n { #1 }
          }
          \tl_const:Nn \c_egreg_vocali_tl {AEIOUaeiou}
          \cs_new_protected:Npn \egreg_segna_vocali:n #1
          {
          \tl_map_inline:nn { #1 }
          {
          \tl_if_in:NnTF \c_egreg_vocali_tl { ##1 }
          { \textbf{ ##1 } }
          { ##1 }
          }
          }
          \ExplSyntaxOff
          \begin{document}
          \segnavocali{Ciao}
          \end{document}`
          ma questo non funzionerebbe con gli spazi. C’è un modo che evita tutti i problemi: le espressioni regolari. 🙂
          `\documentclass{article}
          \usepackage{xparse,l3regex}
          \ExplSyntaxOn
          \NewDocumentCommand{\segnavocali}{m}
          {
          \egreg_segna_vocali:n { #1 }
          }
          \tl_new:N \l_egreg_temp_tl
          \cs_new_protected:Npn \egreg_segna_vocali:n #1
          {
          \tl_set:Nn \l_egreg_temp_tl { #1 }
          \regex_replace_all:nnN { ([AEIOUaeiou]) } { \c{textbf} \cB\{ \1 \cE\} } \l_egreg_temp_tl
          \tl_use:N \l_egreg_temp_tl
          }
          \ExplSyntaxOff
          \begin{document}
          \segnavocali{Ciao mondo}
          \end{document}`
          Ciao
          Enrico

        • #80373
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::

            È esattamente quello che fa \tl_map_inline:nn che è proprio un analogo di \@tfor, mentre \token_if_eq_charcode:NNTF è l’equivalente di \if

            E che cosa è equivalente a \ifx? [tt]\if_meaning:NNTF [/tt] ?

            Molte grazie, comunque; devo ammettere che anche la documentazione va meditata a lungo.

          • #80374
            Up
            0
            Down
            ::

            OldClaudio” post=79587

            È esattamente quello che fa \tl_map_inline:nn che è proprio un analogo di \@tfor, mentre \token_if_eq_charcode:NNTF è l’equivalente di \if

            E che cosa è equivalente a \ifx? [tt]\if_meaning:NNTF [/tt] ?

            Molte grazie, comunque; devo ammettere che anche la documentazione va meditata a lungo.

            Giusto, [tt]\token_if_eq_meaning:NNTF[/tt]; in questo caso usare questo o [tt]\token_if_eq_charcode:NNTF[/tt] è equivalente, visto che il primo token è una lettera.

            La differenza sostanziale con i condizionali usuali è che non hai problemi di espandere [tt]\else[/tt] e [tt]\fi[/tt] per toglierli di mezzo.

            Ciao
            Enrico

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

        Go to top