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