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.
# hors d'une macro ?
-
- Utilisateur chevronné
- Messages : 2804
- Inscription : samedi 08 juillet 2006, 20:56
- Localisation : Saint Bonnet Elvert
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.
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.
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é?
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é?
-
- Utilisateur chevronné
- Messages : 2804
- Inscription : samedi 08 juillet 2006, 20:56
- Localisation : Saint Bonnet Elvert
Je pense que oui, mais tu dois bien savoir.jeans a écrit :
Peux-tu me confirmer que j'ai bien compris ce que tu m'as expliqué?
À 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}
mais je ne me sens pas vraiment un spécialiste du sujet.
--
JJR
-
- Sujets similaires
- Réponses
- Vues
- Dernier message