Re: Classe o pacchetto: definire comandi facilmente ridefinibili

#39507
Up
0
Down
::

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

Go to top