Se sei sicuro che l’espansione di \ctref@
siano solo caratteri, dovresti ottenere ciò che desideri con
`\expandafter\edef\csname ctref@#1\endcsname{\ctref@temp}
\define@key{ctfamLabel}{#1}[]{%
\edef\next{\noexpand\setkeys{ctfamLabel}[id]{\csname ctref@#1\endcsname}}
\next
}`
Si funziona, anche se definire un comando temporaneo con \edef che espande la definizione all’interno della quale troviamo un \noexpand, è proprio un paradosso.
L’ipotesi che faccio sul perché funziona è questa: \edef espande la definizione ma incontra un \noexpand ed inserisce il token \setkeys come è, ma espande tutto quello che segue, con il risultato dell’espansione in caratteri degli argomenti del comando.
Esattamente, con il trucco di mettere ciò che si vuole espandere nel testo di sostituzione di \edef\next, inibendo però l’espansione di \setkeys ottengo la lista di token che desidero; poi basta espandere \next. Ricordarsi sempre che \edef è una brutta bestia, però. 🙂
Ciao
Enrico