LaTeX3 e argomenti delimitati

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


      Ciao, sto iniziando a studiare LaTeX3, senza una reale necessità, ma mi incuriosisce molto. Sto provando a riscrivere in LaTeX3 il pacchetto per la gestione di brani biblici di cui si è parlato qui, che al momento presenta delle limitazioni che credo risolvibili.
      Non sono riuscito a capire come fare a creare un comando che gestisca adeguatamente gli argomenti delimitati.
      In LaTeX avrei scritto:
      `\documentclass{article}
      \def\comando#1!#2:#3,#4!{%
      \def\primo{#1}
      \def\secondo{#2}
      \def\terzo{#3}
      \def\quarto{#4}}
      \def\personaggi#1{%
      \comando#1!
      \primo{} va a spasso con \secondo{}, \terzo{} e \quarto.}
      \begin{document}
      \personaggi{pippo!topolino:pluto,paperino}
      \end{document}`
      Scelgo proprio questo esempio perché voglio degli argomenti delimitati da diversi token (altrimenti con \SplitArgument di xparse si riuscirebbe tranquillamente a separare gli argomenti). Qualcuno saprebbe darmi qualche indicazione su come si potrebbe fare?

      Francesco

    Visualizzazione 1 filone di risposte
    • Autore
      Risposte
      • #74202
        Up
        0
        Down
        ::

        franen” post=73200Ciao, sto iniziando a studiare LaTeX3, senza una reale necessità, ma mi incuriosisce molto. Sto provando a riscrivere in LaTeX3 il pacchetto per la gestione di brani biblici di cui si è parlato qui, che al momento presenta delle limitazioni che credo risolvibili.
        Non sono riuscito a capire come fare a creare un comando che gestisca adeguatamente gli argomenti delimitati.
        In LaTeX avrei scritto:
        `\documentclass{article}
        \def\comando#1!#2:#3,#4!{%
        \def\primo{#1}
        \def\secondo{#2}
        \def\terzo{#3}
        \def\quarto{#4}}
        \def\personaggi#1{%
        \comando#1!
        \primo{} va a spasso con \secondo{}, \terzo{} e \quarto.}
        \begin{document}
        \personaggi{pippo!topolino:pluto,paperino}
        \end{document}`
        Scelgo proprio questo esempio perché voglio degli argomenti delimitati da diversi token (altrimenti con \SplitArgument di xparse si riuscirebbe tranquillamente a separare gli argomenti). Qualcuno saprebbe darmi qualche indicazione su come si potrebbe fare?

        Francesco

        Non c’è nessun problema a usare [tt]\cs_new:Npn[/tt] con argomenti delimitati. Non con spazi, naturalmente, né con [tt]_[/tt] o [tt]:[/tt] per via del particolare stato di questi token nell’ambiente di programmazione. Quindi
        `\cs_new_protected:Npn \franen_list_of_characters:w #1 ! #2 ; #3 , #4 !
        {
        \tl_set:Nn \franen_primo_tl { #1 }
        \tl_set:Nn \franen_secondo_tl { #2 }
        \tl_set:Nn \franen_terzo_tl { #3 }
        \tl_set:Nn \franen_quarto_tl { #4 }
        }
        \NewDocumentCommand{\personaggi}{ m }
        {
        \franen_list_of_characters:w #1 !
        \franen_primo_tl{} ~ va ~ a ~ spasso ~ con ~ \franen_secondo_tl, ~ \franen_terzo_tl{} ~ e ~ \franen_quarto_tl.
        }`
        Se proprio hai bisogno dei due punti, non è troppo complicato farli diventare quello che devono essere: in genere si preferisce usare [tt]\NewDocumentCommand[/tt] per normalizzare una chiamata. Quindi farei così:
        `\documentclass{article}
        \usepackage{xparse}
        \NewDocumentCommand{\personaggi}{ m }{\personaggiauxi #1!}
        \NewDocumentCommand{\personaggiauxi}{ u{!} u{:} u{,} u{!} }{\personaggiauxii{#1}{#2}{#3}{#4}}
        \ExplSyntaxOn
        \tl_new:N \franen_primo_tl
        \tl_new:N \franen_secondo_tl
        \tl_new:N \franen_terzo_tl
        \tl_new:N \franen_quarto_tl
        \NewDocumentCommand{\personaggiauxii}{ m m m m }
        {
        \tl_set:Nn \franen_primo_tl { #1 }
        \tl_set:Nn \franen_secondo_tl { #2 }
        \tl_set:Nn \franen_terzo_tl { #3 }
        \tl_set:Nn \franen_quarto_tl { #4 }
        \franen_do_personaggi:
        }
        \cs_new:Npn \franen_do_personaggi:
        {
        \franen_primo_tl{} ~ va ~ a ~ spasso ~ con ~ \franen_secondo_tl, ~ \franen_terzo_tl{} ~ e ~ \franen_quarto_tl.
        }
        \ExplSyntaxOff

        \begin{document}
        \personaggi{pippo!topolino:pluto,paperino}
        \end{document}`
        Nel caso specifico, probabilmente non hai quel tipo di delimitatori e certamente si può fare in modo meno complicato.

        Ciao
        Enrico

      • #74203
        franen
        Partecipante
          Up
          0
          Down
          ::


          Tutto chiarissimo, grazie mille. Pur avendo letto più volte la parte di interface3 relativa alle cs non avevo colto la possibilità di mettere dei delimitatori fra gli argomenti.

          Francesco

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

      Go to top