Niouzes.org  

Précédent   Niouzes.org > Forum > Newsgroup fr.comp.* Forum > Newsgroup fr.comp.text.tex
S'inscrire FAQ Membres Calendrier Recherche Messages du jour Marquer les forums comme lus



Réponse

 

LinkBack Outils de la discussion Modes d'affichage
  #1 (permalink)  
Vieux 28/09/2008, 18h17
Julien Salort
 
Messages: n/a
Par défaut PGFplots et foreach

Bonjour,

Je n'arrive pas Ã*** utiliser \foreach (du paquet pgffor) avec pgfplots.
Voici un ECM :
-----------------------
\documentclass{article}
\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
\begin{axis}
\foreach \x in {1,...,5}
{
\addplot+[only marks] coordinates {
(\x,0)
};
\addlegendentry{Data \x}
}
\end{axis}
\end{tikzpicture}

\end{document}
--------------------------

Il me renvoie un Undefined control sequence Ã*** propos de \x au niveau du
addlegendenty et je ne comprends pas pourquoi...

--
R: Parce que ça renverse bêtement l'ordre naturel de lecture !
Q: Mais pourquoi citer en fin d'article est-il si effroyable ?
R: Citer en fin d'article.
Q: Quelle est la chose la plus désagréable sur les groupes de news ?
Réponse avec citation
Alt Today
Advertising
Google Adsense
 
This advertising will not be shown
in this way to registered members.
Register your free account today
and become a member on
Niouzes.org
Standard Sponsored Links

  #2 (permalink)  
Vieux 29/09/2008, 10h04
Julien Salort
 
Messages: n/a
Par défaut Re: PGFplots et foreach

Paul Gaborit <Paul.Gaborit***invalid.invalid> writes:

> Peut-être parce que pgfplots utilise \foreach (et les commandes
> internes associées) de manière intensive et en particulier pour
> traiter les légendes... Un bug Ã*** remonter Ã*** l'auteur.


J'ai contacté l'auteur. Voici sa réponse (publiée ici avec son
autorisation) :

-8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<-
The problem occuring in your code snippet is related to the time when
the foreach statement is executed and when the legend is actually
generated.

I don't know if you are interested in details, but they may give a small
insight into TeX's way of working which may be interesting:

The \foreach loop runs and calls \addlegendentry. This results in
*exactly* the same as if you had written \legend{Data \x,Data \x,Data
\x,Data \x,Data \x} because '\addlegendentry' does not (and cannot)
expand '\x' directly. In needs to wait until the legend is actually
typeset, and that is done after the last \addplot command. Until then,
the foreach loop has been terminated and '\x' is no longer defined,
resulting in your error message.

The only possible solution to this problem is to provide an argument to
\addlegendentry which is already expanded and does not contain '\x'.
TeX provides the command \expandafter to do so. It looks like this:

\begin{tikzpicture}
\begin{axis}
\foreach \x in {1,...,5}
{
\addplot+[only marks] coordinates {
(\x,0)
};
\edef\aTemporaryVariable{Data \x}
% \message{The value is now '\meaning\aTemporaryVariable'}
\expandafter\addlegendentry\expandafter{\aTemporar yVariable}
}
\end{axis}
\end{tikzpicture}

The '\edef' is a TeX primitive which means "expanded definition". The
result is 'Data 1', for example (as can be seen by the commented
message). The \expandafter construction does the following: the first
expandafter keeps the \addlegendentry intact, and expands the "token"
after \addlegendentry. That is another \expandafter. This one leaves the
brace '{' intact and expands the following token, which is the temporary
containing 'Data 1'. Then, the expandafters are removed from TeX's
command list and the next command is '\addlegendentry{Data 1}'.
-8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<-

Traduction approximative pour ceux qui ne seraient pas Ã*** l'aise avec la
langue de Shakespeare :

La boucle \foreach tourne et appelle \addlegendentry. Le résultat est
exactement le même que si l'on avait écrit \legend{Data \x, Data \x,
Data \x, Data \x} parce que \addlegendentry ne développe pas (et ne peut
pas développer) \x directement. Il doit attendre jusqu'Ã*** ce que la
légende soit vraiment mise en forme, et cela n'est fait qu'après le
dernier \addplot. Avant cela, la boucle \foreach est arrivée Ã*** safin et
\x n'est plus défini.

Une solution est de fournir Ã*** \addlegendentry un argument déjÃ***
développé.

--
R: Parce que ça renverse bêtement l'ordre naturel de lecture !
Q: Mais pourquoi citer en fin d'article est-il si effroyable ?
R: Citer en fin d'article.
Q: Quelle est la chose la plus désagréable sur les groupes de news ?
Réponse avec citation
  #3 (permalink)  
Vieux 29/09/2008, 10h26
Julien Salort
 
Messages: n/a
Par défaut Re: PGFplots et foreach

Julien Salort <lists***juliensalort.org> writes:

> La boucle \foreach tourne et appelle \addlegendentry. Le résultatest
> exactement le même que si l'on avait écrit \legend{Data \x, Data \x,
> Data \x, Data \x} parce que \addlegendentry ne développe pas (et ne peut
> pas développer) \x directement. Il doit attendre jusqu'Ã*** ce que la
> légende soit vraiment mise en forme, et cela n'est fait qu'après le
> dernier \addplot. Avant cela, la boucle \foreach est arrivée Ã*** sa fin et
> \x n'est plus défini.


J'ai une question subsidiaire. J'essaie maintenant d'utiliser la même
méthode pour changer la couleur dans la boucle :

-8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<-
\documentclass{article}
\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
\begin{axis}
\foreach \x in {1,...,5}
{
\edef\Couleur{blue!20*\x!cyan}
\expandafter\addplot\expandafter[mark=*, mark options=\expandafter{%
draw=blue!90!black, fill=\Couleur}] coordinates { (\x,0) };
}
\end{axis}
\end{tikzpicture}

\end{document}
-8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<-

Ma compréhension du \expandafter est visiblement insuffisante...
Est-ce qu'une âme charitable veut bien m'expliquer pourquoi l'ECM
ci-dessus ne marche pas ?

--
R: Parce que ça renverse bêtement l'ordre naturel de lecture !
Q: Mais pourquoi citer en fin d'article est-il si effroyable ?
R: Citer en fin d'article.
Q: Quelle est la chose la plus désagréable sur les groupes de news ?
Réponse avec citation
  #4 (permalink)  
Vieux 29/09/2008, 13h55
Jose Grimm
 
Messages: n/a
Par défaut Re: PGFplots et foreach

Julien Salort wrote:
> Julien Salort <lists***juliensalort.org> writes:
>
>> La boucle \foreach tourne et appelle \addlegendentry. Le résultat est
>> exactement le même que si l'on avait écrit \legend{Data \x, Data \x,
>> Data \x, Data \x} parce que \addlegendentry ne développe pas (et ne peut
>> pas développer) \x directement. Il doit attendre jusqu'Ã*** ce que la
>> légende soit vraiment mise en forme, et cela n'est fait qu'après le
>> dernier \addplot. Avant cela, la boucle \foreach est arrivée Ã*** sa fin et
>> \x n'est plus défini.

>
> J'ai une question subsidiaire. J'essaie maintenant d'utiliser la même
> méthode pour changer la couleur dans la boucle :
>
> -8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<-
> \documentclass{article}
> \usepackage{pgfplots}
>
> \begin{document}
>
> \begin{tikzpicture}
> \begin{axis}
> \foreach \x in {1,...,5}
> {
> \edef\Couleur{blue!20*\x!cyan}
> \expandafter\addplot\expandafter[mark=*, mark options=\expandafter{%
> draw=blue!90!black, fill=\Couleur}] coordinates { (\x,0) };
> }
> \end{axis}
> \end{tikzpicture}
>
> \end{document}
> -8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<-
>
> Ma compréhension du \expandafter est visiblement insuffisante...
> Est-ce qu'une âme charitable veut bien m'expliquer pourquoi l'ECM
> ci-dessus ne marche pas ?
>

il faut mettre un \expandafter devant chaque token (commande ou
caractère) entre le \addplot et le \Couleur.
Un truc du genre :

\expandafter\addplot\expandafter[\expandafter m\expandafter
a\expandafter r\expandafter k=\expandafter*
\expandafter,\expandafter m\expandafter a\expandafter r\expandafter
k\expandafter
(il y a de l'ordre de 50 \expandafter qui se suivent)
\expandafter=\Couleur}]...

C'est peut-etre plus simple de dire
\foreach \x in {1,...,5}{
\edef\tmp{\noexpand\addplot{[mark=*, mark options=draw=blue!90!black,
fill=blue!20*\x!cyan] coordinates { (\noexpand\x,0) }};
\tmp}

On met des \noexpand devant les commandes qu'il ne faut pas développer
de suite.

Jose'



Réponse avec citation
  #5 (permalink)  
Vieux 29/09/2008, 17h01
Julien Salort
 
Messages: n/a
Par défaut Re: PGFplots et foreach

Paul Gaborit <Paul.Gaborit***invalid.invalid> writes:

> Ce qui donne un truc du genre (en utilisant \xglobal\colorlet pour
> définir globalement le nom de chacune des couleurs et \pgfmathsetmacro
> pour calculer le dégradé car les calculs ne sont pas reconnus par
> xcolor) :


Ça marche très bien !
(même si je comprends pas complètement tout)
Merci !

Par contre, si \x varie de 1 Ã*** 6 au lieu de 1 Ã*** 5, la légende devient
bizarreÂ***:

\documentclass{article}
\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
\begin{axis}
\foreach \x in {1,...,6}
{
\pgfmathsetmacro{\ppp}{16.66*\x}
\xglobal\colorlet{couleur \x}{blue!\ppp!cyan}
\edef\tmp{\noexpand\addplot+[%
only marks,
mark options={draw=blue!50!black,fill=couleur \x}]
coordinates { (\noexpand\x,\noexpand\x) };
}
\tmp
\edef\Legende{Data \x}
\expandafter\addlegendentry\expandafter{\Legende}
}
\end{axis}
\end{tikzpicture}

\end{document}

Par bizarre, j'entendsÂ***:
1/ le cadre qui se met tout seul en pointillés
2/ les 5 premiers items de la légende ont un mauvais dessin

--
R: Parce que ça renverse bêtement l'ordre naturel de lecture !
Q: Mais pourquoi citer en fin d'article est-il si effroyable ?
R: Citer en fin d'article.
Q: Quelle est la chose la plus désagréable sur les groupes de news ?
Réponse avec citation
  #6 (permalink)  
Vieux 29/09/2008, 18h07
Julien Salort
 
Messages: n/a
Par défaut Re: PGFplots et foreach

Alain Matthes <alain.matthes***nofree.fr> writes:

> avec le code ci-dessous, cela passe très bien (il me semble) et
> il y a un peu moins de \noexpand en revanche il faut un moteur
> avec eTeX mais de nos jours ...


Chez moi, ça donne le même résultat qu'avec la version sans le
\protected***edef, c'est-Ã***-dire légende tout en pointillé...
Ça donne l'impression que ça vient du dernier marqueur (qui est en
pointillé) et que du coup, il dessine tout en pointillé...

Sinon, ça fait quoi exactement \protected***edef ?

--
R: Parce que ça renverse bêtement l'ordre naturel de lecture !
Q: Mais pourquoi citer en fin d'article est-il si effroyable ?
R: Citer en fin d'article.
Q: Quelle est la chose la plus désagréable sur les groupes de news ?
Réponse avec citation
  #7 (permalink)  
Vieux 29/09/2008, 20h03
Julien Salort
 
Messages: n/a
Par défaut Re: PGFplots et foreach

Alain Matthes <alain.matthes***nofree.fr> writes:

> Moi j'ai bien une différence entre les deux codes


C'est parce que tu as mis mark=* dans la version avec \protected***edef et
only marks dans le code sans \protected***edef. Si je mets "only marks"
partout, j'obtiens le même résultat avec les deux codesÂ***:

\documentclass{article}
\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
\begin{axis}
\makeatletter
\foreach \x in {1,...,6}
{
\pgfmathsetmacro{\ppp}{16.66*\x}
\protected***edef\tmp{\noexpand\addplot+[%
only marks,
mark options={draw=blue!90!black,fill=blue!\ppp!cyan}]
coordinates { (\x,\x) };
\noexpand\addlegendentry{Data \x}}
\tmp
}
\makeatother
\end{axis}
\end{tikzpicture}

\begin{tikzpicture}
\begin{axis}
\foreach \x in {1,...,6}
{
\pgfmathsetmacro{\ppp}{16.66*\x}
\xglobal\colorlet{couleur \x}{blue!\ppp!cyan}
\edef\tmp{\noexpand\addplot+[%
only marks,
mark options={draw=blue!50!black,fill=couleur \x}]
coordinates { (\noexpand\x,\noexpand\x) };
}
\tmp
\edef\Legende{Data \x}
\expandafter\addlegendentry\expandafter{\Legende}
}
\end{axis}
\end{tikzpicture}
\end{document}

--
R: Parce que ça renverse bêtement l'ordre naturel de lecture !
Q: Mais pourquoi citer en fin d'article est-il si effroyable ?
R: Citer en fin d'article.
Q: Quelle est la chose la plus désagréable sur les groupes de news ?
Réponse avec citation
  #8 (permalink)  
Vieux 30/09/2008, 12h39
Julien Salort
 
Messages: n/a
Par défaut Mettre Ã*** jour TeXLive (was: Re: PGFplots etforeach)

Bonjour,

J'ai contacté l'auteur Ã*** propos de ce problème de légende qui apparaît
de façon incorrecte. Il m'a répondu qu'il s'agissait, en effet, d'un bug
mais que ce bug est d'ores et déjÃ*** corrigé sur la version CVS de
pgfplots.

Questions:
est-ce qu'il est possible de mettre Ã*** jour pgfplots avec le nouvel outil
de mise Ã*** jour de TeXLive, tlmgr ?
ou bien, est-ce que je dois nécessairement télécharger la dernière
version de pgfplots depuis le CVS ?

Quelle est la fréquence de mise Ã*** jour des paquets accessiblesdepuis
tlmgr ?

Peut-on savoir facilement, Ã*** la ligne de commande par exemple, quelle
est la version actuellement installée d'un paquet ?

--
R: Parce que ça renverse bêtement l'ordre naturel de lecture !
Q: Mais pourquoi citer en fin d'article est-il si effroyable ?
R: Citer en fin d'article.
Q: Quelle est la chose la plus désagréable sur les groupes de news ?
Réponse avec citation
 
Réponse
Tags:



Outils de la discussion
Modes d'affichage

Règles de messages
Vous pouvez ouvrir de nouvelles discussions : nonoui
Vous pouvez envoyer des réponses : nonoui
Vous pouvez insérer des pièces jointes : nonoui
Vous pouvez modifier vos messages : nonoui

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui



Fuseau horaire GMT. Il est actuellement 00h33.

Italiano - German - English - Español


Édité par : vBulletin® version 3.6.8
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO 3.1.0 © 2007, Crawlability, Inc. Tous droits réservés.
Version française #13 par l'association vBulletin francophone


Politique - Droit - Philosophie - Football - Medicine - Française - Bricolage - Photo - Mac Os X - Divers - Physique - Jardinage
Mecanique - Moto - Photographie - Rail - Route - Aviation - Cinema - Linux - Psychanalyse - Finance - Enigmes - Rugby
Environnement - Histoire - Programmes TV - Education - Travail - Voyages - Windows - Immobilier - Cuisine
Windows XP - Excel - Word - Outlook - Access - Internet Explorer - Office - Vista

Page generated in 0,45294 seconds with 10 queries