Tabular et multido

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.
Mikelenain
Utilisateur chevronné
Utilisateur chevronné
Messages : 2656
Inscription : dimanche 28 février 2010, 11:54
Localisation : Région Lyonnaise

Re: [Résolu] Tabular et multido

Message par Mikelenain »

un bon petit a écrit :
Mikelenain a écrit :Voilà la solution avec un tableau ET un diagramme en bâtons, gérés dynamiquement
Sans vouloir être désagréable, ce n'est pas « géré dynamiquement » car si vous ajoutez un jour, le graphique foire. Pareil si une valeur est supérieure à 50...
J'avoue, je me suis peut-être avancé en disant que c'était géré dynamiquement. Mais je suis loin d'être à ce niveau.

Dans l'immédiat (je progresse lentement dans mon apprentissage) j'essaie de voir si je pourrais faire afficher qu'un certain nombre des arguments d'une liste et non l'intégral en modifiant :

Code : Tout sélectionner

   \foreachitem\jourcourant\in\jours{% pour chaque effectif (dans la boucle, chaque effectif sera mis dans \jourcourant)   
      	\eaddtotok\tabtoksa{\expandafter&\jourcourant}
   }%
Dans l'immédiat j'ai le code suivant :

Code : Tout sélectionner

\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[francais]{babel}
\usepackage[T1]{fontenc}
\usepackage{multido}
\usepackage{listofitems}
\usepackage{pst-eucl, pst-plot}
\usepackage{pstricks-add,pst-node}
\usepackage{ifthen}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\def\eaddtotok#1#2{#1\expandafter\expandafter\expandafter{\expandafter\the\expandafter#1#2}}
\newtoks\tabtoksa\newtoks\tabtoksb
\def\buildtab#1#2{% #1= liste des valeurs #2= liste des effectifs
   \begingroup% ouvrir un groupe dans lequel se fait tout le processus
      \setsepchar{,}% déclarer que la virgule est le séparateur
      \ignoreemptyitems% ignorer les valeurs vides, par exemple "1,,3" sera lu comme "1,3"
      
%      \readlist*\jours{#1}% Lire les noms des jours et supprimer les espaces avant et après chacun et les ranger dans la variable de type tableau \jours
%      \readlist*\effectifs{#2}% lire les effectifs et supprimer les espaces avant et après chacun et les ranger dans la variable de type tableau \effectifs
      \expandafter\buildtaba\expandafter{\number\numexpr\effectifslen+1}% transmettre à \buildtaba le nombre de valeurs+1
}
\def\buildtaba#1{% #1= nombre de colonnes du tableau
   \tabtoksa{\jours[-1]}\tabtoksb{\effectifs[-1]}% initialiser les registre de tokens (contenus de la 1re colonne de chaque ligne)
   % \tabtoksa contiendra à la fin le code de la 1re ligne et \tabtoksb celui de la 2e

   \foreachitem\jourcourant\in\jours{% pour chaque effectif (dans la boucle, chaque effectif sera mis dans \jourcourant)   
      	\eaddtotok\tabtoksa{\expandafter&\jourcourant}
   }%
   
   \foreachitem\effectifcourant\in\effectifs{% pour chaque effectif (dans la boucle, chaque effectif sera mis dans \effectifcourant)
      \eaddtotok\tabtoksb{\expandafter&\effectifcourant}% ajouter à \tabtoksb "&" puis l'effectif en cours
   }%

   \begin{tabular}{*{#1}{|c}|}\hline% préambule du tableau (il y a #1 colonnes toutes centrées)
      \the\tabtoksa\\\hline% extraire du registre \tabtoksa son contenu puis tracer une ligne horizontale
      \the\tabtoksb\\\hline% extraire du registre \tabtoksb son contenu puis tracer une ligne horizontale
   \end{tabular}% fin du tableau
   \endgroup% on ferme le groupe, le boulot est fini
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newcommand{\builddiagbatons}%[2]
{
	\psset{xunit=1cm, yunit=0.1cm}
	\begin{pspicture*}(-1,-12)(7,70)
	\multido{\i=1+1}{5}
	{
		\psline[linestyle=dotted](\i,0)(\i,50)
		\psline[linestyle=solid](\i,-1)(\i,1)
		\rput[Br]{45}(\i,-3){\jours[\i]}
		\psline{-*}(\i,0)(\i,\effectifs[\i])
	}
	\multido{\i=10+10}{5}
	{
		\psline[linestyle=dotted](0,\i)(5,\i)
		\psline[linestyle=solid](-0.1,\i)(0.1,\i)
		\rput[Br](-0.5,\i){\i}
	}
	\psline[arrowscale=2]{->}(0,0)(6,0)
	\rput(6,-5){\jours[-1]}
	\psline[arrowscale=2]{->}(0,0)(0,60)
	\rput(0.5,65){\effectifs[-1]}
	\end{pspicture*}
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}

\readlist*\jours{Lundi,Mardi,Mercredi,Jeudi,Vendredi,Jours}
\readlist*\effectifs{20,15,45,20,15,Durées (en min)}

%\buildtab{Lundi,Mardi,Mercredi,Jeudi,Vendredi}{20,15,45,20,15}

\buildtab{\jours}{\effectifs}

\builddiagbatons

\end{document}
Mais le tableau affiché est :
$\begin{tabular}{ *{7}{ |c } |}
\hline
Jours & Lundi & Mardi & Mercredi & Jeudi & Vendredi & Jours \\
\hline
Durée (en min) & 20 & 15 & 45 & 20 & 15 & Durées (en min)\\
\hline
\end{tabular}$

Du coup, je me suis dit que je pourrais intégrer un \ifthenelse pour n'exécuter \eaddtotoks que si cnt{}<len{} pour lui interdire d'ajouter le dernier terme à la fin :

Code : Tout sélectionner

   \foreachitem\jourcourant\in\jours{% pour chaque effectif (dans la boucle, chaque effectif sera mis dans \jourcourant)   
      \ifthenelse{\jourcourantcnt{}<\jourslen{}}{\eaddtotok\tabtoksa{\expandafter&\jourcourant}}{}% ajouter à \tabtoksa "&" puis le nom du jour courant
   }%
Malheureusement cela ne fonctionne pas, j'ai le message d'erreur suivant :
No file test_tabular_et_multido3.aux.
! Missing = inserted for \ifnum.
<to be read again>
{
l.78 \buildtab{\jours}{\effectifs}
"L'ignorance n'est pas ne pas connaître, c'est ne pas vouloir connaître."

Une ch'tio peu d'pub :Ina-Ich

Ubuntu | LibreOffice | GnuPlot | PidGin | irssi | Mozilla | VLC ...

Mikelenain
Utilisateur chevronné
Utilisateur chevronné
Messages : 2656
Inscription : dimanche 28 février 2010, 11:54
Localisation : Région Lyonnaise

Re: [Résolu] Tabular et multido

Message par Mikelenain »

Je viens de trouver \delitem* à la fin de la page 335 du livre de programmation. Je me pencherais dessus demain matin ^^
"L'ignorance n'est pas ne pas connaître, c'est ne pas vouloir connaître."

Une ch'tio peu d'pub :Ina-Ich

Ubuntu | LibreOffice | GnuPlot | PidGin | irssi | Mozilla | VLC ...

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

Re: [Résolu] Tabular et multido

Message par un bon petit »

Mikelenain a écrit :

Code : Tout sélectionner

   \foreachitem\jourcourant\in\jours{% pour chaque effectif (dans la boucle, chaque effectif sera mis dans \jourcourant)   
      	\eaddtotok\tabtoksa{\expandafter&\jourcourant}
   }%
Ne jamais utiliser le package ifthenelse. Pour ma part, je ne l'ai jamais chargé de ma vie, même pour tester les erreurs des autres.
Préférez la syntaxe TeX avec les tests if.
Ici, c'est

Code : Tout sélectionner

\foreachitem\jourcourant\in\jours{%
\ifnum\jourcourantcnt<\jourslen\relax \eaddtotok\tabtoksa{\expandafter&\jourcourant}\fi
}%

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

Re: [Résolu] Tabular et multido

Message par un bon petit »

Mikelenain a écrit :Je viens de trouver \delitem* à la fin de la page 335 du livre de programmation. Je me pencherais dessus demain matin ^^
Tout mélanger est le meilleur moyen de tout faire échouer... \delitem n'est pas une macro du package listofitems et ces deux là n'ont rien à faire ensemble !

Mikelenain
Utilisateur chevronné
Utilisateur chevronné
Messages : 2656
Inscription : dimanche 28 février 2010, 11:54
Localisation : Région Lyonnaise

Re: [Résolu] Tabular et multido

Message par Mikelenain »

un bon petit a écrit :
Mikelenain a écrit :

Code : Tout sélectionner

   \foreachitem\jourcourant\in\jours{% pour chaque effectif (dans la boucle, chaque effectif sera mis dans \jourcourant)   
      	\eaddtotok\tabtoksa{\expandafter&\jourcourant}
   }%
Ne jamais utiliser le package ifthenelse. Pour ma part, je ne l'ai jamais chargé de ma vie, même pour tester les erreurs des autres.
Quel est le soucis avec ifthenelse ? Je l'utilise régulièrement et je n'ai jamais eu de soucis. Aurait-il des bugs que je n'aurais pas vus ? :o
un bon petit a écrit :Préférez la syntaxe TeX avec les tests if.
Ici, c'est

Code : Tout sélectionner

\foreachitem\jourcourant\in\jours{%
\ifnum\jourcourantcnt<\jourslen\relax \eaddtotok\tabtoksa{\expandafter&\jourcourant}\fi
}%
Je vais tester cela. Je ne connaissais pas \ifnum ni \relax. Merci.
un bon petit a écrit :
Mikelenain a écrit :Je viens de trouver \delitem* à la fin de la page 335 du livre de programmation. Je me pencherais dessus demain matin ^^
Tout mélanger est le meilleur moyen de tout faire échouer... \delitem n'est pas une macro du package listofitems et ces deux là n'ont rien à faire ensemble !^
Je suis bien d'accord mais je ne savais pas qu'ils n'avaient rien à voir l'un avec l'autre :o Merci de la correction :)
"L'ignorance n'est pas ne pas connaître, c'est ne pas vouloir connaître."

Une ch'tio peu d'pub :Ina-Ich

Ubuntu | LibreOffice | GnuPlot | PidGin | irssi | Mozilla | VLC ...

Mikelenain
Utilisateur chevronné
Utilisateur chevronné
Messages : 2656
Inscription : dimanche 28 février 2010, 11:54
Localisation : Région Lyonnaise

Re: [Résolu] Tabular et multido

Message par Mikelenain »

Mikelenain a écrit :
un bon petit a écrit :Préférez la syntaxe TeX avec les tests if.
Ici, c'est

Code : Tout sélectionner

\foreachitem\jourcourant\in\jours{%
\ifnum\jourcourantcnt<\jourslen\relax \eaddtotok\tabtoksa{\expandafter&\jourcourant}\fi
}%
Je vais tester cela. Je ne connaissais pas \ifnum ni \relax. Merci.
Ça fonctionne très bien, merci.

Demain, je regarde le code que vous avez mis précédemment pour une gestion plus dynamique des tableaux et diagrammes ;)


J'essayerais aussi de trouver comment faire des diagrammes circulaires and co (il faudra que je trouve comment additionner les termes d'un token et comment faire des divisions .... je pense à FP mais on verra). Bonne soirée.
"L'ignorance n'est pas ne pas connaître, c'est ne pas vouloir connaître."

Une ch'tio peu d'pub :Ina-Ich

Ubuntu | LibreOffice | GnuPlot | PidGin | irssi | Mozilla | VLC ...

Mikelenain
Utilisateur chevronné
Utilisateur chevronné
Messages : 2656
Inscription : dimanche 28 février 2010, 11:54
Localisation : Région Lyonnaise

Re: [Résolu] Tabular et multido

Message par Mikelenain »

Bonjour,

j'ai essayé de modifier un peu le code avec les listes imbriquées. Ça fonctionne assez bien pour construire le tableau par contre j'ai un petit soucis sur les diagrammes. Je mets le code ci-dessous :

Code : Tout sélectionner

\documentclass[a4paper]{article}
	\usepackage[T1]{fontenc}
	\usepackage[utf8]{inputenc}
	\usepackage[francais]{babel}
	\usepackage{multido,listofitems,pstricks-add}
	\usepackage[margin=1.5cm]{geometry}

	\def\addtotok#1#2{#1\expandafter{\the#1#2}}
	\def\truncdiv#1#2{\numexpr(#1-(#2-1)/2)/#2\relax}
	\newtoks\tabtoksa
	\newtoks\tabtoksb
	\def\readdays#{%
		\setsepchar[*]{,*/}
		\ignoreemptyitems
		\readlist*\days
	}%
	\def\updatetoks#1/#2\nil
	{
		\addtotok\tabtoksa{&#1}
		\addtotok\tabtoksb{&#2}
		\ifnum#2>\maxval\def\maxval{#2}\fi
	}
    
	\def\buildtab
	{%
		\tabtoksa{\days[-1,1]}
		\tabtoksb{\days[-1,2]}
		\def\maxval{0}%
		\foreachitem\xday\in\days
		{
			\ifnum\xdaycnt<\dayslen\relax
			\expandafter\updatetoks\xday\nil
			\fi
		}%
		\edef\maxval{\the\numexpr\truncdiv\maxval{10}*10+10\relax}%
		\begin{tabular}{*{\number\numexpr\dayslen}{|c}|}\hline
		\the\tabtoksa\\\hline
		\the\tabtoksb\\\hline
		\end{tabular}%
	}

	\def\builddiagbatons
	{%
%		\maxval\par
		\psset{xunit=1cm, yunit=0.1cm}%
		\begin{pspicture*}(-1,-18)({\number\numexpr\dayslen+2},{\the\numexpr\maxval+20})
		\multido{\i=1+1}{\number\numexpr\dayslen-1}
		{%
			\psline[linestyle=dotted](\i,0)(\i,\maxval)%
			\psline[linestyle=solid](\i,-1)(\i,1)%
			\rput[Br]{45}(\i,-3){\days[\i,1]}%
			\psline{-*}(\i,0)(\i,\days[\i,2])%
		}%
		\multido{\i=10+10}{\truncdiv\maxval{10}}
		{%
			\psline[linestyle=dotted](0,\i)({\number\numexpr\dayslen-1},\i)%
			\psline[linestyle=solid](-0.1,\i)(0.1,\i)%
			\rput[Br](-0.5,\i){\i}%
		}%
		\psline[arrowscale=2]{->}(0,0)({\number\numexpr\dayslen+1},0)%
		\rput({\number\numexpr\dayslen+1},-5){\days[-1,1]}%
		\psline[arrowscale=2]{->}(0,0)(0,{\the\numexpr\maxval+10})%
		\rput(0.5,{\the\numexpr\maxval+15}){\days[-1,2]}%
		\end{pspicture*}%
	}
	
\begin{document}
	\readdays{Lundi/35,Mardi/20,Mercredi/40,Jeudi/20,Vendredi/15,Jours/Durée (en min)}
	daylen - 1 = \number\numexpr\dayslen-1\par
	\buildtab\par
	\builddiagbatons
	\bigbreak

	\readdays{AAA/12,BBB/18,CCC/11,DDD/19,EEE/8,FFF/13,GGG/18,Élèves/Moyenne}
	daylen - 1 = \number\numexpr\dayslen-1\par
	\buildtab\par
	\builddiagbatons
\end{document}
Pour une raison que j'ignore, il ne semble pas exécuter le multido suivant :

Code : Tout sélectionner

		\multido{\i=1+1}{\number\numexpr\dayslen-1}
		{%
			\psline[linestyle=dotted](\i,0)(\i,\maxval)%
			\psline[linestyle=solid](\i,-1)(\i,1)%
			\rput[Br]{45}(\i,-3){\days[\i,1]}%
			\psline{-*}(\i,0)(\i,\days[\i,2])%
		}%
Je n'ai pas l'impression d'avoir beaucoup modifié cette partie. La seule différence est que je fais faire une boucle en moins. Bref, je suis bloqué :o
"L'ignorance n'est pas ne pas connaître, c'est ne pas vouloir connaître."

Une ch'tio peu d'pub :Ina-Ich

Ubuntu | LibreOffice | GnuPlot | PidGin | irssi | Mozilla | VLC ...

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

Re: [Résolu] Tabular et multido

Message par un bon petit »

Mikelenain a écrit :j'ai essayé de modifier un peu le code avec les listes imbriquées
Pourquoi l'avez vous fait ? Que cherchez-vous au juste ? C'est de spécifier le nom des 2 champs ?

Je ne me suis pas plongé dans votre code qui est mal présenté (identations partout, accolades ouvrantes à la ligne, etc) et qui a des espaces parasites de tous les côtés. Je me demande juste si une syntaxe comme

Code : Tout sélectionner

\readdays Jours/Effectifs{Lundi/35,Mardi/20,Mercredi/40,Jeudi/20,Vendredi/15}
ou comme

Code : Tout sélectionner

\setdatanames{Jours/Effectifs}
\readdays{Lundi/35,Mardi/20,Mercredi/40,Jeudi/20,Vendredi/15}
ne serait pas plus judicieuse que votre tambouille...

Mikelenain
Utilisateur chevronné
Utilisateur chevronné
Messages : 2656
Inscription : dimanche 28 février 2010, 11:54
Localisation : Région Lyonnaise

Re: [Résolu] Tabular et multido

Message par Mikelenain »

un bon petit a écrit :
Mikelenain a écrit :j'ai essayé de modifier un peu le code avec les listes imbriquées
Pourquoi l'avez vous fait ? Que cherchez-vous au juste ? C'est de spécifier le nom des 2 champs ?
Ce qui me gêne, c'est ces bouts de code-ci :

Code : Tout sélectionner

\tabtoksa{Jour}\tabtoksb{Durée}

Code : Tout sélectionner

\rput({\number\numexpr\dayslen+1},-5){Jour}%

Code : Tout sélectionner

\rput(0.5,{\the\numexpr\maxval+5}){Durée (en min)}%
En effet, j'aimerais, à terme, pouvoir passer les labels ("jours" et "durée (en min)") comme argument pour pouvoir les changer si besoin. Si je garde votre code, il faudrait que je retouche la définition de \buildtab à chaque fois ...
un bon petit a écrit :Je ne me suis pas plongé dans votre code qui est mal présenté (identations partout, accolades ouvrantes à la ligne, etc) et qui a des espaces parasites de tous les côtés.
Désolé, je n'arrive pas à lire des codes non identés de ce genre :

Code : Tout sélectionner

\def\updatetoks#1/#2\nil{\addtotok\tabtoksa{&#1}\addtotok\tabtoksb{&#2}\ifnum#2>\maxval\def\maxval{#2}\fi}
un bon petit a écrit :Je me demande juste si une syntaxe comme

Code : Tout sélectionner

\readdays Jours/Effectifs{Lundi/35,Mardi/20,Mercredi/40,Jeudi/20,Vendredi/15}
ou comme

Code : Tout sélectionner

\setdatanames{Jours/Effectifs}
\readdays{Lundi/35,Mardi/20,Mercredi/40,Jeudi/20,Vendredi/15}
ne serait pas plus judicieuse que votre tambouille...
Je vais voir ce que ça donne, mais je ne suis pas sûr car on en revient à ne pas passer dynamiquement les labels comme dit précédemment.
"L'ignorance n'est pas ne pas connaître, c'est ne pas vouloir connaître."

Une ch'tio peu d'pub :Ina-Ich

Ubuntu | LibreOffice | GnuPlot | PidGin | irssi | Mozilla | VLC ...

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

Re: [Résolu] Tabular et multido

Message par un bon petit »

Mikelenain a écrit :Désolé, je n'arrive pas à lire des codes non identés de ce genre
Vous manquez d'habitude, mais abuser de l'indentation (comme entre \begin{document} et \end{document}) est un écueil à éviter.
Mikelenain a écrit :En effet, j'aimerais, à terme, pouvoir passer les labels ("jours" et "durée (en min)") comme argument pour pouvoir les changer si besoin. Si je garde votre code, il faudrait que je retouche la définition de \buildtab à chaque fois ...
Je ne vois pas en quoi utiliser la syntaxe \readdays{Jours/Effectifs}{Lundi/35,Mardi/20,Mercredi/40,Jeudi/20,Vendredi/15} vous oblige à redéfinir \buildtab à chaque fois !!! Manquerait plus que ça ! :roll:
Mikelenain a écrit :Je vais voir ce que ça donne, mais je ne suis pas sûr car on en revient à ne pas passer dynamiquement les labels comme dit précédemment.
Par ailleurs, il faudra que vous m'expliquiez ce que vous entendez par « dynamiquement » car j'ai un doute...

Mikelenain
Utilisateur chevronné
Utilisateur chevronné
Messages : 2656
Inscription : dimanche 28 février 2010, 11:54
Localisation : Région Lyonnaise

Re: [Résolu] Tabular et multido

Message par Mikelenain »

un bon petit a écrit :
Mikelenain a écrit :Désolé, je n'arrive pas à lire des codes non identés de ce genre
Vous manquez d'habitude, mais abuser de l'indentation (comme entre \begin{document} et \end{document}) est un écueil à éviter.
Je veux bien vous croire mais j'ai du mal à comprendre pourquoi :o
Et puis, aïe, aïe mes yeux et mon cerveau :( 'j'ai du mal à voir quelle accolade fermante correspond à quelle accolade ouvrante et autre ... du coup, je fais énormément de faute de codage de ce genre and co si je n'idente pas parfaitement)
un bon petit a écrit :
Mikelenain a écrit :En effet, j'aimerais, à terme, pouvoir passer les labels ("jours" et "durée (en min)") comme argument pour pouvoir les changer si besoin. Si je garde votre code, il faudrait que je retouche la définition de \buildtab à chaque fois ...
Je ne vois pas en quoi utiliser la syntaxe \readdays{Jours/Effectifs}{Lundi/35,Mardi/20,Mercredi/40,Jeudi/20,Vendredi/15} vous oblige à redéfinir \buildtab à chaque fois !!! Manquerait plus que ça ! :roll:
Parce-que dans la définition de \buildtab, vous avez mis :

Code : Tout sélectionner

\tabtoksa{Jour}\tabtoksb{Durée}
Si un jour, je veux d'autres label, il faudra donc que j'aille éditer cette ligne pour changer "Jour" par autre chose, ainsi que "Durée"
un bon petit a écrit :
Mikelenain a écrit :Je vais voir ce que ça donne, mais je ne suis pas sûr car on en revient à ne pas passer dynamiquement les labels comme dit précédemment.
Par ailleurs, il faudra que vous m'expliquiez ce que vous entendez par « dynamiquement » car j'ai un doute...
Que les labels "jours" et "durée" ne soient pas passés dans :

Code : Tout sélectionner

\def\buildtab{%
   \tabtoksa{Jour}\tabtoksb{Durée}\def\maxval{0}%
   \foreachitem\xday\in\days{\expandafter\updatetoks\xday\nil}%
   \edef\maxval{\the\numexpr\truncdiv\maxval{10}*10+10\relax}%
   \begin{tabular}{*{\number\numexpr\dayslen+1}{|c}|}\hline
      \the\tabtoksa\\\hline
      \the\tabtoksb\\\hline
   \end{tabular}%
}
mais en dehors.
"L'ignorance n'est pas ne pas connaître, c'est ne pas vouloir connaître."

Une ch'tio peu d'pub :Ina-Ich

Ubuntu | LibreOffice | GnuPlot | PidGin | irssi | Mozilla | VLC ...

Mikelenain
Utilisateur chevronné
Utilisateur chevronné
Messages : 2656
Inscription : dimanche 28 février 2010, 11:54
Localisation : Région Lyonnaise

Re: [Résolu] Tabular et multido

Message par Mikelenain »

Après, j'ai essayé cela :

Code : Tout sélectionner

    \documentclass[a4paper]{article}
     \usepackage[T1]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage[francais]{babel}
    \usepackage{multido,listofitems,pstricks-add}
    \usepackage[margin=1.5cm]{geometry}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\def\eaddtotok#1#2{#1\expandafter\expandafter\expandafter{\expandafter\the\expandafter#1#2}}
\newtoks\tabtoksa\newtoks\tabtoksb
\def\buildtab#1#2{% #1= liste des valeurs #2= liste des effectifs
   \begingroup% ouvrir un groupe dans lequel se fait tout le processus
      \setsepchar{,}% déclarer que la virgule est le séparateur
      \ignoreemptyitems% ignorer les valeurs vides, par exemple "1,,3" sera lu comme "1,3"
      
%      \readlist*\jours{#1}% Lire les noms des jours et supprimer les espaces avant et après chacun et les ranger dans la variable de type tableau \jours
%      \readlist*\effectifs{#2}% lire les effectifs et supprimer les espaces avant et après chacun et les ranger dans la variable de type tableau \effectifs
      \expandafter\buildtaba\expandafter{\number\numexpr\effectifslen}% transmettre à \buildtaba le nombre de valeurs+1
}
\def\buildtaba#1{% #1= nombre de colonnes du tableau
   \tabtoksa{\valeurs[-1]}\tabtoksb{\effectifs[-1]}% initialiser les registre de tokens (contenus de la 1re colonne de chaque ligne)
   % \tabtoksa contiendra à la fin le code de la 1re ligne et \tabtoksb celui de la 2e

	\foreachitem\valeurscourant\in\valeurs
	{%
		\ifnum\valeurscourantcnt<\valeurslen\relax \eaddtotok\tabtoksa{\expandafter&\valeurscourant}\fi
	}%
   
	\foreachitem\effectifcourant\in\effectifs{% pour chaque effectif (dans la boucle, chaque effectif sera mis dans \effectifcourant)
		\ifnum\effectifcourantcnt<\effectifslen\relax \eaddtotok\tabtoksb{\expandafter&\effectifcourant}\fi% ajouter à \tabtoksb "&" puis l'effectif en cours
	}%

   \begin{tabular}{*{#1}{|c}|}\hline% préambule du tableau (il y a #1 colonnes toutes centrées)
      \the\tabtoksa\\\hline% extraire du registre \tabtoksa son contenu puis tracer une ligne horizontale
      \the\tabtoksb\\\hline% extraire du registre \tabtoksb son contenu puis tracer une ligne horizontale
   \end{tabular}% fin du tableau
   \endgroup% on ferme le groupe, le boulot est fini
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

	\def\builddiagbatons
	{%
		\psset{xunit=1cm, yunit=0.1cm}%
		\begin{pspicture*}(-1,-20)({\number\numexpr\valeurslen+1},80)
		\multido{\i=1+1}{7}
		{%
			\psline[linestyle=dotted](\i,0)(\i,60)%
			\psline[linestyle=solid](\i,-1)(\i,1)%
			\rput[Br]{45}(\i,-3){\valeurs[\i]}%
			\psline{-*}(\i,0)(\i,\effectifs[\i])%
		}%
		\multido{\i=10+10}{6}
		{%
			\psline[linestyle=dotted](0,\i)(7,\i)%
			\psline[linestyle=solid](-0.1,\i)(0.1,\i)%
			\rput[Br](-0.5,\i){\i}%
		}%
		\psline[arrowscale=2]{->}(0,0)(8.5,0)%
		\rput(8,-5){\valeurs[-1]}%
		\psline[arrowscale=2]{->}(0,0)(0,70)%
		\rput(0.5,75){\effectifs[-1]}%
		\end{pspicture*}%
	}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	
\begin{document}
	\readlist*\valeurs{Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi,Dimanche,Jours}
	\readlist*\effectifs{30,20,45,30,15,60,30,Durée (en min)}
	
%	\readdays{Lundi/35,Mardi/20,Mercredi/40,Jeudi/20,Vendredi/15,Jours/Durée (en min)}
%	daylen - 1 = \number\numexpr\dayslen-1\par
	\buildtab{\valeurs}{\effectifs}
	
	\builddiagbatons
	
\end{document}
ça fonctionne très bien, mais comme vous l'avez remarqué précédemment, si je modifie le nombre d'arguments dans \valeurs et \effectifs .... le code ne s'adapte pas automatiquement :s Ce n'est pas dynamique.
"L'ignorance n'est pas ne pas connaître, c'est ne pas vouloir connaître."

Une ch'tio peu d'pub :Ina-Ich

Ubuntu | LibreOffice | GnuPlot | PidGin | irssi | Mozilla | VLC ...

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

Re: [Résolu] Tabular et multido

Message par un bon petit »

À adapter/améliorer selon vos besoins :

Code : Tout sélectionner

\documentclass[a4]{article}
\usepackage{multido,listofitems,pstricks-add}
\usepackage[margin=1.5cm]{geometry}
\def\addtotok#1#2{#1\expandafter{\the#1#2}}
\def\truncdiv#1#2{\numexpr(#1-(#2-1)/2)/#2\relax}
\newtoks\tabtoksa\newtoks\tabtoksb
\def\readdatas#1/#2#{\def\dataa{#1}\def\datab{#2}\setsepchar[*]{,*/}\ignoreemptyitems\readlist*\days}
\def\updatetoks#1/#2\nil{\addtotok\tabtoksa{&#1}\addtotok\tabtoksb{&#2}\ifnum#2>\maxval\def\maxval{#2}\fi}
\def\printtab{%
	\tabtoksa=\expandafter{\dataa}\tabtoksb=\expandafter{\datab}\def\maxval{0}%
	\foreachitem\xday\in\days{\expandafter\updatetoks\xday\nil}%
	\edef\maxval{\the\numexpr\truncdiv\maxval{10}*10+10\relax}%
	\begin{tabular}{*{\number\numexpr\dayslen+1}{|c}|}\hline
		\the\tabtoksa\\\hline
		\the\tabtoksb\\\hline
	\end{tabular}%
}
\newcommand*\printhisto[1][10]{%
	\begin{pspicture*}(-1,-15)({\number\numexpr\dayslen+2},{\the\numexpr\maxval+#1})
		\multido{\i=1+1}{\dayslen}{%
			\psline[linestyle=dotted](\i,0)(\i,\maxval)%
			\rput[tr]{45}(\i,0){\days[\i,1] }%
			\psline{-*}(\i,0)(\i,\days[\i,2])%
		}%
		\multido{\i=#1+#1}{\truncdiv\maxval{#1}}{%
			\psline[linestyle=dotted](0,\i)({\number\numexpr\dayslen+1},\i)%
			\psline[linestyle=solid](-0.1,\i)(0.1,\i)%
			\rput[r](0,\i){\i\hskip0.5em }%
		}%
		\psline[arrowscale=2]{->}(0,0)({\number\numexpr\dayslen+1},0)%
		\rput[tl]({\number\numexpr\dayslen+1},0){\dataa}%
		\psline[arrowscale=2]{->}(0,0)(0,\maxval)%
		\rput[l](0.25,{\the\numexpr\maxval}){\datab}%
	\end{pspicture*}%
}
\begin{document}
\readdatas Jours/Durée (en min){Lundi/35,Mardi/20,Mercredi/40,Jeudi/20,Vendredi/15}
\printtab\par
\psset{xunit=1cm, yunit=0.1cm}\printhisto
\bigbreak

\readdatas Élève/Moyenne{AAA/12,BBB/18,CCC/11,DDD/19,EEE/8,FFF/13,GGG/18}
\printtab\par
\psset{xunit=1cm, yunit=.25cm}\printhisto[2]
\end{document}

Mikelenain
Utilisateur chevronné
Utilisateur chevronné
Messages : 2656
Inscription : dimanche 28 février 2010, 11:54
Localisation : Région Lyonnaise

Re: [Résolu] Tabular et multido

Message par Mikelenain »

Je verrais cela demain matin. Je ne tiens plus debout.

Merci à vous et bonne nuit :)
Mike
"L'ignorance n'est pas ne pas connaître, c'est ne pas vouloir connaître."

Une ch'tio peu d'pub :Ina-Ich

Ubuntu | LibreOffice | GnuPlot | PidGin | irssi | Mozilla | VLC ...

Mikelenain
Utilisateur chevronné
Utilisateur chevronné
Messages : 2656
Inscription : dimanche 28 février 2010, 11:54
Localisation : Région Lyonnaise

Re: [Résolu] Tabular et multido

Message par Mikelenain »

J'ai compris mon erreur dans ce morceau de code :
Mikelenain a écrit :Pour une raison que j'ignore, il ne semble pas exécuter le multido suivant :

Code : Tout sélectionner

		\multido{\i=1+1}{\number\numexpr\dayslen-1}
		{%
			\psline[linestyle=dotted](\i,0)(\i,\maxval)%
			\psline[linestyle=solid](\i,-1)(\i,1)%
			\rput[Br]{45}(\i,-3){\days[\i,1]}%
			\psline{-*}(\i,0)(\i,\days[\i,2])%
		}%
Je n'ai pas l'impression d'avoir beaucoup modifié cette partie. La seule différence est que je fais faire une boucle en moins. Bref, je suis bloqué :o
J'ai mis dans le multido \number\numexpr\dayslen-1 et, je ne le savais pas, \number transforme le nombre en caractère affichable. Du coup, il n'avait pas un nombre de boucles à faire puisque \number ne donne pas des nombres mais des caractères.
(je ne sais pas si je suis clair ^^ )

Bref, il suffisait de prendre le temps de lire le pdf fort volumineux avec les bons mots clefs pour comprendre ^^
"L'ignorance n'est pas ne pas connaître, c'est ne pas vouloir connaître."

Une ch'tio peu d'pub :Ina-Ich

Ubuntu | LibreOffice | GnuPlot | PidGin | irssi | Mozilla | VLC ...