Re: Parole straniere: “tecnologiche” e prestiti

#26180
Up
0
Down
::

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

Go to top