![]() |
| |||
| 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 ? |
| | ||||
| ||||
| |
| |||
| 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 ? |
| |||
| 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 ? |
| |||
| 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' |
| |||
| 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 ? |
| |||
| 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 ? |
| |||
| 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 ? |
| |||
| 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 ? |
| |
| |
![]() |
| Tags: |
| Outils de la discussion | |
| Modes d'affichage | |
| |