Page 1 sur 1

Stocker des valeurs

MessagePosté: Lundi 02 Mai 2011, 20:01
par evariste_G
Bonjour.

J'aimerais créer une commande de la forme :

Code: Tout sélectionner
\valeurs{valX1/valY1,valX2/valY2,...,valXn/valYn}


où valXi est une valeur associé à la valeur valYi, pour i allant de 1 à n, et où la commande aurait pour objectif de garder toutes les valeurs en stock.
Le but final serait de pouvoir les utiliser ultérieurement dans d'autres commandes (par exemple, pour construire un tableau de valeur, construire un nuage de point, trouver les coordonnées du point moyen, etc.).

Existe-t-il un moyen de faire ça sans faire appel à un fichier externe ?
Merci d'avance.

Re: Stocker des valeurs

MessagePosté: Lundi 02 Mai 2011, 20:34
par un bon petit
evariste_G a écrit:Existe-t-il un moyen de faire ça sans faire appel à un fichier externe ?

Évidemment :
Code: Tout sélectionner
\documentclass{minimal}
\makeatletter
\newcount\val@cnt
\newcommand*\valeurs[1]{\val@cnt\z@\valeurs@#1,\valeurs@/\valeurs@,}
\def\valeurs@#1/#2,{%
   \ifx\valeurs@#1%
   \else
      \advance\val@cnt\@ne
      \@namedef{ValX\number\val@cnt}{#1}%
      \@namedef{ValY\number\val@cnt}{#2}%
      \expandafter\valeurs@
   \fi
}
\newcommand*\ValX[1]{\@nameuse{ValX#1}}
\newcommand*\ValY[1]{\@nameuse{ValY#1}}
\makeatother
\begin{document}
\valeurs{3/4,10/11,-5/-4,6/0,9/7,-1/-1,6/100,15/1,10/11,99/100,-10/-11}
x1 = \ValX{1} et y1 = \ValY{1}

x3 = \ValX{3} et y3 = \ValY{3}

x10=\ValX{10} et y10 = \ValY{10}
\end{document}

Re: Stocker des valeurs

MessagePosté: Mardi 03 Mai 2011, 10:59
par evariste_G
Mais que suis-je bête ! :D C'était en effet évident :wink: Non, sans blague, je n'ai pas ta culture Texienne (malheureusement !). Merci beaucoup !

Re: Stocker des valeurs

MessagePosté: Vendredi 06 Mai 2011, 12:26
par evariste_G
Bonjour.
Je continue ce fil juste pour poser une question sur le code ... Comment peut-on remettre à zéro le compteur ? J'ai recherché sur le net, mais n'ai rien trouvé ...

Merci d'avance.

Re: Stocker des valeurs

MessagePosté: Vendredi 06 Mai 2011, 15:23
par un bon petit
evariste_G a écrit:Je continue ce fil juste pour poser une question sur le code ... Comment peut-on remettre à zéro le compteur ? J'ai recherché sur le net, mais n'ai rien trouvé ...

Sur le net ??? Mais encore heureux que tu n'aies rien trouvé : cette macro est de moi, je l'ai inventée lorsque tu en as fait la demande, je ne l'ai pompée nulle part ailleurs. Il me semble donc tout à fait normal que tu ne trouves rien.

Quant à ta question, je ne comprends pas ce que tu veux, ce compteur est remis à zéro à chaque appel de la macro valeurs avec "\val@cnt\z@" donc je ne vois pas de quelle remise à zéro tu parles...

Re: Stocker des valeurs

MessagePosté: Vendredi 06 Mai 2011, 17:21
par evariste_G
un bon petit a écrit:Sur le net ??? Mais encore heureux que tu n'aies rien trouvé : cette macro est de moi, je l'ai inventée lorsque tu en as fait la demande, je ne l'ai pompée nulle part ailleurs. Il me semble donc tout à fait normal que tu ne trouves rien.


Je n'ai pas voulu supposer que tu avais chercher cette macro ailleurs, je me doute bien que tu es capable de la faire toi-même. Je voulais dire que j'avais chercher à savoir comment remettre à zéro le compteur.

un bon petit a écrit:Quant à ta question, je ne comprends pas ce que tu veux, ce compteur est remis à zéro à chaque appel de la macro valeurs avec "\val@cnt\z@" donc je ne vois pas de quelle remise à zéro tu parles...


Je me doutais que "\val@cnt\z@" remettait à zéro le compteur mais le problème est que lorsque j'appelle deux fois la macro, il y a un soucis. Il faut dire aussi que j'ai ajouté des choses. Le code suivant me dit qu'il y a une erreur concernant le nombre de colonnes des tableaux construits avec la commande "\tabval".

Code: Tout sélectionner
\valeurs{0/102.3,1/105.6}
\tabval{Rangs $x_i$/Valeurs $y_i$}

\valeurs{0/102.3,1/105.6,2/109.5}
\tabval{Rangs $x_i$/Valeurs $y_i$}


Sachant que la commande "\tabval" est définie ainsi :

Code: Tout sélectionner
\newcommand*\eaddto[2]{%
   \edef\tmp{#2}%
   \expandafter\addto
   \expandafter#1%
   \expandafter{\tmp}%
}

\newcommand*\tabval[2]{%
\begin{tabular}{||l||*{\val@cnt}{c|}|}
      \hline #1
      \multido{\i=1+1}{\val@cnt}
      {%
         \eaddto\ligneX{&\noexpand\ValX{\i}}
      }
      \ligneX \\
      \hline #2
      \multido{\i=1+1}{\val@cnt}
      {%
         \eaddto\ligneY{&\noexpand\ValY{\i}}
      }
      \ligneY \\
      \hline
     \end{tabular}
}

Re: Stocker des valeurs

MessagePosté: Vendredi 06 Mai 2011, 20:28
par un bon petit
evariste_G a écrit:Sachant que la commande "\tabval" est définie ainsi :

Serait-il possible d'avoir un ECM ? Comment faire pour voir une dysfonctionnement et le corriger si on n'a qu'un morceau du code et donc qu'on ne peut pas compiler ?

Sinon, à tout hasard, je dirais de mettre un \global devant l'assignation du compteur à 0 et devant le \advance...

Re: Stocker des valeurs

MessagePosté: Samedi 07 Mai 2011, 08:01
par evariste_G
Pour l'ECM, désolé mais comme tout était dans un package, je pensais qu'en donnant simplement les macro incriminées, cela suffisait (vu que le problème porte sur le nombre de colonnes des tableaux construits).

Donc j'ai tout mis dans un fichier TEX :

Code: Tout sélectionner
\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage[frenchb]{babel}
\usepackage{fp,multido}
\makeatletter
\global\newcount\val@cnt
\newcommand*\valeurs{\@ifstar{\valter}{\valbis}}
\newcommand*\valbis[1]{\val@cnt\z@\valeurs@#1,\valeurs@/\valeurs@,}
\def\valeurs@#1/#2,{%
   \ifx\valeurs@#1%
   \else
      \global\advance\val@cnt\@ne
      \@namedef{ValX\number\val@cnt}{#1}%
      \@namedef{ValY\number\val@cnt}{#2}%
      \expandafter\valeurs@
   \fi
}
\newcommand*\valter[1]{\val@cnt\z@\valeurst@#1,\valeurst@/\valeurst@/\valeurst@,}
\def\valeurst@#1/#2/#3,{%
   \ifx\valeurst@#1%
   \else
      \global\advance\val@cnt\@ne
     \@namedef{Val\number\val@cnt}{#1}%
      \@namedef{ValX\number\val@cnt}{#2}%
      \@namedef{ValY\number\val@cnt}{#3}%
      \expandafter\valeurst@
   \fi
}
\newcommand*\ValX[1]{\@nameuse{ValX#1}}
\newcommand*\ValY[1]{\@nameuse{ValY#1}}
\newcommand*\Val[1]{\@nameuse{Val#1}}

% <------------------------------- Construction du tableau des valeurs ----------------------------------->
\newcommand*\eaddto[2]{%
   \edef\tmp{#2}%
   \expandafter\addto
   \expandafter#1%
   \expandafter{\tmp}%
}

\newcount\tabvalb@cnt
\def\ligne{}
\def\ligneX{}
\def\ligneY{}

\newcommand*\tabval{\@ifstar{\tabvalter}{\tabvalbis}}

\newcommand*\tabvalbis[1]{\tabvalb@cnt\z@\tabvalbis@#1,\tabvalbis@/\tabvalbis@,}
\def\tabvalbis@#1/#2,{%
   \ifx\tabvalbis@#1%
   \else
     \tabvalb{#1}{#2}
      \expandafter\tabvalbis@
   \fi
}
\newcommand*\tabvalter[1]{\tabvalb@cnt\z@\tabvalter@#1,\tabvalter@/\tabvalter@/\tabvalter@,}
\def\tabvalter@#1/#2/#3,{%
   \ifx\tabvalter@#1%
   \else
     \tabvalt{#1}{#2}{#3}
      \expandafter\tabvalter@
   \fi
}

\newcommand*\tabvalb[2]
{%
   \begin{tabular}{||l||*{\val@cnt}{c|}|}
      \hline #1
      \multido{\i=1+1}{\val@cnt}
      {%
         \eaddto\ligneX{&\noexpand\ValX{\i}}
      }
      \ligneX \\
      \hline #2
      \multido{\i=1+1}{\val@cnt}
      {%
         \eaddto\ligneY{&\noexpand\ValY{\i}}
      }
      \ligneY \\
      \hline
     \end{tabular}
}

\newcommand*\tabvalt[3]
{%
   \begin{tabular}{||l||*{\val@cnt}{c|}|}
      \hline #1
      \multido{\i=1+1}{\val@cnt}
      {%
         \eaddto\ligne{&\noexpand\Val{\i}}
      }
      \ligne \\
      \hline #2
      \multido{\i=1+1}{\val@cnt}
      {%
         \eaddto\ligneX{&\noexpand\ValX{\i}}
      }
      \ligneX \\
      \hline #3
      \multido{\i=1+1}{\val@cnt}
      {%
         \eaddto\ligneY{&\noexpand\ValY{\i}}
      }
      \ligneY \\
      \hline
     \end{tabular}
}

\makeatother
\begin{document}
\valeurs{0/102.3,1/105.6}
\tabval{Rangs $x_i$/Valeurs $y_i$}

\valeurs*{2005/0/102.3,2006/1/105.6,2007/2/109.5}
\tabval*{Années/Rangs $x_i$/Valeurs $y_i$}
\end{document}


Voilà le code. J'y ai mis le "\global", mais cela ne change rien malheureusement.