# hors d'une macro ?

Tout ce qui concerne le langage LaTeX et ses variantes. Ce langage est supporté sur le forum via les balises tex.

Modérateur : gdm_tex

Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
jeans
Utilisateur confirmé
Utilisateur confirmé
Messages : 40
Inscription : vendredi 24 novembre 2006, 14:44

# hors d'une macro ?

Message par jeans »

Bonsoir,
je repose sous une autre forme une question que j'ai déjà posée. Imaginons la situation suivante:

Un fichier "fic1" dont le contenu serait seulement:
ma #1 est en panne

Une macro definie par:
\newcommand{\test}[1]{\input{fic1}}

Et un fichier fic2 dont le contenu serait (préambules mis à part):
\test{voiture}

Pour moi le résultat à la compilation de fic2 devrait être:
ma voiture est en panne

Il se trouve que ça ne tourne pas. Je vois bien où est le problème. Mais je n'arrive pas à le contourner.
Et je vous asure que ça m'arrangerait vraiment de le contourner
(c'est d'ailleurs pour ça que je me permets de remettre le problème sur le tapis).
J'ai déjà essayé de remplacer # par \# dans fic1, raté.
J'ai aussi essayé d'encadrer le # dans un environnement verbatim, raté encore.
Désormais je m'en remets à votre science. Merci d'avance.

gigiair
Utilisateur chevronné
Utilisateur chevronné
Messages : 2563
Inscription : samedi 08 juillet 2006, 20:56
Localisation : Saint Bonnet Elvert

Message par gigiair »

Une macro n'est pas une procédure passant des paramètres par valeur comme en Pascal.
Je me risque à expliquer sommairement le mécanisme.
La machine TeX reçoit un flot d'unités lexicales (tokens) en entrée. Certains de ces tokens sont «expandables» dont les macros.
La machine LaTeX remplace les macros par le corps pris dans la définition de la macro et les arguments #1 #2 etc. par les tokens suivants pris dans le flot de lecture Le tout est replacé dans le flot de lecture et le processus reprend jusqu'à ce qu'il ne contienne plus aucun token «expandable».
Lorsque la machine TeX rencontre ta macro \test{voiture} , elle insère tout de suite \input fic1 dans le flot d'entrée et essaye de remplacer #1 par voiture. Comme #1 n'y figure pas, c'est vite fait. L'association entre #1 et 'voiture' ne vaut que pour cette expansion là, et ce n'est qu'une association littérale. Il ne faut pas voir #1 comme une variable qui prendrait la valeur 'voiture'.
Après il expanse \input fic1 et remplace le tout par 'ma #1 est en panne'. Mais à ce moment, il n'a rien à substituer à #1 et je pense qu'il doit envoyer un message d'erreur.

C'est comme ça qu'on peut définir une macro qui n'affiche rien du tout:
\newcommand\nafficherien[1]{}
À la compilation,
\nafficherien{Ceci est un très joli texte \en \LaTeX qui ne s'affichera pas}
n'affiche rien.
AMHA, ton problème souffre d'un manque d'analyse. Essaye de mieux le définir.
--
JJR.

jeans
Utilisateur confirmé
Utilisateur confirmé
Messages : 40
Inscription : vendredi 24 novembre 2006, 14:44

Message par jeans »

Je pensais que, lorsqu'il traitait la macro test (avec le paramètre "voiture"),il faisait "\input{fic1}" qu'il remplaçait aussitôt par "ma #1 est en panne".
Alors il rencontrait le #1 qu'il remplaçait par voiture.

Mais si j'ai bien compris ton explication, il procède autrement.

Il remplace, dans son traitement, "\test{voiture}" par "\input{fic1}" et la macro est pour lui terminée.
Il ne garde pas en mémoire qu'il est en train de faire tourner la macro test dont le paramètre 1 est voiture.
Pour lui, la macro test est finie et il l'a oubliée lorsqu'il traite "\input{fic1}". Ce qui explique pourquoi il ne comprend pas le #1 dans fic1.
Je crois que j'ai compris.
Et si c'est bien ça je vais réfléchir l'ensemble autrement, car je me trompais dans le fonctionnement même de la machine Latex.

Je te remercie vraiment pour ta réponse qui éclaircit, pour moi, le fonctionnement interne de Latex.

Peux-tu me confirmer que j'ai bien compris ce que tu m'as expliqué?

gigiair
Utilisateur chevronné
Utilisateur chevronné
Messages : 2563
Inscription : samedi 08 juillet 2006, 20:56
Localisation : Saint Bonnet Elvert

Message par gigiair »

jeans a écrit :
Peux-tu me confirmer que j'ai bien compris ce que tu m'as expliqué?
Je pense que oui, mais tu dois bien savoir.
À ta place, j'écrirais 'ma \bellevariable{} est en panne' dans le fichier fic1, puis je définirais la macro par:

Code : Tout sélectionner

\newcommand{\test}[1]{\def\bellevariable{#1}\input fic1}
\test{voiture}
C'est possible si tu maîtrise le contenu de fic1.
mais je ne me sens pas vraiment un spécialiste du sujet.
--
JJR

jeans
Utilisateur confirmé
Utilisateur confirmé
Messages : 40
Inscription : vendredi 24 novembre 2006, 14:44

Message par jeans »

Ok, je viens de le tester, ça tourne bien.
Et ça va me permettre de faire ce que je voulais.
Tu viens de me donner un bon coup de main.
Merci beaucoup de ton aide.