P'tite macro

Tout ce qui concerne l'utilisation ou l'installation de LaTeX.

Modérateur: gdm_tex

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

Messagepar francois » Mercredi 27 Juin 2007, 00:17

Bonjour

Je ne peux pas trop t'aider sauf pour les \csname etc...
C'est une macro assez amusante qui sert a appeler une macro Par exemple :
Code: Tout sélectionner
\def\aaa{bonjour}
\csname aaa\endcsname les enfants !

\aaa les enfants !

Ici, écrire "\csname aaa\endcsname" équivaut complètement à écrire "\aaa". Mais, alors à quoi sert cette macro pourrait-on dire ? Et bien typiquement à définir des macros à nom variable. Je m'explique.

Par exemple supposons que je veuille définir la macro \phrase{Jean} qui aurait pour fonction de définir automatiquement la macro \PourJean qui donnerait la phrase toute faite "Bonjour Jean, tu vas bien ?". ET bien là \csname est je crois indispensable. Voilà comment il faut faire :
Code: Tout sélectionner
\def\phrase#1{%
\expandafter\def\csname Pour#1\endcsname{Bonjour #1, tu vas bien ?}}
\phrase{Jean} \PourJean \PourJean \PourJean.

\phrase{Robert} \PourRobert \PourRobert \PourRobert.

Sans le expandafter, TeX voit \def\csname et il tente de redéfinir la commande \csname ce qui n'est pas le but. Ici le "\csname Pour#1\endcsname" est le nom de la macro que l'on définit et ce nom dépend de #1. Tu pourras te rendre compte que sans \csname, on est coincé. On serait tenter d'écrire :
Code: Tout sélectionner
\def\Pour#1{Bonjour #1, tu vas bien ?}

Mais là on définit la macro \Pour qui admet un argument (\Pour{Jean} ou \Pour{Robert} ) et ce n'est pas la même chose. En fait, grâce à \csname, on a pu "insérer" l'argument dans le nom de la macro. Marrant non ? Je crois que c'est exactement ce qui se passe dans ton problème.

J'espère avoir été clair.
François Lafont
francois
Giga-utilisateur
 
Messages: 856
Inscription: Mercredi 20 Septembre 2006, 23:14
Localisation: Antony
Statut actuel: Actif et salarié | Enseignant

Publicité

Messagepar P.Fradin » Mercredi 27 Juin 2007, 08:00

Bonjour,

François a bien répondu à la question, \csname sert à concaténer des caractères pour fabriquer un nom de macro.

Donc quand tu fais \setintervalle{A}{...} par exemple, la macro setintervalle va faire \expandafter\def\csname intervalle#1\endcsname{....} ce qui définit une nouvelle macro appelée \intervalleA (et sans paramètre), exactement comme si on avait fait directement \def\intervalleA.
P.Fradin
 

Précédente

Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Bing [Bot], Google [Bot] et 24 invités