Posto di avere un comando come il seguente
`\comando{pippo,pluto,nonna papera}`
Questi argomenti sono casuali e non scelti all’interno di una lista prefissata (altrimenti sarebbe stato possibile usare xkeyval)
Vorrei ottenere una cosa sostanzialmente simile alla definizione di:
`\setcounter{comando@num@argomenti}{3}
\renewcommand{\comando@primo@argomento}{pippo}
\renewcommand{\comando@secondo@argomento}{pluto}
\renewcommand{\comando@terzo@argomento}{nonna papera}
`
Certo che si può fare. 😀
`\documentclass[a4paper]{article}
\newcounter{nargs}
\makeatletter
\def\processlist#1{\def\given@list{#1}%
\count@=\z@
\@for\next:=\given@list\do
{\advance\count@\@ne
\expandafter\xdef\csname list@arg@\romannumeral\count@\endcsname{\next}%
}%
\setcounter{nargs}{\count@}%
}
\def\showlistargs{%
Numero argomenti: \thenargs\par
\count@=\z@
\loop\ifnum\count@<\value{nargs}%
\advance\count@\@ne
\texttt{\expandafter\string\csname list@arg@\romannumeral\count@\endcsname}
$\to$
\csname list@arg@\romannumeral\count@\endcsname\par
\repeat}
\makeatother
\begin{document}
\processlist{pippo,pluto,nonna papera}
\showlistargs
\medskip
\processlist{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}
\showlistargs
\end{document}`
Vedi anche i nomi che vengono assegnati alle macro che contengono i vari elementi della lista; la macro \showlistargs è solo per la dimostrazione del funzionamento.
Spiegazione. La costruzione
`\@for\next:=\given@list\do{
ha bisogno che \given@list (il nome della macro non è obbligatorio) si espanda a una lista di elementi separati da virgole. Per questo la macro \processlist comincia definendo \given@list come l’argomento che viene passato.
Per ogni elemento viene eseguito
Il contatore temporaneo \count@ viene inizializzato a 0, a ogni esecuzione di
Usiamo \xdef perché così la definizione è globale e viene usata l’espansione di \next, cioè proprio l’elemento della lista che si sta esaminando.
Ciao
Enrico