Re: Comando per creare comandi

#16252
Up
0
Down
::

Come vedi, puoi usare \newcommand dentro un \newcommand, purché si indichino i parametri del \newcommand interno raddoppiando i #.

Prima di tutto ti ringrazio. Un’iltima cosa:
sarebbe possibile fare in modo da poter chiamare: \crea{Prova} e fra creare il comando \Prova?

Perché in effetti il comando \crea{} dovrebbe creare due comandi, uno \Prova e anche \BisProva (che devono essere leggermente differenti).

Naturalmente.
`\newcommand{\crea}[2]{%
\expandafter\newcommand\csname #1\endcsname[1]{##1 #2 \ComandoStandard}%
\expandafter\newcommand\csname Bis#1\endcsname[1]{##1 #2 \ComandoStandard}%
}`
Scrivere \csname Prova\endcsname è (quasi) equivalente a scrivere \Prova. Se però scrivessi \newcommand\csname #1\endcsname, otterrei l’effetto di dare \csname come argomento di \newcommand, che sarebbe molto sbagliato.

Qui entra \expandafter, che espande il token successivo a \newcommand; l’espansione di \csname consiste nel cercare \endcsname e costruire il nome del comando con ciò che sta in mezzo. Et voilà.

Va osservato che \newcommand è costruito in modo da “accorgersi” di essere chiamato all’interno di una definizione. Ci sono sottili questioni TeXniche di mezzo. Una sintassi Plain, che però non eseguirebbe il controllo sui comandi eventualmente già definiti, sarebbe
`\def\crea#1#2{%
\expandafter\def\csname #1\endcsname##1{##1 #2 \ComandoStandard}%
\expandafter\def\csname Bis#1\endcsname##1{##1 #2 \ComandoStandard}%
}`
con il raddoppio dei segni # per indicare i parametri nella definizione “interna”.

Ciao
Enrico

Go to top