[Résolu] Tabular et multido

Tout ce qui concerne l'utilisation ou l'installation de LaTeX.

Modérateur: gdm_tex

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

Re: [Résolu] Tabular et multido

Messagepar Mikelenain » Vendredi 07 Juin 2019, 21:00

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
Exa-utilisateur
 
Messages: 2655
Inscription: Dimanche 28 Février 2010, 11:54
Localisation: Région Lyonnaise
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: [Résolu] Tabular et multido

Messagepar Mikelenain » Vendredi 07 Juin 2019, 21:50

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 ...
Mikelenain
Exa-utilisateur
 
Messages: 2655
Inscription: Dimanche 28 Février 2010, 11:54
Localisation: Région Lyonnaise
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar un bon petit » Vendredi 07 Juin 2019, 21:59

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
Giga-utilisateur
 
Messages: 727
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar un bon petit » Vendredi 07 Juin 2019, 22:01

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 !
un bon petit
Giga-utilisateur
 
Messages: 727
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar Mikelenain » Samedi 08 Juin 2019, 04:25

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
Exa-utilisateur
 
Messages: 2655
Inscription: Dimanche 28 Février 2010, 11:54
Localisation: Région Lyonnaise
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar Mikelenain » Samedi 08 Juin 2019, 22:55

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
Exa-utilisateur
 
Messages: 2655
Inscription: Dimanche 28 Février 2010, 11:54
Localisation: Région Lyonnaise
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar Mikelenain » Dimanche 09 Juin 2019, 20:58

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 ...
Mikelenain
Exa-utilisateur
 
Messages: 2655
Inscription: Dimanche 28 Février 2010, 11:54
Localisation: Région Lyonnaise
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar un bon petit » Dimanche 09 Juin 2019, 21:22

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...
un bon petit
Giga-utilisateur
 
Messages: 727
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar Mikelenain » Dimanche 09 Juin 2019, 21:44

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 ...
Mikelenain
Exa-utilisateur
 
Messages: 2655
Inscription: Dimanche 28 Février 2010, 11:54
Localisation: Région Lyonnaise
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar un bon petit » Dimanche 09 Juin 2019, 21:57

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...
un bon petit
Giga-utilisateur
 
Messages: 727
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar Mikelenain » Dimanche 09 Juin 2019, 22:10

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
Exa-utilisateur
 
Messages: 2655
Inscription: Dimanche 28 Février 2010, 11:54
Localisation: Région Lyonnaise
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar Mikelenain » Dimanche 09 Juin 2019, 22:16

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 ...
Mikelenain
Exa-utilisateur
 
Messages: 2655
Inscription: Dimanche 28 Février 2010, 11:54
Localisation: Région Lyonnaise
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar un bon petit » Dimanche 09 Juin 2019, 22:31

À 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}
un bon petit
Giga-utilisateur
 
Messages: 727
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar Mikelenain » Dimanche 09 Juin 2019, 22:37

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
Exa-utilisateur
 
Messages: 2655
Inscription: Dimanche 28 Février 2010, 11:54
Localisation: Région Lyonnaise
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar Mikelenain » Mardi 11 Juin 2019, 07:43

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 ...
Mikelenain
Exa-utilisateur
 
Messages: 2655
Inscription: Dimanche 28 Février 2010, 11:54
Localisation: Région Lyonnaise
Statut actuel: Actif et salarié | Enseignant

Précédente

Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Grapeshot [Crawler], Magpie [Crawler] et 10 invités