Non so dire se gli anni di programmazione mi stanno aiutando a capire o se credo di aver capito ma in realtà così non è; sta di fatto che non conosco affatto TEX e alcune cose sono un pochino ostiche da digerire. Ma ci sto provando.
Credo, comunque, che questo problema sia una buona palestra …. potrebbe essere anche un interessante tema da proporre su ArsTecnica.
Metto in pratica le tue risposte … a prestissimo.
Ciao
CLAFE
I concetti fondamentali per la prima risposta sono:
(1) l’interfaccia di keyval per la sintassi “chiave=valore”
(2) il cambiamento del codice di categoria di @ in modo che @book sia interpretato come se fosse \book
(3) l’istruzione \let per rendere equivalenti \book, \article e gli altri comandi necessari
(4) l’uso di \csname per ottenere una “memoria associativa”.
Per la seconda risposta il problema è un po’ più sottile. Quando scriviamo
`\usebibdata{eco2005nome}{url}`
otteniamo le espansioni successive
`\@nameuse{eco2005@url}
\eco2005nome@url
http://books.google.com/books?id=OV\_yAAAAMAAJ`
La questione è che non possiamo semplicemente scrivere
`\url|\usebibdata{eco2005nome}{url}|`
perché \url tratta ciò che viene dopo le sbarre quasi come \verb. Né possiamo usare il trucco
`\begingroup\edef\x{\endgroup\noexpand\url|\usebibdata{eco2005nome|}\x`
perché l’URL potrebbe contenere caratteri speciali che durante l’espansione completa darebbero problemi. Perciò occorre un approccio indiretto. Con
`\toks@=\expandafter\expandafter\expandafter{\usebibdata{eco2005nome}{url}}`
abbiamo, espandendo il primo \expandafter,
`\toks@=\expandafter{\@nameuse{eco2005@url}}`
e, espandendo il secondo,
`\toks@={\eco2005nome@url}`
Adesso eseguiamo
`\toks@=\expandafter\expandafter\expandafter{\the\toks@}`
che dà, espandendo il primo \expandafter,
`\toks@=\expandafter{\eco2005nome@url}`
e, espandendo ancora,
`\toks@={http://books.google.com/books?id=OV\_yAAAAMAAJ}`
Siamo a buon punto: nel registro \toks@ c’è quello che vogliamo trattare. Adesso lo passiamo a \scantokens, che rileggerà tutto come se fosse tirato su da un file esterno, quindi riassegnando i codici di categoria:
`\scantokens\expandafter{\expandafter\url\expandafter|\the\toks@|\endinput}`
Siccome \scantokens vuole una graffa dopo di sé, espande ciò che vede subito dopo, cioè \expandafter, che causa l’espansione del successivo \expandafter che causa l’espansione del successivo che a sua volta causa l’espansione di \the:
`\scantokens\expandafter{\expandafter\url\expandafter|\the\toks@|\endinput}`
Otteniamo dunque
`\scantokens{\url|http://books.google.com/books?id=OV\_yAAAAMAAJ|\endinput}`
che è come se avessimo scritto direttamente
`\url|http://books.google.com/books?id=OV\_yAAAAMAAJ|`
(l’istruzione \endinput serve per evitare di vedere la riga vuota che TeX aggiunge internamente ai file che richiama con \input e \scantokens è una forma speciale di \input).
Le tre righe che cominciano con \toks@ potrebbero essere sostituite con
`\toks@=\expandafter…\expandafter{\usebibdata{#1}{url}`
dove … sta per un numero piuttosto elevato di \expandafter. Meglio fare un passo alla volta.
Ciao
Enrico