Grazie!
L’esempio è perfetto.Ci sono limitazioni: se la lista contiene 5 elementi e si scrive \extract{\mylist}{6} (o un numero maggiore), non succede nulla
Questo va bene: una funzione che non funziona non deve recare danni al programma chiamante.
A questo punto, mi chiedo come potrebbe essere definita una macro che conta gli elementi di \mylist. Ad esempio si potrebbero fare cose del genere:
`
\def\n=\howmany{\mylist}
\extract{\mylist}{\n}
`
`\makeatletter
\def\@nameedef#1{\expandafter\edef\csname #1\endcsname}%non c'è nel kernel
\newcommand{\buildlist}[2]{\@namedef{list@#1}{#2}}
\newcommand{\appendtolist}[2]{\@nameedef{list@#1}{\@nameuse{list@#1},#2}}
\newcommand{\prependtolist}[2]{\@nameedef{list@#1}{#2,\@nameuse{list@#1}}}
\let\@xp\expandafter
\newcommand\extract[2]{{%
\count@\z@
\edef\the@list{\@nameuse{list@#1}}%
\@for\next:=\the@list\do
{\advance\count@\@ne\ifnum#2=\count@ \expandafter\ignorespaces\next\unskip\fi}%
}}
\newcommand\@listlength[1]{{%
\count@\z@
\edef\the@list{\@nameuse{list@#1}}%
\@for\next:=\the@list\do
{\advance\count@\@ne}%
\xdef\@@listlength{\the\count@}%
}}
\newcommand\extractlast[1]{\@listlength{#1}\extract{#1}{\@@listlength}}
\makeatother`
Adesso puoi dire, più convenientemente,
`\buildlist{mylist}{aaa,bbb,ccc,ddd,eee}
\extract{mylist}{2}
\extractlast{mylist}`
La cosa è come prima; solo che invece di definire un comando come \mylist, ne definisco uno interno e tratto il nome della lista come una semplice stringa (come con i contatori LaTeX). Per contare il numero di elementi di una lista, eseguo un ciclo sulla lista che fa semplicemente scattare di uno il contatore; poi definisco globalmente (perché siamo in un gruppo) un comando interno che contiene il valore ottenuto.
Puoi anche aumentare una lista a destra o a sinistra con i comandi \appendtolist e \prependtolist.
Ciao
Enrico