Grazie della spiegazione.
Chissa perché ero convinto che \providecommand sovrascrivesse la definizione preesistente.
\providecommand è stato introdotto con LaTeX2e, per risolvere in modo rapido problemi del tipo esposto. Infatti \newcommand dà errore se il comando che segue è definito, mentre \renewcommand dà errore se il comando non è definito.
Il contesto in cui si usa \providecommand è tipicamente quello di Francesco: se si vuole avere a disposizione un comando che un altro pacchetto definisce insieme ad altri senza dover per forza caricare l’intero pacchetto, ecco che \providecommand fa esattamente ciò che si desidera.
Altro uso: vogliamo definire a modo nostro un certo comando, indipendentemente dal fatto che sia definito o no in uno dei pacchetti caricati:
`\providecommand{\pippo}{}
\renewcommand{\pippo}{…}`
Con \providecommand ci assicuriamo che \pippo sia definito (non importa che cosa si mette tra le graffe della definizione) e quindi possiamo ridefinirlo.
Per i curiosi: \providecommand esamina il comando che segue; se è definito esegue \renewcommand, altrimenti esegue \newcommand. Facile, no? La costruzione
`\@ifdefinable{\pippo}{\newcommand{\pippo}{…}}`
funziona come \providecommand, ma è molto meno amichevole. La ridefinizione con \providecommand e \renewcommand può essere realizzata con
`\@ifundefined{pippo}{\newcommand}{\renewcommand}{\pippo}{…}`
In tutti i casi si può specificare il numero di argomenti come al solito.
Ciao
Enrico