Grazie, funziona.
Ardisco chiedere altro: questa soluzone è manuale, e io preferirei fosse automatizzata, perché il mio file idx viene creato automaticamente. Quando inizio una canzone (con un comando \beginsong{Titolo canzone}) il titolo della canzone viene inserito nell’indice.
Non saprei come adattare il tuo suggerimento (\index{non accentato@accentato}). C’è un qualche modo per dire a TeX che negli indici le “È” valgono come “e”?Grazie.
Francesco
Puoi provare sostituendo \index{#1} nella definizione di \beginsong con \noaccentindex{#1} dando le seguenti definizioni nel preambolo
`\makeatletter
\def\accents@list{\do\IeC\do\`\do\'}
\def\letters@list{\do\i{i}}
\newcommand{\noaccentindex}[1]{%
\begingroup
\protected@edef\next{#1}%
\ifnum\pdfstrcmp{\detokenize\expandafter{\next}}{\detokenize{#1}}=\z@
\endgroup\index{#1}%
\else
\def\do##1{\def##1####1{####1}}\accents@list
\def\do##1##2{\def##1{##2}}\letters@list
\edef\next{\endgroup\def\noexpand\next{\next}}\next
\expandafter\index\expandafter{\next @\detokenize{#1}}%
\fi}
\makeatother`
Carino, eh? 🙂
Quando LaTeX incontra una lettera accentata come “È”, la trasforma in vari passi; uno di questi è importante, quando si giunge a “\protect\IeC {\protect\`E}”. La primitiva \edef definisce un comando eseguendo l’espansione completa nel testo di sostituzione; \protected@edef è analogo, ma si ferma ai comandi preceduti da \protect semplicemente eliminandolo. Perciò
`\protected@edef\next{È bello lì}`
equivale a
`\def\next{\IeC{\`E} bello l\IeC{\`\i}}`
Il codice di \noaccindex definisce prima di tutto \next come questa “espansione limitata” dell’argomento; poi la confronta con l’argomento stesso (\detokenize serve a evitare altre espansioni): \pdfstrcmp{X}{Y} ritorna 0 se le due liste di token X e Y sono uguali dopo l’espansione. Nel nostro caso sono uguali se l’argomento di \noaccindex non contiene lettere accentate e allora ci limitiamo a dare \index{#1}.
Se \pdfstrcmp non ritorna 0, dobbiamo eliminare gli accenti. Per questo scopo abbiamo definito la lista degli accenti che useremo, compreso \IeC.
Siamo già in un gruppo, quindi non è un problema ridefinire comandi; diamo un significato a \do ed eseguiamo la lista degli accenti, che equivale a dare i comandi
`\def\IeC#1{#1}\def\`#1{#1}\def\'#1{#1}`
in modo che l’espansione di “\IeC{\`E}” dia semplicemente “E”. Facciamo lo stesso con le lettere speciali, in questo caso solo ‘\i”: il codice che viene eseguito equivale a
`\def\i{i}`
Il vantaggio di usare liste è che ci basta agire su \accents@list e \letters@list per aggiungere accenti o lettere che ci servano.
Ora viene il bello:
`\edef\next{\endgroup\def\noexpand\next{\next}}\next`
Sappiamo che \edef espande il testo di sostituzione; nel nostro esempio \noaccindex{È bello lì}, \next ora vale “\IeC{\`E} bello l\IeC{\`\i}”. Perciò l’espansione completa di \next è, con le ridefinizioni date poco prima, “E bello li” e dunque la nostra \edef equivale a
`\def\next{\endgroup\def\next{E bello li}}`
A questo punto eseguiamo la macro \next che per prima cosa chiude il gruppo (dimenticandosi la sua definizione, ma ormai la sostituzione è già stata fatta! :)) ed esegue
`\def\next{E bello li}`
Quindi eseguiamo
`\expandafter\index\expandafter{\next @\detokenize{#1}}`
che equivale, dopo le espansioni indicate, a scrivere
`\index{E bello li@È bello lì}`
Et voilà. 😀
Nota: nella riga \edef\next…, la sequenza \next compare quattro volte con quattro significati diversi. 8)
Ciao
Enrico