- Questo topic ha 21 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 4 anni, 1 mese fa da
egreg9.
-
CreatoreTopic
-
26 Maggio 2011 alle 9:15 #59257::
Ciao.
Ho un problema nella generazione degli indici: se una voce inizia con una lettera accentata (nel mio caso È), nell’indice analitico viene inserita all’inizio, fra i simboli. Esiste un modo per rimediarvi?Descrizione estesa: sto scrivendo un canzoniere col pacchetto songs, che usa un programma separato per la generazione degli indici (non ho capito perché). Sta di fatto che questo programma genera un indice separato per ogni capitolo in cui è diviso il canzoniere.
Io vorrei anche un indice alfabetico globale. Quindi ho modificato la classe in modo che per ogni canzone indicizzi il titolo. Ora, qualche canzone inizia con lettere accentate, da qui il problema.
Avete un qualche altro approccio da suggerirmi?Fran
-
CreatoreTopic
-
AutoreRisposte
-
-
26 Maggio 2011 alle 10:24 #59258::
Ciao.
Ho un problema nella generazione degli indici: se una voce inizia con una lettera accentata (nel mio caso È), nell’indice analitico viene inserita all’inizio, fra i simboli. Esiste un modo per rimediarvi?Descrizione estesa: sto scrivendo un canzoniere col pacchetto songs, che usa un programma separato per la generazione degli indici (non ho capito perché). Sta di fatto che questo programma genera un indice separato per ogni capitolo in cui è diviso il canzoniere.
Io vorrei anche un indice alfabetico globale. Quindi ho modificato la classe in modo che per ogni canzone indicizzi il titolo. Ora, qualche canzone inizia con lettere accentate, da qui il problema.
Avete un qualche altro approccio da suggerirmi?Fran
Non tanti.
`\index{e gia tardi@È già tardi}`
Ciao
Enrico
-
26 Maggio 2011 alle 10:48 #59259::
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
-
26 Maggio 2011 alle 11:04 #59260::
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.
FrancescoPuoi 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
-
26 Maggio 2011 alle 17:56 #59261
-
27 Maggio 2011 alle 8:13 #59262::
Buongiorno.
Ho fatto delle prove. La modifica funziona perfettamente con un testo standard.
Il file .idx risulta:`\indexentry{casa}{1}
\indexentry{e bello@è bello}{2}`
Se la introduco invece nel mio documento ho un problema:
Il file .idx risulta così:
`\indexentry{Alleluia Passeranno i cieli@\songtitle }{2}
\indexentry{E santo@\songtitle }{2}`
Cioè lui legge la macro \songtitle perché riesce a “trasformare” le lettere accentate in non accentate, però dopo l’@ non scrive il testo giusto. Inoltre “lavora” anche le parole non accentate.
Il file .ind risulta quindi così:`\begin{theindex}
\item \songtitle , 2
\indexspace
\item \songtitle , 2
\end{theindex}` e l’indice alla fine ha solo dei numeri di pagina, senza nulla prima.
Se serve posso riportare il pezzo di codice che modifico, anche se da solo dice poco.`\newcommand\SB@@@beginsong{%
\global\SB@stanzafalse%
\setbox\SB@chorusbox\box\voidb@x%
\SB@gotchorusfalse%
\setbox\SB@songbox\vbox\bgroup\begingroup%
\ifnum\SB@numcols>\z@\hsize\SB@colwidth\fi%
\leftskip\z@skip\rightskip\z@skip%
\parfillskip\@flushglue\parskip\z@skip%
\SB@raggedright%
\global\SB@transposefactor\z@%
\global\SB@cr@{\\}%
\protected@edef\@currentlabel{\p@songnum\thesongnum}%
\setcounter{versenum}{1}%
\SB@prevversetrue%
\meter44%
\resettitles%
\SB@addtoindexes\songtitle\SB@rawrefs\songauthors%
\noaccentindex{\songtitle} %MODIFICATO
\nexttitle%
\foreachtitle{\expandafter\SB@addtotitles\expandafter{\songtitle}}%
\resettitles%
\lyricfont%
\SB@setbaselineskip%
}`
Ci studio su un po’.
Grazie!
FrancescoEDIT: modificando la riga:`\expandafter\index\expandafter{\next @\detokenize{#1}}% ` in `\expandafter\index\expandafter{\next @#1}% ` tutto funziona.
Il file .idx risulta:
`\indexentry{Alleluia Passeranno i cieli@Alleluia Passeranno i cieli}{2}
\indexentry{E santo@\IeC {\`E} santo}{2}` quindi non lavora ancora perfettamente.
Possono esserci problemi?
-
27 Maggio 2011 alle 8:36 #59263::
Buongiorno.
Ho fatto delle prove. La modifica funziona perfettamente con un testo standard.…
EDIT: modificando la riga:`\expandafter\index\expandafter{\next @\detokenize{#1}}% ` in `\expandafter\index\expandafter{\next @#1}% ` tutto funziona.
Il file .idx risulta:
`\indexentry{Alleluia Passeranno i cieli@Alleluia Passeranno i cieli}{2}
\indexentry{E santo@\IeC {\`E} santo}{2}` quindi non lavora ancora perfettamente.
Possono esserci problemi?Sì. Voglio appunto evitare che nel file .idx ci siano scritte schifezze. La modifica da eseguire è
trasformare
`\noaccindex{\songtitle}`
in
`\expandafter\noaccindex\expandafter{\songtitle}`
Ciao
Enrico
-
27 Maggio 2011 alle 9:36 #59264::
Sì. Voglio appunto evitare che nel file .idx ci siano scritte schifezze. La modifica da eseguire è
trasformare
`\noaccentindex{\songtitle}`
in
`\expandafter\noaccentindex\expandafter{\songtitle}`
Ciao
EnricoPurtroppo non funziona, dà qualche problema con altre macro (\endsong, quella di chiusura dell’ambiente song).
`! Extra }, or forgotten \endgroup.
\SB@endsong …}\fi \fi \fi \fi \endgroup \egroup
\setbox \SB@songbox \vbox …
l.66 \endsong`Quali sono gli inconvenient dell’eliminare il \detokenize dal tuo codice?
Fran
-
27 Maggio 2011 alle 10:02 #59265::
Sì. Voglio appunto evitare che nel file .idx ci siano scritte schifezze. La modifica da eseguire è
trasformare
`\noaccentindex{\songtitle}`
in
`\expandafter\noaccentindex\expandafter{\songtitle}`
Ciao
EnricoPurtroppo non funziona, dà qualche problema con altre macro (\endsong, quella di chiusura dell’ambiente song).
`! Extra }, or forgotten \endgroup.
\SB@endsong …}\fi \fi \fi \fi \endgroup \egroup
\setbox \SB@songbox \vbox …
l.66 \endsong`Quali sono gli inconvenient dell’eliminare il \detokenize dal tuo codice?
Fran
L’inconveniente è appunto che nel file .idx trovi un sacco di schifezze. Bisognerebbe sapere che cosa c’è in \songtitle.
NOTA: l’errore avviene anche se si toglie la riga \noaccindex{\songtitle}. Direi che quella ridefinizione del comando non è propriamente corretta.
Ciao
Enrico
-
27 Maggio 2011 alle 11:02 #59266::
Ti presento la mia casistica, partendo da questo codice:`\documentclass[a4paper,12pt]{book}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}
\usepackage{makeidx}
\makeindex
\usepackage{songs}
\newindex{ind}{ind} % per gli indici di songs, da generare a parte
\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@
\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}
\renewcommand\SB@@@beginsong{%
\global\SB@stanzafalse%
\setbox\SB@chorusbox\box\voidb@x%
\SB@gotchorusfalse%
\setbox\SB@songbox\vbox\bgroup\begingroup%
\ifnum\SB@numcols>\z@\hsize\SB@colwidth\fi%
\leftskip\z@skip\rightskip\z@skip%
\parfillskip\@flushglue\parskip\z@skip%
\SB@raggedright%
\global\SB@transposefactor\z@%
\global\SB@cr@{\\}%
\protected@edef\@currentlabel{\p@songnum\thesongnum}%
\setcounter{versenum}{1}%
\SB@prevversetrue%
\meter44%
\resettitles%
\SB@addtoindexes\songtitle\SB@rawrefs\songauthors%
\expandafter\noaccentindex\expandafter{\songtitle} %MODIFICATO
\nexttitle%
\foreachtitle{\expandafter\SB@addtotitles\expandafter{\songtitle}
}%
\resettitles%
\lyricfont%
\SB@setbaselineskip%
}
\makeatother
\begin{document}
\printindex
\begin{songs}{ind}
\beginsong{Alleluia Passeranno i cieli}
\beginchorus
\[D]Alle\[A]luia, \[Bm]alleluia, \[F#m]alleluia,
\endchorus
\beginverse
\[D]Passeranno i \[A]cieli e \[Bm]passerà la \[F#m]terra,
\endverse
\endsong
\beginsong{È santo}[by={Daniele Ricci}]
\beginverse
\[E]\\[A]\[E]\\[A]\[E]\
È \[E]san\to, santo \[A]san\[E]to,
\endverse
\endsong
\end{songs}
\end{document}`1. Così come scritto sopra, mi dà l’errore del messagio precedente.
2. togliendo gli \ezpandafter non dà errore, ma genera l’indice vuoto (resta \songtitle del file idx)
3. togliendo gli \expandafter e il \detokenize funzinona bene, salvo le “schifezze” nell’indice.Fran
-
27 Maggio 2011 alle 11:24 #59267::
Ti presento la mia casistica, partendo da questo codice:
…
1. Così come scritto sopra, mi dà l’errore del messagio precedente.
2. togliendo gli \ezpandafter non dà errore, ma genera l’indice vuoto (resta \songtitle del file idx)
3. togliendo gli \expandafter e il \detokenize funzinona bene, salvo le “schifezze” nell’indice.Fran
Nel caso 1 ottengo l’errore.
Nel caso 2 ottengo l’errore.
Nel caso 3 ottengo l’errore.
Sempre lo stesso che ottengo anche se ometto la riga con “% modificato”.
Ciao
Enrico
-
27 Maggio 2011 alle 11:58 #59268::
È vero, con la versione di songs.sty che si trova su CTAN.
Non so per quale motivo non sia aggiornato.
Su http://songs.sourceforge.net/downloads.html si trova la versinoe aggiornata.
Grazie della pazienza.Fran
-
27 Maggio 2011 alle 12:34 #59269::
È vero, con la versione di songs.sty che si trova su CTAN.
Non so per quale motivo non sia aggiornato.
Su http://songs.sourceforge.net/downloads.html si trova la versinoe aggiornata.
Grazie della pazienza.Fran
Aggiungi \endgroup prima di \index{#1}; correggo anche nel messaggio precedente; inoltre sposta
`\expandafter\noaccentindex\expandafter{\songtitle}%`
subito dopo \SB@setbaselineskip, appena prima della graffa di chiusura finale.Ciao
Enrico
-
27 Maggio 2011 alle 12:40 #59270
-
24 Agosto 2021 alle 4:46 #59271::
Buongiorno! Sono un po’ arrugginito in fatto di programmazione LaTeX e non riesco a capire come mai ora il codice di Enrico non funziona più. Un emc senza usare il pacchetto songs:
`\documentclass[10pt]{book}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{imakeidx}
\makeindex\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\begin{document}
ciao\noaccentindex{arto}rete\noaccentindex{èna}
remo\noaccentindex{era}
\printindex
\end{document}`nel file .idx trovo`\indexentry{arto}{1}
\indexentry{èna}{1}
\indexentry{era}{1}`anziché `\indexentry{arto}{1}
\indexentry{ena@èna}{1}
\indexentry{era}{1}`
@Enrico, sai aiutarmi? in questi 10 anni è stato sviluppato qualche altro modo per ovviare al problema delle lettere accentate in makeindex?
-
27 Agosto 2021 alle 8:19 #59272::
franen” post=120863Buongiorno! Sono un po’ arrugginito in fatto di programmazione LaTeX e non riesco a capire come mai ora il codice di Enrico non funziona più. Un emc senza usare il pacchetto songs:
`\documentclass[10pt]{book}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{imakeidx}
\makeindex\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\begin{document}
ciao\noaccentindex{arto}rete\noaccentindex{èna}
remo\noaccentindex{era}
\printindex
\end{document}`nel file .idx trovo`\indexentry{arto}{1}
\indexentry{èna}{1}
\indexentry{era}{1}`anziché `\indexentry{arto}{1}
\indexentry{ena@èna}{1}
\indexentry{era}{1}`
@Enrico, sai aiutarmi? in questi 10 anni è stato sviluppato qualche altro modo per ovviare al problema delle lettere accentate in makeindex?No, nessun modo. Il codice non funziona più perché i caratteri multibyte in [tt]\protected@edef[/tt] ora producono sé stessi. Modifica:
`
\newcommand{\noaccentindex}[1]{%
\begingroup
\let\UTF@two@octets@noexpand\@empty
\let\UTF@three@octets@noexpand\@empty
\let\UTF@four@octets@noexpand\@empty
\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}
`Ciao
Enrico
-
27 Agosto 2021 alle 9:33 #59273
-
28 Giugno 2022 alle 16:51 #59274::
Ogni tanto ritorno. Texlive 2022 aggiornata a oggi, il codice
`\documentclass[10pt]{book}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{imakeidx}
\makeindex\makeatletter
\def\accents@list{\do\IeC\do\`\do\'}
\def\letters@list{\do\i{i}}
\newcommand{\noaccentindex}[1]{%
\begingroup
\let\UTF@two@octets@noexpand\@empty
\let\UTF@three@octets@noexpand\@empty
\let\UTF@four@octets@noexpand\@empty
\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\begin{document}
ciao\noaccentindex{arto}rete\noaccentindex{èna}
remo\noaccentindex{era}
\printindex
\end{document}`
dà ancora il problema di non creare la struttura `\indexentry{ena@èna}{1}` nell’idx.
@egreg9 hai qualche altra magia da tirare fuori?
-
29 Giugno 2022 alle 6:39 #59275::
@franen, il codice di Enrico funzionava quando aceci scritto il Canzoniere. Credo che allora andasse bene perché la codifica utf8 era ancora poco usata e forse i font OpenType ono esistevano ancora.
Oggi con la codifica utef8 ogni carattere accentato è un glifo a sé quindi quando salvi éra in \next e quando ne confronti il testo detokenizzato con la stringa originale attraverso il comando primitivo di pdftex \pdfstrcmp, esso trova sempre le due stringhe uguali, proprio perché non si sono usati i comandi per gli accenti, ma attraverso la codifica utf8 ogni carattere accentato è un carattere a se stante quindi éra rimane éra e non \’era. quindi non viene creata la stringa era@éra come ti saresti aspettato.Che cosa tu voglia fare con era ed éra nel tuo esempio non mi è chiaro; infatti col tuo esempio l’indice viene cmposto correttamente cona la voce era prima della voce éra. Forse vorresti che éra comparisse dopo era anche se le voci dell’indice contenessero anche , che so, cera? In quel caso esse verrebbero in quest’ordine, perché é viene dopo la c.
Se questa mia interpretazione è giusta, bisognerebbe eseguire i test proprio con un contenuto dalla macro \next che non contenga assolutamente lettere accentate, quindi bisognerebbe eseguire un test molto complesso che sostituisca in una lista di token, limitandosi all’italiano, le lettere à, è, é, ì, ò, ó, ù, con le corrispondenti lettere (minuscole) non accentate (ó è rarissima ma non impossibile; confronta cólto con còlto). Non sarebbe una macro impossibile, ma sicuramente richiede molta pazienza, a meno che Enrico, ricorrendo a LaTeX3, con una sua magia crei la sostituzione che ti ho indicato.
-
29 Giugno 2022 alle 10:02 #59276::
l’indice viene cmposto correttamente cona la voce era prima della voce éra.
Il risultato non è corretto perché “èna” viene dopo di “era” e io vorrei che una e accentata fosse considerata come una e non accentata in fase di creazione dell’indice.
Sul fatto della digitazione diretta in UFT8 o con simboli, io ho sempre e solo usato UTF8, anche 10 anni fa.
Già lo scorso anno c’era stato un problema simile che Enrico aveva attribuito a un nuovo modo di espandere i caratteri.
Ora non so che succeda
-
29 Giugno 2022 alle 16:09 #59277::
Francesco, io col tuo esempio ho fatto solo ipotesi e ho tracciato le singole operazioni ditro le quinte mediante l’uso del pacchetto trace (bisogna stare attenti a tracciare brevi pezzi di codice, altrimenti vengono decine di migliaia di righe e ci si perde). Quindi le analisi fatte con trace sono corrette, e il resto sono mie ipotesi. Potei provare a scrivere una macro in LatEx3 per vedere se le mie ipotesi funzionano. Nel caso te lo scrivo. Purtroppo non lo posso fare subito, perché ho problemi con il 730 e devo interagire con il CAF che mi assiste.
Comune il tuo problema è molto delicato e va affrontato come si deve.
-
2 Agosto 2022 alle 11:55 #59278
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.