# hors d'une 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.

# hors d'une macro ?

Messagepar jeans » Dimanche 03 Décembre 2006, 20:51

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.
jeans
Déca-utilisateur
 
Messages: 40
Inscription: Vendredi 24 Novembre 2006, 14:44

Publicité

Messagepar gigiair » Dimanche 03 Décembre 2006, 22:29

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.
gigiair
Exa-utilisateur
 
Messages: 2399
Inscription: Samedi 08 Juillet 2006, 19:56
Localisation: Saint Bonnet Elvert
Statut actuel: Actif et salarié

Messagepar jeans » Lundi 04 Décembre 2006, 00:05

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é?
jeans
Déca-utilisateur
 
Messages: 40
Inscription: Vendredi 24 Novembre 2006, 14:44

Messagepar gigiair » Lundi 04 Décembre 2006, 10:53

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
gigiair
Exa-utilisateur
 
Messages: 2399
Inscription: Samedi 08 Juillet 2006, 19:56
Localisation: Saint Bonnet Elvert
Statut actuel: Actif et salarié

Messagepar jeans » Lundi 04 Décembre 2006, 17:09

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.
jeans
Déca-utilisateur
 
Messages: 40
Inscription: Vendredi 24 Novembre 2006, 14:44


Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: gigiair, Google [Bot] et 34 invités