ivan” post=80218Perché non si può usare semplicemente #2 al posto di \l_tmpa_tl?
Ciao
Ivanp.s. sarebbe molto utile avere un commento di questo codice 😉
Sarà anche semplice (e la struttura in effetti lo è e si capisce), ma la sintassi
per me non è per niente semplice. Mi pare un’altra lingua 🙄edit
Vedo che il filone è seguito 🙂
Giro la richiesta anche a Enrico. Qualche delucidazione
(passo passo) al codice sarebbe utilissima 😀
`\ExplSyntaxOn`
Ci liberiamo dei problemi di spazi spuri (e abilitiamo l’uso delle macro di LaTeX3)
`\NewDocumentCommand{\numx}{ O{} m o }`
Il comando [tt]\numx[/tt] ha un argomento facoltativo (valore normale vuoto), uno obbligatorio e un altro facoltativo (senza valore normale)
` {
\IfValueTF{#3}`
Se l’argomento facoltativo [tt]#3[/tt] è espresso, [tt]\IfValueTF{#3}[/tt] risulta vero e si segue il ramo “vero”:
` {
\SI[#1]{#2}{#3}
}`
in cui si chiama il comando [tt]\SI[/tt] con gli argomenti indicati. Altrimenti si segue il ramo “falso:
` {
\num[#1]{#2}
}`
in cui si chiama [tt]\num[/tt]
` }
\ExplSyntaxOff`
Fine della definizione e uscita dall’ambiente speciale.
Vediamo il secondo codice.
`\ExplSyntaxOn
\NewDocumentCommand{\numx}{ O{} m o }
{`
Tutto come prima. Ma ora, per nessun motivo particolare uso [tt]\IfNoValueTF[/tt] che fa la stessa cosa dell’altro, ma con “vero” e “falso” rovesciati.
` \IfNoValueTF{#3}
{ \robitex_numx:nx { #1 } { #2 } }
{ \robitex_numx:nxn { #1 } { #2 } { #3 } }
}`
Nei due casi chiamo due macro diverse.
`\cs_new_protected:Npn \robitex_numx:nn { \num[#1]{#2} }
\cs_new_protected:Npn \robitex_numx:nnn { \SI[#1]{#2}{#3} }`
Le due macro sono definite in modo facile: chiamano [tt]\num[/tt] e [tt]\SI[/tt]. Ma si può notare che i suffissi che specificano gli argomenti sono diversi. Infatti le prossime due righe chiariscono:
`\cs_generate_variant:Nn \robitex_numx:nn { nx }
\cs_generate_variant:Nn \robitex_numx:nnn { nx }`
La prima genera la macro [tt]\robitex_numx:nx[/tt] in cui il secondo argomento viene espanso completamente prima di essere passato a [tt]\robitex_numx:nn[tt]. Dunque
`\robitex_numx:nx{
equivale a chiamare
`\robitex_numx:nn{
In LaTeX (quasi) standard questo sarebbe qualcosa come:
`\def\robitex@numx#1#2{…}
\def\robitex@numx@expandsecond#1#2{%
\begingroup\edef\x{\endgroup
\unexpanded{\robitex@numx{#1}}{#2}}\x}`
Senza usare [tt]\unexpanded[/tt] sarebbe
`\def\robitex@numx@expandsecond#1#2{%
\toks@={\robitex@numx{#1}}%
\begingroup\edef\x{\endgroup
\the\toks@{#2}}\x}`
Direi che l’astrazione di [tt]\cs_generate_variant:Nn[/tt] è un po’ più comoda. 🙂
Ciao
Enrico