Salve a tutti di nuovo.
Dato che quei frammenti di codice non funzionano bene come mi aspetterei, ho deciso di cogliere la palla al balzo e studiarmi un po’ di cose da me.
E proprio qui mi serve il vostro aiuto.Riassumendo ciò che voglio fare in pseudo-codice:
`nuovocomando: eng() {
if ( lowercase() è già stato usato )
then
scrivi con carattere normale
else
scrivi enfatizzato
endif
}nuovocomando: engresetall() {
dimentica tutti i già usati
}`
Il primo problema in cui mi sono imbattuto è che può in alcuni casi essere espandibile (p.e. usando \acl del pacchetto acronym).
Il secondo problema è che avrei bisogno di una struttura adeguata alla memorizzazione dei vari in grado anche di essere `svuotata’.Da qui penso che le cose da studiare bene sono:
costrutti if/then/else;
token e registri token;
costrutti tipo \csname … \endcsname e \expandafter.Però volevo essere sicuro di stare sulla buona strada e nel caso ricevere qualche dritta su dove indirizzare di più i miei sforzi.
Qui c’è un po’ di codice che dovrebbe fare al caso tuo.
`\makeatletter
\def\eng#1{%
\ifcsname ENG@#1\endcsname
\seguente{#1}%
\else
\primo{#1}%
\global\@namedef{ENG@#1}{}%
\unless\ifcsname ENG@used#1\endcsname
\global\let\ENG@el\relax
\xdef\ENG@list{\ENG@list\ENG@el{#1}}%
\fi
\global\@namedef{ENG@used#1}{}%
\fi}
\let\primo\emph
\let\seguente\@iden
\let\ENG@list\@empty
\def\engreset{\global\let\ENG@el\@engreset\ENG@list}
\def\@engreset#1{\global\expandafter\let\csname ENG@#1\endcsname\@undefined}
\makeatother`
Spiacente, però; tener conto della maiuscola mi sembra piuttosto complicato e, del resto, inutile: è piuttosto difficile che una di quelle parole compaia a inizio capoverso.
Sinceramente non sarei d’accordo sull’uso del “reset”, mi pare piuttosto forzato, ma se proprio vuoi, nel codice c’è. Vediamo ora come funziona; impiego le estensioni e-TeX, ma non c’è problema se non hai un’installazione di LaTeX straobsoleta; supporrò che sia dato il comando \eng{goofy} (che sarebbe “pippo” in inglese).
1 – L’idea è quella di vedere se la macro \ENG@goofy è definita; se lo è, siamo nel caso in cui la parola va in tondo.
2 – Se \ENG@goofy non è definita, la definiamo e scriviamo la parola in corsivo; inoltre, se \ENG@usedgoofy non è definita, la definiamo.
3 – Se \ENG@usedgoofy non è definita, significa che è proprio la prima volta che il termine compare; se è definita, invece, il termine è già comparso.
4 – Usiamo una macro che contiene la lista dei termini che sono già comparsi: \ENG@list; se \ENG@usedgoofy non è definita, la lista diventa quello che era prima, con l’aggiunta di \ENG@el{goofy}. Qui \ENG@el equivale a \relax, in modo che non sia espandibile nella \xdef. Con il tuo testo di esempio, il valore finale di \ENG@list è
`\ENG@el{dependability}\ENG@el{computer}\ENG@el{Computer}\ENG@el{desktop}\ENG@el {time-sharing}`
5 – La macro \engreset cambia il valore di \ENG@el in \@engreset, che semplicemente cancella la definizione di \ENG@goofy (e di tutte le altre macro simili) e poi esegue \ENG@list.
Ciao
Enrico