LaTeX3 determinazione primo token (che è espandibile)

  • Creatore
    Topic
  • #74558
    franen
    Partecipante
      Up
      0
      Down
      ::


      Ciao. Io vorrei trovare un modo per determinare se una token list comincia con un determinato token, che malaugaratamente è espandibile (e si espande in modi diversi in funzione di altre opzioni). Riporto un esempio minimo compilabile ma scorretto.

      `% !TEX encoding = UTF-8 Unicode
      \documentclass{article}
      \usepackage[utf8]{inputenc}
      \usepackage[T1]{fontenc}
      \usepackage{xparse}
      \ExplSyntaxOn
      \newcommand{\first}{definizione-di-first}
      \tl_new:N \prova_tl
      \tl_set:Nn \prova_tl {\first Ciao a tutti}
      \NewDocumentCommand{\prova}{}{\tl_head:N \prova_tl}
      \ExplSyntaxOff
      \begin{document}
      Primo token della token list:
      \prova
      \end{document}`
      Io vorrei che il comando \prova mi dicesse che il primo token della tl è “\first” e non la sua espansione. Ho provato un sacco di modi (con \exp_not:n, tl_to_str, str_head:n, tl_item:nn, if_meaning), ma nulla che funzionasse. Mi basterebbe anche che restituisse solo “\”, anche se preferirei l’intero token o una condizione VERO-FALSO.
      Consigli?

      Francesco

    Visualizzazione 6 filoni di risposte
    • Autore
      Risposte
      • #74559
        Up
        0
        Down
        ::

        franen” post=73685Ciao. Io vorrei trovare un modo per determinare se una token list comincia con un determinato token, che malaugaratamente è espandibile (e si espande in modi diversi in funzione di altre opzioni). Riporto un esempio minimo compilabile ma scorretto.

        `% !TEX encoding = UTF-8 Unicode
        \documentclass{article}
        \usepackage[utf8]{inputenc}
        \usepackage[T1]{fontenc}
        \usepackage{xparse}
        \ExplSyntaxOn
        \newcommand{\first}{definizione-di-first}
        \tl_new:N \prova_tl
        \tl_set:Nn \prova_tl {\first Ciao a tutti}
        \NewDocumentCommand{\prova}{}{\tl_head:N \prova_tl}
        \ExplSyntaxOff
        \begin{document}
        Primo token della token list:
        \prova
        \end{document}`
        Io vorrei che il comando \prova mi dicesse che il primo token della tl è “\first” e non la sua espansione. Ho provato un sacco di modi (con \exp_not:n, tl_to_str, str_head:n, tl_item:nn, if_meaning), ma nulla che funzionasse. Mi basterebbe anche che restituisse solo “\”, anche se preferirei l’intero token o una condizione VERO-FALSO.
        Consigli?

        Francesco

        Be’, è ovvio: quando scrivi [tt]\prova[/tt] TeX fa diligentemente tutte le sue espansioni, compresa quella di [tt]\first[/tt].
        `\usepackage{xparse}
        \newcommand{\first}{definizione di first}
        \ExplSyntaxOn
        \tl_set:Nn \l_prova_tl {\first Ciao a tutti}
        \NewDocumentCommand{\prova}{}
        {
        \tl_to_str:x { \tl_head:N \l_prova_tl }
        }
        \cs_generate_variant:Nn \tl_to_str:n {x}
        \ExplSyntaxOff`
        Hai bisogno di espandere completamente [tt]\tl_head:N \l_prova_tl[/tt] (ma l’espansione si ferma a [tt]\first[/tt], come spiegato nella documentazione) e trasformare il risultato in una stringa. Basta generare la variante di [tt]\tl_to_str:n[/tt]

        I nomi delle variabili devono cominciare con il prefisso [tt]l_[/tt] o [tt]g_[/tt] per indicare se i valori vanno assegnati localmente o globalmente.

        Ciao
        Enrico

      • #74560
        franen
        Partecipante
          Up
          0
          Down
          ::


          Grazie Enrico, ovviamente funziona. Sto prendendo pian piano dimestichezza con le espansioni, ma mi manca ancora un bel po’ da capire! (Anche se in questo caso bastava fare un po’ più di attenzione alla documentazione!)
          Francesco

        • #74561
          Up
          0
          Down
          ::

          franen” post=73743Grazie Enrico, ovviamente funziona. Sto prendendo pian piano dimestichezza con le espansioni, ma mi manca ancora un bel po’ da capire! (Anche se in questo caso bastava fare un po’ più di attenzione alla documentazione!)
          Francesco

          Ovviamente questo non serve a nulla: a che pro stampare il “nome” del primo token? Infatti non era evidentissimo come farlo. 🙂

          Ciao
          Enrico

        • #74562
          franen
          Partecipante
            Up
            0
            Down
            ::


            No, certo, l’obiettivo non era quello di stampare il token, ma di fare una verifica che mi impostasse una variabile booleana. Grazie alle tue indicazioni sull’espansione ho risolto con `% !TEX encoding = UTF-8 Unicode
            \documentclass{article}
            \usepackage[utf8]{inputenc}
            \usepackage[T1]{fontenc}
            \usepackage{xparse}
            \newcommand{\first}{definizione di first}
            \ExplSyntaxOn
            \tl_new:N \l_temp_tl
            \tl_set:Nn \l_prova_tl {\first Ciao a tutti}
            \cs_generate_variant:Nn \tl_if_eq:nnTF {nxTF}
            \NewDocumentCommand{\prova}{}
            {
            \tl_if_eq:nxTF {\first}{ \tl_head:N \l_prova_tl } {Vero}{Falso}
            }
            \ExplSyntaxOff
            \begin{document}
            Il primo token della token list è \verb!\first!? \prova
            \end{document}`
            O c’è qualcosa di più immediato che non son riuscito a trovare?

            Francesco

          • #74563
            Up
            0
            Down
            ::


            C’è il modulo l3regex per le espressioni regolari:

            `\usepackage{xparse,l3regex}
            \ExplSyntaxON
            \cs_generate_variant:Nn \regex_match:nnTF {nV}
            \NewDocumentCommand{\provabis}{}
            {
            \regex_match:nVTF {\A \c{first}} \l_prova_tl { Vero } { Falso }
            }
            \ExplSyntaxOff`
            Con [tt]\A[/tt] si ancora all’inizio (puoi usare anche il tradizionale [tt]^[/tt]) e con [tt]\c{cs}[/tt] si denota un *match* esatto per il token [tt]\cs[/tt]. In certi casi è conveniente, perché molto più flessibile. L’ho ampiamente usato nel pacchetto regexpatch.

            Nota che nel secondo argomento di [tt]\cs_generate_variant:Nn[/tt] basta arrivare alle lettere da modificare, quelle successive rimangono tali e quali. Con [tt]V[/tt] si indica “il valore di una variabile”.

            Ciao
            Enrico

          • #74564
            franen
            Partecipante
              Up
              0
              Down
              ::


              E io che credevo che in interface3.pdf ci fosse tutto lo scibile su LaTeX3… 🙂
              Grazie…
              Fran

            • #74565
              Up
              0
              Down
              ::

              franen” post=73765E io che credevo che in interface3.pdf ci fosse tutto lo scibile su LaTeX3… 🙂

              Il modulo l3regex è ancora fra quelli sperimentali, ma è davvero utile.

              Ciao
              Enrico

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

          Go to top