@Caludio
Il comando \StrSubstitute è definito nel pacchetto xstring, e la stringa su cui agisce è l’espansione del comando \songtitle. Non posso fare un cerca-sostituisci nel file perché i punti esclamativi devono rimanere tali quando stampo i titoli al di fuori dell’indice (ad esempio nell’intestazione delle canzoni).
@Enrico
grazie… era molto semplice… rimanendo all’interno della definizione di \makeprelude (il codice che crea l’intestazione delle canzoni) non serve nemmeno un \expandafter:`\documentclass{article}
\usepackage{xstring}
\usepackage{imakeidx}
\makeindex
\usepackage[noindexes]{songs}%songs.sourceforge.net
\renewcommand{\makeprelude}{%
\resettitles\songtitle
\StrSubstitute{\songtitle}{!}{“!}[\tempstring]
\index{\tempstring}
}
\begin {document}
\begin{songs}{}
\beginsong{Prima!}
\endsong
\beginsong{Seconda}
\endsong
\end{songs}
\printindex
\end {document}`