Intanto la macro \last@f è inutile, non c’è alcun pericolo nel ridefinire \next; puoi mettere il codice direttamente in \lastof. Perché dici che il primo non funziona? Non mi pare di avere osservato differenze.
Ciao
EnricoIl gruppo lo metto lo stesso? O credi sia inutile anche quello? Comunque ora non posso provare il codice dato che non sono a casa, ma ieri con il primo codice il risultato di
`
% Preambolo
\def\ciao{ciao}
% Documento
:\lastof{\ciao}:` era `::` mentre del secondo codice era giustamente `:o:`
È vero: ma la spiegazione è piuttosto complessa. Facciamo una semplificazione:
`\def\test{AB}
\def\lastof#1{\edef\next{\expandafter\@gobble#1}%
\ifx\next\@empty
#1%
\else
\expandafter\lastof\expandafter[\next}%
\fi}`
La chiamata \lastof{\test} esegue “\edef\next{\expandafter\@gobble\test}” che diventa “\edef\next{\@gobble AB}” cioè come “\def\next{B}”. Adesso c’è \ifx che risulta falso, quindi viene eseguito “\expandafter\lastof\expandafter[\next}” che diventa “\lastof{B}”. Ora c’è \edef\next{\expandafter\@gobble B} che è come “\def\next{}”. Il test è vero e quindi viene prodotto #1, cioè “B”.
Proviamo con
`\def\test{AB}
\def\Xlastof#1{\edef\next{\expandafter\@gobble#1}%
\ifx\next\@empty
#1%
\else
\Xlastof\next
\fi}`
Se diamo \Xlastof{\test} il primo passo è come prima ed equivale a scrivere “\def\next{B}”. Il condizionale è falso, quindi viene eseguito \Xlastof\next e qui avviene il pasticcio: viene eseguito “\edef\next{\expandafter\@gobble\next}” che equivale a “\def\next{}” e quindi viene seguito il ramo vero che produce #1, che in questo caso è \next, ed ecco che non salta fuori nulla.
Non è il modo migliore per mangiare un token alla volta, in effetti. Prova con altre strategie: di solito questo si fa con macro con argomenti delimitati.
`\def\lastof#1{\expandafter\@lastof#1\@lastof}
\def\@lastof#1#2\@lastof{\def\@last@f{#1}\def\next{#2}%
\ifx\next\@empty
\@last@f
\else
\expandafter\@lastof\next\@lastof
\fi}`
Non funzionerebbe se l’argomento di \lastof ha espansione vuota, ma questo si può controllare prima. Sarebbe meno complicato se si dovesse usare un token alla volta, ci sono esempi sugli Appunti (\slowromancaps, se non ricordo male). Qui la richiesta è un po’ diversa e bisogna tenersi in mente un token. Per questo \@lastof ha due argomenti, il primo non delimitato, il secondo delimitato. Perciò con
`\@lastof ciao\@lastof`
il primo argomento è “c”, il secondo è “iao”.
Ciao
Enrico