[Résolu] Une macro avec des "@"

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.

[Résolu] Une macro avec des "@"

Messagepar evariste_G » Vendredi 07 Septembre 2018, 09:30

Bonjour à vous.
Le titre de ce topic n'est pas explicite car mon problème est complexe à expliquer en quelques mots.

Je construis un package dans lequel je définis beaucoup de couleurs sous la forme :

Code: Tout sélectionner
\newcommand{\monpackage@defn@title@txtcolor}{white}


À la place de "defn", "title" et "txtcolor" il peut y avoir d'autres termes (soit dit en passant, j'ai utilisé \newcommand, mais je n'ai rien contre \def, \edef, etc.).

J'aimerais écrire une macro de la forme :

Code: Tout sélectionner
\redefinecolor{mot1}{mot2}{mot3}{red}


qui permet de changer la couleur définie par \monpackage@mot1@mot2@mot3.
Là, ça touche TeX et j'atteins mes limites...

Quelqu'un aurait-il une proposition à me faire ?
Dernière édition par evariste_G le Samedi 08 Septembre 2018, 12:30, édité 1 fois.
evariste_G
Téra-utilisateur
 
Messages: 1405
Inscription: Vendredi 19 Décembre 2008, 19:13
Localisation: Bordeaux
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Une macro avec des "@"

Messagepar rebouxo » Vendredi 07 Septembre 2018, 13:29

\newcommand fait un certains nombres de chose dont vérifier que la commande existe. Mais à part cela c'est du \def...

Bon est-ce que \renewcommand ne fonctionne pas ?
Où sinon un bon de \gdef (\global def, sinon le \def est local au groupe).

Bon, Christian va bien passer par ici.

Olivier
Cela dit, le titre n'a rien à voir avec les @.
A line is a point that went for a walk. Paul Klee
Par solidarité, pas de MP
rebouxo
Modérateur
 
Messages: 6897
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Re: Une macro avec des "@"

Messagepar evariste_G » Vendredi 07 Septembre 2018, 15:55

rebouxo a écrit:\newcommand fait un certains nombres de chose dont vérifier que la commande existe. Mais à part cela c'est du \def...

Bon est-ce que \renewcommand ne fonctionne pas ?
Où sinon un bon de \gdef (\global def, sinon le \def est local au groupe).

Bon, Christian va bien passer par ici.

Olivier
Cela dit, le titre n'a rien à voir avec les @.


Alors, première chose, quand je définis ma commande ainsi :

Code: Tout sélectionner
\newcommand{\redefinecolor}[4]{\renewcommand{\monpackage@#1@#2@#3}{#4}}


ça ne fonctionne bien entendu pas (ça serait trop simple). Et c'est justement à cause des "@" je pense (d'où le titre :)).
Je pense qu'il y a un truc d'expert à faire...
evariste_G
Téra-utilisateur
 
Messages: 1405
Inscription: Vendredi 19 Décembre 2008, 19:13
Localisation: Bordeaux
Statut actuel: Actif et salarié | Enseignant

Re: Une macro avec des "@"

Messagepar OG » Vendredi 07 Septembre 2018, 16:09

Bonjour

Il ne faut pas oublier le couple \makeatletter {madéfinition} \makeatother.
Je ne suis pas sorcier, mais c'est une histoire de catcode, le caractère @ étant réservé pour éviter de redéfinir impunément (ou sans le savoir) des commandes internes...

Par rapport au but recherché je ne suis pas sûr que cela fonctionne.

O.G.
OG
Modérateur
 
Messages: 2261
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: Une macro avec des "@"

Messagepar evariste_G » Vendredi 07 Septembre 2018, 16:33

Comme tout ceci est dans une extension, il est inutile de préciser \makeatletter :)
evariste_G
Téra-utilisateur
 
Messages: 1405
Inscription: Vendredi 19 Décembre 2008, 19:13
Localisation: Bordeaux
Statut actuel: Actif et salarié | Enseignant

Re: Une macro avec des "@"

Messagepar un bon petit » Vendredi 07 Septembre 2018, 20:54

Code: Tout sélectionner
\def\redefinecolor#1#2#3#{\expandafter\def\csname monpackage@#1@#2@#3\endcsname}
un bon petit
Giga-utilisateur
 
Messages: 684
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: Une macro avec des "@"

Messagepar rebouxo » Samedi 08 Septembre 2018, 10:07

Je pense que le \renewcommand fonctionne, mais il est dans un groupe, la redéfinition est reste locale au groupe.
Cela n'a à mon avis rien avoir avec les @.

Olivier
A line is a point that went for a walk. Paul Klee
Par solidarité, pas de MP
rebouxo
Modérateur
 
Messages: 6897
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Re: Une macro avec des "@"

Messagepar evariste_G » Samedi 08 Septembre 2018, 12:28

un bon petit a écrit:
Code: Tout sélectionner
\def\redefinecolor#1#2#3#{\expandafter\def\csname monpackage@#1@#2@#3\endcsname}


En l'état, cela ne fonctionne pas. En revanche, ceci fonctionne :

Code: Tout sélectionner
\def\redefinecolor#1#2#3#4{\expandafter\renewcommand\csname teach@#1@#2@#3\endcsname{#4}}


Merci. Je me doutais qu'il y avait une histoire de \expandafter, mais je n'avais pas pensé au \csname.
evariste_G
Téra-utilisateur
 
Messages: 1405
Inscription: Vendredi 19 Décembre 2008, 19:13
Localisation: Bordeaux
Statut actuel: Actif et salarié | Enseignant

Re: Une macro avec des "@"

Messagepar evariste_G » Samedi 08 Septembre 2018, 12:30

rebouxo a écrit:Je pense que le \renewcommand fonctionne, mais il est dans un groupe, la redéfinition est reste locale au groupe.
Cela n'a à mon avis rien avoir avec les @.

Olivier


Il est fort possible que les "@" ne soient pas à l'origine de mes difficultés en effet, mais je ne savais pas comment intituler le topic :)
evariste_G
Téra-utilisateur
 
Messages: 1405
Inscription: Vendredi 19 Décembre 2008, 19:13
Localisation: Bordeaux
Statut actuel: Actif et salarié | Enseignant

Re: Une macro avec des "@"

Messagepar un bon petit » Samedi 08 Septembre 2018, 19:23

evariste_G a écrit:
un bon petit a écrit:
Code: Tout sélectionner
\def\redefinecolor#1#2#3#{\expandafter\def\csname monpackage@#1@#2@#3\endcsname}

En l'état, cela ne fonctionne pas.

Je suis désolé, mais cela doit fonctionner. Le message d'erreur émis à la compilation aurait été le bienvenu.

evariste_G a écrit: En revanche, ceci fonctionne :
Code: Tout sélectionner
\def\redefinecolor#1#2#3#4{\expandafter\renewcommand\csname teach@#1@#2@#3\endcsname{#4}}

Ce code est (presque) équivalent à celui qui se trouve au dessus. Il y a juste \renewcommand au lieu de \def et «teach» au lieu de «monpackage» et la lecture prématurée de l'argument #4 qui n'a pas lieu avec ma proposition. Donc si ce code fonctionne, le mien doit fonctionner aussi.
un bon petit
Giga-utilisateur
 
Messages: 684
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant


Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Google [Bot], Google Adsense [Bot], Grapeshot [Crawler] et 24 invités