Mancava una modifica alla modifica! Siccome ho pensato che fosse meglio creare fin da subito un indice “secondario”, cioè con un nome proprio, ho cambiato il codice in modo che desse \index[opere]{…}, ma ho scordato di cambiare \printindex in \printindex[opere].
La questione delle codifiche è una di quelle che non fanno dormire! Più semplicemente, ricordati che TeXShop è, di default, con UTF-8 e quindi, quando ci incolli sopra, usa quella codifica. Nel testo originale sarebbe bastato cambiare \usepackage[latin1]{inputenc} in \usepackage[utf8]{inputenc}
Ma per la tua impresa è probabile che XeLaTeX sia nettamente più indicato.
Correggo anche nel messaggio precedente. Ah, non preoccuparti: le 23:30 per me sono quasi sera. 🙂 Era solo un riferimento alla scommessa di Luigi.
Adesso il codice produce esattamente l’elenco che serviva. Sono senza parole, per quella macro che hai scritto, e anche per il tempo che ti ci è voluto (è vero che l’hai scritta come un fulmine, ma in fondo è pur sempre il tuo tempo personale che hai usato!), e per la tua gentilezza. Altro che Gandalf! 🙂
Da buon studente cercherò adesso di capire come funziona la macro, senza subissarti di domande (anche se una cosa so già che non la capirò, come mai XeLaTeX generi l’indice a pagina 3, quando, a quanto capisco, dovrebbe essere a pagina 2. Andrò a leggere il manuale di imakeidx, probabilmente è un default in quel pacchetto, di generare la prima pagina dell’indice su pagina dispari.)
Ero molto ispirato da TeX, adesso lo sono ancora di più.
Grazie di cuore, per l’aiuto e per l’ispirazione.
È la classe book che decide di cominciare tutti i capitoli su pagina dispari. Se non desideri questo comportamento, ma non saprei giustificare questa scelta, da’ l’opzione “openany” alla classe.
Le macro non sono molto intuitive, temo, e richiedono una conoscenza TeXnica abbastanza profonda. Ma l’idea è semplice, tutto sommato.
La descrizione del personaggio comincia con il suo nome e in fondo aggiungi i titoli dei libri in cui compare. Perciò la macro \person fa due cose: stampa il nome del personaggio (in maiuscoletto) dopo aver messo in memoria nella macro \@person il nome stesso. La macro ausiliaria \@preserve, che ho definito prima, serve a evitare problemi con le lettere accentate.
Quando incontriamo il titolo di un libro, dato come argomento di \book, viene intanto stampato quello, seguito dal punto. Poi vengono generate le stringhe che serviranno per l’indice. Questo è il punto difficile: dato “Illusioni perdute” come titolo relativo al personaggio “Albertine”, occorre generare
`\index[opere]{Illusioni perdute|ignore}\index[opere]{Illusioni perdute!Albertine|ignore}`
Questo è compito di \edef, che esegue definizioni con espansione; l’unico token da non espandere è proprio \index. Generata la lista di token opportuna come testo di definizione di \temp, eseguo \temp (che è come un foglietto su cui si scarabocchia per tenere in mente qualcosa).
Con \index[opere]{Illusioni perdute|ignore} si avrà nel file .idx qualcosa come
`\item Illusioni perdute\ignore{3}`
e siccome la definizione di \ignore è di non fare niente con l’argomento, abbiamo ciò che ci serve.
Il contenuto di balzac.ist è facile da capire.
1) “group_skip” è ciò che makeindex inserisce tra una lettera dell’alfabeto e la successiva. A noi non serve niente, quindi lo azzeriamo.
2) “item_0” è ciò che viene messo da makeindex prima di una voce principale; vogliamo che sia spaziata da quella che precede, quindi ci metto “\n\n\\indexspace\n”, cioè due ritorni, \indexspace e a capo.
3) “delim_0” è quello che makeindex mette tra una voce principale e il numero di pagina, di solito è “virgola + spazio”. Analogamente per “delim_1” che riguarda le voci secondarie.
Un ultimo trucco: con queste definizioni, tra \begin{index} e la prima voce viene \indexspace. Uffa! 👿 Allora tengo a mente la definizione di \indexspace nel comando \@@indexspace e poi ridefinisco \indexspace in modo che definisca \indexspace come \@@indexspace! Niente meno. 😀
Che succede, in parole povere? La prima occorrenza di \indexspace nell’indice analitico ha come effetto di eseguire \let\indexspace\@@indexspace; quindi, dalla seconda volta in poi, \indexspace agisce secondo il significato originale. 🙂
Ciao
Enrico