Passer une macro dans Tikz

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.
rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Passer une macro dans Tikz

Message par rebouxo »

Voilà, je ne comprends pas pourquoi j'ai droit à une erreur. Je n'ai pas essayé avec d'autres possibilité de TiKz (enfin, si avec une couleur stockée dans une macro cela fonctionne). Pour moi les deux codes devraient fonctionner (mais je suis un mauvais compilateur TeX), alors que le 2e me mets un '/tikz/turtle/home,fd,lt,fd,rt,f'.

Code : Tout sélectionner

d,rt,fd,lt,fd,' and I am going to ignore it. Perhaps you misspelled it.

See the pgfkeys package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.20 \tikz \draw[turtle={\motif}]

Code : Tout sélectionner

\documentclass[12pt]{article}

\usepackage{tikz}
\usetikzlibrary{turtle}

\begin{document}
\tikz \draw[turtle={home,fd,lt,fd,rt,fd,rt,fd,lt,fd,}] ;

\def\motif{home,fd,lt,fd,rt,fd,rt,fd,lt,fd,}
\tikz \draw[turtle={\motif}] ;

\end{document}
Est-ce qu'il y a une ruse pour passer une macro dans tikz ?
Olivier
A line is a point that went for a walk. Paul Klee.
Par solidarité, pas de MP.

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

Re: Je ne comprends pas le problème

Message par pg »

C'est juste un problème de développement. Il y a peut-être mieux, mais une solution de contournement est de mettre toute l'instruction dans une macro développée avec edef :

Code : Tout sélectionner

\documentclass[12pt]{article}

\usepackage{tikz}
\usetikzlibrary{turtle}

\begin{document}
\tikz \draw[turtle={home,fd,lt,fd,rt,fd,rt,fd,lt,fd,}] ;

\def\motif{home,fd,lt,fd,rt,fd,rt,fd,lt,fd,}
\edef\macro{\noexpand\tikz \noexpand\draw[turtle={\motif}] ;}
\macro

\end{document}
Le \noexpand dit à TeX que l'on veut garder \tikz comme \tikz et \draw comme \draw, mais le \edef va avoir pour effet de remplacer \motif par sa définition, à savoir, "home,fd,lt,fd,rt,fd,rt,fd,lt,fd,"

rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Re: Je ne comprends pas le problème

Message par rebouxo »

Merci pg, j'avais bien pensé à mettre un edef (merci à Christian pour son bouquin), mais le \noexpand c'est nouveau pour moi. Enfin je l'ai déjà vu, mais sans me pencher sur fonctionnement.

Merci.

Bon, cela dit mon vrai problème n'est pas réellement celui-là. Mon vrai problème est de représenter une chaîne de caractères, ne contenant que des A, des D et des G, en instructions pour que tikz (via turtle) puisse comprendre. Et cette chaîne sera elle-même générer par un procédé (les A sont remplacés par AGADADAGA, ou autre chose). J'ai donc pensé à xstring, et tout marche, sauf que tikz n'affiche rien (pas d'erreur, mais pas de dessin).

Voilà mon code :

Code : Tout sélectionner

\documentclass[12pt]{article}

\usepackage{tikz}
\usetikzlibrary{turtle}
\usepackage{xstring}
\begin{document}

\def\motifa{home,fd,lt,fd,rt,fd,rt,fd,lt,fd,}

\def\motif{AGADADAGA}
\StrSubstitute{\motif}{A}{fd,}[\motif]
\StrSubstitute{\motif}{D}{rt,}[\motif]
\StrSubstitute{\motif}{G}{lt,}[\motif]

\edef\foo{\noexpand\draw[turtle={\motif}] ;}
\edef\bar{\noexpand\draw[turtle={\motifa}] ;}

\begin{tikzpicture}
  \foo
  \bar
\end{tikzpicture}

\end{document}

\foo n'est pas affiché, mais \bar l'est. Comme xstring fait des choses très TeXniques, bien au delà de mes capacités, est-ce que quelqu'un à une idée ?
Olivier
A line is a point that went for a walk. Paul Klee.
Par solidarité, pas de MP.

un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 792
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Je ne comprends pas le problème

Message par un bon petit »

rebouxo a écrit :\foo n'est pas affiché, mais \bar l'est. Comme xstring fait des choses très TeXniques, bien au delà de mes capacités, est-ce que quelqu'un à une idée ?
Je n'avais aucune idée, mais en débogage (ou quand on n'y comprend rien), il faut toujours penser à se servir de \show ou \meaning. Ce sont les primitives (avec l'indispensable \showtokens) que j'utilise le plus souvent, et de très loin, lorsque j'écris une macro ou un package.

Ici, comparer \show\foo et \show\bar montre qu'il manque le "home" au début de \foo. Il faut donc le rajouter lors du \edef, par exemple :

Code : Tout sélectionner

\edef\foo{\noexpand\draw[turtle=home,\motif] ;}

rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Re: Je ne comprends pas le problème

Message par rebouxo »

P****n quel c**.
Alors, là je suis ridicule.

Merci Christian. On devrait toujours chercher les choses simples avant les choses compliqués.

Olivier
A line is a point that went for a walk. Paul Klee.
Par solidarité, pas de MP.