Una volta Enrico ci ha mostrato un comando che ridefinisce se stesso dopo la prima chiamata in modo che dalla successiva in poi non faccia nulla a parte scrivere il suo argomento. Mi sembra servisse per l’indice analitico o qualcosa di simile.
[…]
puoi trovare la magia in questo post.
Un po’ difficilino. Non riesco a capire come adattarlo a questa esigenza.
Nel sorgente, a ogni occorrenza del termine bisognerebbe dare il comando \straniero: per me, il gioco non vale davvero la candela.
Be’, io spero comunque che Enrico risponda, perché mi interesserebbe vedere il costrutto TeX sottostante, per capire se si fa con l’if o con la macro «ricorsiva».
Comunque, se pensi che non valga la pena usare sempre il comando \straniero, allora torno alla mia convinzione di prima, secondo la quale conviene usare tale comando solo la prima volta in cui si introduce un termine e poi scriverlo normalmente, senza comando. Secondo me il problema di cercare la prima occorrenza del termine a mano non è eccessivamente gravosa, specie alla luce di questa discussione, dove si è capito che non è il caso di abusare di termini stranieri 😀
Niente di complicato 🙂
`\newcommand{\straniero}[1]{%
\ifcsname f@reign\detokenize{#1}\endcsname
#1%
\else
\global\expandafter\let\csname f@reign\detokenize{#1}\endcsname\relax
\emph{#1}%
\fi}`
Quando si scrive \straniero{pippo}, TeX controlla se il comando \f@reignpippo è definito. Se sì semplicemente stampa “pippo”. Se no, definisce globalmente \f@reignpippo come equivalente a \relax e stampa “\emph{pippo}”. Così, l’unica volta che \f@reignpippo non è definito è al primo uso di \straniero{pippo}.
Il \detokenize serve per proteggersi contro eventuali caratteri speciali nell’argomento di \straniero, che così vengono tutti trasformati in caratteri di categoria 12. Funziona anche \straniero{\TeX}. 🙂 Ovviamente, però, \straniero{File} e \straniero{file} sono considerati diversi; per averli equivalenti il prezzo sale. 😀
Ciao
Enrico