robitex” post=68714Uhm, continuo ancora ad essere dubbioso sulla possibilità di gestire un numero di argomenti variabili con TeX, per il semplice motivo che la ricerca dei token argomento compiuta da un comando è “fissa” (attendiamo pareri TeXnici).
È per questo che dico che si può fare pur usando parentesi tonde o quadre anziché graffe. Le parentesi graffe vengono sempre “consumate” da TeX, mentre quelle tonde o quadre possiamo gestircele come meglio crediamo:
`\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}
\usepackage{xspace}
\makeatletter
\def\insulto(#1)(#2){%
\@ifnextchar({#1\insulto@@(#2)}{\insulto@{#1}{#2}}}
\def\insulto@#1#2{%
#1 è #2\xspace}
\def\insulto@@(#1)(#2){%
\@ifnextchar({, #1\insulto@@(#2)}{ e #1 sono #2\xspace}}
\makeatother
\begin{document}
\begin{itemize}
\item \insulto(luca)(scemo);
\item \insulto(marco)(francesco)(cretini);
\item \insulto(marco)(francesco)(giuseppe)(stupidi).
\item \insulto(marco)(francesco)(giuseppe)(giovanni)(idioti).
\end{itemize}
\end{document}`
Serve xspace perché \@ifnextchar si mangia gli spazi, quindi in alcuni casi bisogna rimetterceli (ci pensa \xspace).
A meno che nel codice del comando a due argomenti non si inserisca un \@gobble o qualcosa del genere.
Tipo:
`
\makeatletter
% cmd con due arg
\def\insulti@ii#1#2{#1 è #2}
% cmd con tre arg
\def\insulti@iii#1#2#3{#1 e #2 sono #3}% comando delimitato
\def\ins@ulti#1#2#3{
\def\tmp@{#3}
\ifx\tmp@\@nil
\insulti@ii#1#2
\else
\insulti@iii#1#2#3
\fi
}% cmd utente
\def\insulti#1{
\ins@ulti#1\@nil}\makeatother
`
Non capisco come dovrei usare il tuo codice.
`\insulti{luca}{scemo} e \insulti{marco}{francesco}{cretini}`
non mi funziona.
Per l’overloading, ho in mente il funzionamento di Java mentre per il numero variabile di argomenti penso all’ellipsis …
Un saluto.
R.
Esatto! Più o meno è lo stesso in C++. La firma del metodo cambia anche in dipendenza del numero di argomenti.
Ciao,
Antonio