OldClaudio” post=69243Enrico, in teoria (e in pratica, solo quasi, però) hai ragione, ma a me risulta che nel file aux il comando \emph appia scritto benissimo, così come nel file toc.
D’altra parte l’utente non dovrebbe mi usare la dichiarazione \em ma il comando \emph per i noti motivi.Però l’esperimento con il francese ([tt]\usepackage[english, romansh,italian,french, catalan]{babel}[/tt]) e l’inserimento di [tt]\show\em[/tt] prima di [tt]\begin{document}[/tt] e dopo il cambio di ciascuna delle altre lingue mi mostra sempre:
`
\show\em
?
> \em=macro:
->\protect \em \hz .
`
Tranne che prima di [tt]\begin{document}[/tt] dove manca [tt]\hz[/tt], ma solo lì.Il codice potrebbe essere migliorato secondo quanto hai suggerito e lo farò di certo, ma per l’uso comune non vengono espanse macro due volte e non si manifestano inconvenienti di sorta con il francese, per lo meno io non sono riuscito a riprodurre i tuoi esempi.
A parte “romansh” che non ho, confermo che, quando c’è il francese fra le lingue caricate, \hz non c’è (con \show\em subito dopo \begin{document}). C’è dopo un comando \selectlanguage{italian}.
La scusa che \em non va usato non regge. 🙂 Il rischio del circolo vizioso rimane.
Ti allego la versione LaTeX3:
`\RequirePackage{expl3}
\ExplSyntaxOn
\cs_new_protected:Npn \hz { \nobreak \hskip \c_zero_skip }
\cs_set_eq:Nc \flh_ori_em: { em ~ }
\tl_set:No \l_tmpa_tl { \flh_ori_em: }
\tl_put_right:Nn \l_tmpa_tl { \hz }
\exp_args:NNV \cs_set:Npn \flh_new_em: { \l_tmpa_tl }
\clist_map_inline:nn { catalan , french , italian , romansh }
{
\cs_if_exist:cT { captions #1 }
{
\tl_put_right:cn { extras #1 } { \flh_set_new_em: }
\tl_put_right:cn { noextras #1 } { \flh_set_ori_em: }
}
}
\cs_new:Npn \flh_set_new_em: { \cs_set_eq:cN { em ~ } \flh_new_em: }
\cs_new:Npn \flh_set_ori_em: { \cs_set_eq:cN { em ~ } \flh_ori_em: }
\ExplSyntaxOff`
Le idee sono esattamente le stesse. La cosa più interessante, secondo me, è il ciclo che è molto più leggibile: la funzione \clist_map_inline:nn esegue un ciclo su ogni elemento della lista data come primo argomento e l’elemento viene messo a disposizione del codice da eseguire nel secondo argomento come #1. Niente \@tempa da espandere (non nel vostro caso, perché la usate dentro \csname, ma in altre occasioni è necessario). \cs_if_exist:nT è come \@ifundefined, ma si può dare solo l’argomento del caso “vero”; esistono naturalmente anche \cs_if_exist:cTF e \cs_if_exist:cF.
Come si vede, gli spazi sono del tutto ignorati e aumentano la leggibilità del codice. Per darne uno reale si usa ~.
Anche \exp_args:NNV è interessante. NN indica che si devono saltare i due comandi successivi e la V dice che al terzo posto ci deve essere, tra graffe, una variabile (nel caso \l_tmpa_tl) di cui si usa il valore (per una variabile token list è la sua espansione di primo livello). L’analogo tradizionale
`\expandafter\let\expandafter\flh@new@em\expandafter{\@tempa}`
è molto meno leggibile.
Ciao
Enrico