Re: Effetto l3

#80129
Up
0
Down
::

robitex” post=79314Ciao.
Dopo l’intervento di Enrico su LaTeX3 al meeting, vorrei inserire nella Gallery del sito anche la versione l3 per stampare 100 volte una stringa.
E questo mi serve anche per incominciare.

Il codice che ho scritto è il seguente, adattato da quello che ho trovato nel documetno interface3 (potete aprirlo con il comando da console ‘texdoc interface3’):
`\documentclass{minimal}
\usepackage{expl3}
\usepackage{guit}

\begin{document}
\ExplSyntaxOn
\cs_set:Npn \repvl_func:n #1 { Viva~\LaTeX3!\par }

\int_step_function:nnnN { 1 } % initial
{ 1 } % step
{ 100 } % final
\repvl_func:n
\ExplSyntaxOff
\end{document}`

Il codice funziona e non avrei nulla da chiedere, ma l’appetito vien mangiando.
Domanda 1
perché per instanziare la funzione che ho chiamato \repvl_func:n (repeat viva latex) uso \cs_set:Npn e non \cs_new:Npn?

Domanda 2
posso fare a meno di definire una funzione?

Grazie.
R.

Si può fare in modo un pochino più semplice. 🙂
`\documentclass[a4paper]{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\ripeti}{ O{100} m }
{
\robitex_ripeti:nn { #1 } { #2 }
}
\cs_new:Npn \robitex_ripeti:nn #1 #2
{
\prg_replicate:nn { #1 } { #2 \par }
}
\ExplSyntaxOff
\begin{document}
\ripeti{Viva \LaTeX3}

\bigskip

\ripeti[200]{Viva il \GuIT}

\end{document}`

Veniamo alle risposte.

Domanda 1
perché per instanziare la funzione che ho chiamato \repvl_func:n (repeat viva latex) uso \cs_set:Npn e non \cs_new:Npn?

E che ne so? 🙂 L’hai scritto tu!

Domanda 2
posso fare a meno di definire una funzione?

Se usi [tt]\int_step_inline:nnnN[/tt] l’ultimo argomento deve essere una funzione con un argomento. Altrimenti puoi usare [tt]\int_step_inline:nnnn[/tt] e, nell’ultimo argomento puoi usare [tt]#1[/tt] per riferirti al valore del contatore interno che tiene conto dei cicli.

Una soluzione con [tt]\int_step_inline:nnnn[/tt] in cui vuoi numerare le righe, ma con un comando definito in precedenza:
`\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\ripetiA}{ O{100} m }
{
\robitex_ripeti_A:nn { #1 } { #2 }
}
\cs_new_protected:Npn \robitex_ripeti_A:nn #1 #2
{
\int_step_inline:nnnn
{ 1 } % initial
{ 1 } % step
{ #1 } % final
{ ##1 ~ #2 }
}
\ExplSyntaxOff`
Così [tt]\ripetiA{Viva \LaTeX3!}[/tt] e [tt]\ripetiA[5*10]{Viva \LaTeX3!}[/tt] nel documento ripeteranno rispettivamente 100 e 50 volte.

Nota che [tt]\int_step_inline:nnnn[/tt] rende ancora disponibile il valore, ma questa volta va chiamato [tt]##1[/tt] perché siamo dentro una definizione.

Perché nel primo codice ho usato [tt]\cs_new:Npn[/tt] e nel secondo [tt]\cs_new_protected:Npn[/tt]? La funzione [tt]\prg_replicate:nn[/tt] è completamente espandibile (in parole povere, non esegue alcuna assegnazione), mentre [tt]\int_step_inline:nnnn[/tt] non lo è. Quando una funzione è definita in termini di funzioni non completamente espandibili, va sempre dichiarata come [tt]protected[/tt].

In linea generale, [tt]\ExplSyntaxOn[/tt] non deve essere usato nell’ambiente [tt]document[/tt].

Ciao
Enrico

Go to top