OldClaudio” post=69212Hai provato con il pacchetto (e la sua documentazione) FiXLtxHyph?
[Su TexLive da un mesetto almeno]
Il modo di modificare \em che usate è scorretto perché \em è definito con \DeclareRobustCommand (o equivalente). Quindi il comando giusto da modificare non è \em, ma \csname em \endcsname che nel seguito indicherò con \em§ (la § sta per “spazio”).
Vediamo un po’. Voi date
`\let\originalem\em
\let\newem\em
\addto\newem{\hz}`
Se la lingua è fra le quattro dichiarate, succede che passando a una di queste viene eseguito
`\let\em\newem`
La chiamata di \em eseguirà
`\protect\em§\hz`
e, nel caso in cui \em compaia in un \write, nel file verrà scritto
`\em \nobreak\hskip\z@skip`
che, quando il file sarà riletto eseguirà due volte \hz, una dalla nuova espansione di \em e l’altra del codice scritto nel file.
Un comando robusto non va mai modificato con \let. Si rischia molto di andare in un circolo vizioso. Se proprio volete seguire questa strada, usate \LetLtxMacro del pacchetto letltxmacro.
Questa è una versione un pochino più sicura:
`\newcommand\hz{\nobreak\hskip\z@skip}
%%% keep the inner version of \em
\expandafter\let\expandafter\FLH@ori@em\csname em \endcsname
%%% patch it
\let\FLH@new@em\FLH@ori@em
\g@addto@macro\FLH@new@em{\hz}
%%% cycle through the supported language
\def\@tempa{catalan,french,italian,romansh}
\@for\@tempb:=\@tempa\do{
\@ifundefined{captions\@tempb}{}
{
\expandafter\g@addto@macro\csname extras\@tempb\endcsname{\FLH@setnew@em}
\expandafter\g@addto@macro\csname noextras\@tempb\endcsname{\FLH@setori@em}
}
}
%%% helper macros
\def\FLH@setnew@em{\expandafter\let\csname em \endcsname\FLH@new@em}
\def\FLH@setori@em{\expandafter\let\csname em \endcsname\FLH@ori@em}`
Naturalmente vi sarete accorti che il pacchetto non fa quello che deve se fra le lingue chiamate con babel c’è il francese (per i soliti motivi). Quindi è certamente meglio aggiungere in coda
`\AtBeginDocument{\@nameuse{extras\bbl@main@language}}`
in modo da correggere questo “piccolo” difetto. Infatti
`\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[french,italian]{babel}
\usepackage{fixltxhyph}
\begin{document}
\show\em
\end{document}`
produce
`> \em=macro:
->\protect \em .`
mentre, togliendo “french”, si ottiene
`> \em=macro:
->\protect \em \hz .`
come vorreste.
Ciao
Enrico