Stocker des valeurs

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.
evariste_G
Utilisateur chevronné
Utilisateur chevronné
Messages : 1452
Inscription : vendredi 19 décembre 2008, 19:13
Localisation : Bordeaux

Stocker des valeurs

Message 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.
Mathématiques, LaTeX et Python : http://www.mathweb.fr

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

Re: Stocker des valeurs

Message 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}

evariste_G
Utilisateur chevronné
Utilisateur chevronné
Messages : 1452
Inscription : vendredi 19 décembre 2008, 19:13
Localisation : Bordeaux

Re: Stocker des valeurs

Message 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 !
Mathématiques, LaTeX et Python : http://www.mathweb.fr

evariste_G
Utilisateur chevronné
Utilisateur chevronné
Messages : 1452
Inscription : vendredi 19 décembre 2008, 19:13
Localisation : Bordeaux

Re: Stocker des valeurs

Message 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.
Mathématiques, LaTeX et Python : http://www.mathweb.fr

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

Re: Stocker des valeurs

Message 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...

evariste_G
Utilisateur chevronné
Utilisateur chevronné
Messages : 1452
Inscription : vendredi 19 décembre 2008, 19:13
Localisation : Bordeaux

Re: Stocker des valeurs

Message 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}
}
Mathématiques, LaTeX et Python : http://www.mathweb.fr

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

Re: Stocker des valeurs

Message 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...

evariste_G
Utilisateur chevronné
Utilisateur chevronné
Messages : 1452
Inscription : vendredi 19 décembre 2008, 19:13
Localisation : Bordeaux

Re: Stocker des valeurs

Message 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.
Mathématiques, LaTeX et Python : http://www.mathweb.fr