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

[Résolu] Tabular et multido

Messagepar erwanadam » Mercredi 17 Août 2016, 11:30

Bonjour,

multido fonctionne-t-il dans un environnement tabular? Je voudrais créer une commande qui produit un tableau vide avec deux colonnes et un nombre variable de lignes. Le code suivant ne fonctionne pas :

Code: Tout sélectionner
\newcommand{\tableau}[1]{
  \begin{tabular}{|c|c|}
    \multido{}{#1}{ & \\ \hline }
  \end{tabular}
}


Si multido ne convient pas, y a-t-il une autre solution?

Merci!
Dernière édition par erwanadam le Mercredi 17 Août 2016, 18:13, édité 1 fois.
erwanadam
Déca-utilisateur
 
Messages: 18
Inscription: Lundi 01 Août 2016, 16:13
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Tabular et multido

Messagepar un bon petit » Mercredi 17 Août 2016, 17:28

erwanadam a écrit:Si multido ne convient pas, y a-t-il une autre solution?


Multido convient très bien, à condition de bien s'y prendre. Voici une solution avec un registre de tokens :
Code: Tout sélectionner
\documentclass{article}
\usepackage{multido}
\def\gaddtotok#1{\global\tabtok\expandafter{\the\tabtok#1}}
\newtoks\tabtok
\newcommand*\tableau[1]{%
   \global\tabtok{\begin{tabular}{|c|c|}\hline}%
   \multido{}{#1}{\gaddtotok{&\\\hline}}%
   \gaddtotok{\end{tabular}}%
   \the\tabtok
}
\begin{document}
Essai : \tableau{5}
\end{document}
un bon petit
Giga-utilisateur
 
Messages: 741
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: Tabular et multido

Messagepar erwanadam » Mercredi 17 Août 2016, 18:12

Merci! C'est exactement ce qu'il me fallait.
erwanadam
Déca-utilisateur
 
Messages: 18
Inscription: Lundi 01 Août 2016, 16:13
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar Mikelenain » Lundi 03 Juin 2019, 09:53

Bonjour, je reviens vers vous pour faire un truc un peu différent mais assez proche (c'est pour cela que je déterre ce sujet au lieu d'en créer un nouveau).
J'envisage de faire faire via un multido dans un tabular un truc de ce genre :

$\begin{tabular}{| *{12}{c |} } \hline valeur & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10\\ \hline effectif & 2 & 1 & 7 & 13 & 14 & 8 & 5 & 6 & 4 & 1 & 9\\ \hline \end{tabular}$

Le multido permettrait de ne pas taper manuellement les 11 valeurs.

Par avance merci :)
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: 2664
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 » Lundi 03 Juin 2019, 13:01

Mikelenain a écrit:Le multido permettrait de ne pas taper manuellement les 11 valeurs.

Ben voyons ! Avec le package listofitems (que vous ignorez d'ailleurs dans l'autre post alors qu'il répond à votre question), c'est assez facile :

Code: Tout sélectionner
\documentclass{article}
\usepackage{listofitems}
\def\eaddtotok#1#2{#1\expandafter\expandafter\expandafter{\expandafter\the\expandafter#1#2}}
\newtoks\tabtoksa\newtoks\tabtoksb
\def\buildtab#1{%
   \begingroup\setsepchar{,}\ignoreemptyitems\readlist*\effectifs{#1}%
   \expandafter\buildtaba\expandafter{\number\numexpr\effectifslen+1}%
}
\def\buildtaba#1{%
   \tabtoksa{valeur}\tabtoksb{effectif}%
   \foreachitem\effectifcourant\in\effectifs{%
      \eaddtotok\tabtoksa{\expandafter&\the\numexpr\effectifcourantcnt-1}%
      \eaddtotok\tabtoksb{\expandafter&\effectifcourant}%
   }%
   \begin{tabular}{*{#1}{|c}|}\hline\the\tabtoksa\\\hline\the\tabtoksb\\\hline
   \end{tabular}%
   \endgroup
}
\begin{document}
Mon tableau : \buildtab{2,1,7,13,14,8,5,6,4,1,9}
\end{document}
un bon petit
Giga-utilisateur
 
Messages: 741
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar Mikelenain » Lundi 03 Juin 2019, 18:07

J'avoue ne pas être très à l'aise avec les \def et surtout avec les \newtoks.

Je ne sais absolument pas ce que signifie \newtoks et je n'ai pas trouvé de docs compréhensibles (pour moi) sur le sujet. Du coup je n'avais pas fait le lien. J'avoue que votre code m'est totalement incompréhensible. Je vais jeter un œil dessus et voir ce que je peux en tirer ^^

Merci à vous.

PS : je n'ai pas ignoré la solution que vous donnez avec listofitems dans l'autre post. Bien au contraire, c'est celle que je vais adopter car je trouve qu'elle répond mieux à ma demande. Désolé de ne pas l'avoir précisé.
"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: 2664
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 » Lundi 03 Juin 2019, 19:27

Mikelenain a écrit:J'avoue ne pas être très à l'aise avec les \def et surtout avec les \newtoks.

Je ne sais absolument pas ce que signifie \newtoks et je n'ai pas trouvé de docs compréhensibles (pour moi) sur le sujet.

\def est utilisé pour définir une macro. Une macro contient du code, mais admet aussi des arguments.
\newtoks est utilisé pour allouer un nouveau registre de tokens. Un registre de tokens est un peu une macro ultra-simplifiée : il ne fait que stocker du code et ne peut pas admettre d'argument.

En somme, pour stocker le code "Bonjour", il y a 2 possibilités :
  • via une macro par \def\foo{Bonjour}
  • via un registre de tokens avec \newtoks\foo pour l'allocation puis avec \foo={Bonjour} pour l'assignation

Les deux sont légitimes et utilisés, mais il faut garder à l'esprit qu'il y a un nombre limité de registre de tokens (255 sous tex et 32768 -- je crois -- sous etex) alors que les macros ne sont pas en nombre limité.

Pour en savoir plus, vous pouvez aller voir ce bouquin (dispo ici et ici). Il n'est pas terrible, mais on y apprend des trucs :mrgreen: Par ex, p61 et suivante pour les registre de tokens et p39 à 129 pour les macros (beaucoup plus complexes)
un bon petit
Giga-utilisateur
 
Messages: 741
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar Mikelenain » Lundi 03 Juin 2019, 19:52

Oh oui, merci. C'est exactement ce que je cherchais. Je sens que je vais avoir pas mal de lecture dans les semaines à venir ^^

Merci beaucoup.

(j'avoue que tout votre code est pour moi un mystère, pas seulement \newtoks ou \def qui sont certainement ce qui me posent le moins de problème)
"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: 2664
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 » Lundi 03 Juin 2019, 20:09

Mikelenain a écrit:(j'avoue que tout votre code est pour moi un mystère, pas seulement \newtoks ou \def qui sont certainement ce qui me posent le moins de problème)

La programmation en TeX est assez hermétique au premier abord.

J'ai commenté le code en essayant d'être le plus explicite possible.
Code: Tout sélectionner
\documentclass{article}
\usepackage{listofitems}
\def\eaddtotok#1#2{#1\expandafter\expandafter\expandafter{\expandafter\the\expandafter#1#2}}
\newtoks\tabtoksa\newtoks\tabtoksb
\def\buildtab#1{% #1= liste des effectifs
   \begingroup% ouvrir un groupe dans lequel se fait tout le processus
      \setsepchar{,}% déclarer que la virgule est le séparateur entre les effectifs
      \ignoreemptyitems% ignorer les valeurs vides, par exemple "1,,3" sera lu comme "1,3"
      \readlist*\effectifs{#1}% 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{valeur}\tabtoksb{effectif}% 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\effectifcourant\in\effectifs{% pour chaque effectif (dans la boucle, chaque effectif sera mis dans \effectifcourant)
      \eaddtotok\tabtoksa{\expandafter&\the\numexpr\effectifcourantcnt-1}% ajouter à \tabtoksa "&" puis le numéro de l'effectif -1
      \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
}
\begin{document}
Mon tableau : \buildtab{2,1,7,13,14,8,5,6,4,1,9}
\end{document}
un bon petit
Giga-utilisateur
 
Messages: 741
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar Mikelenain » Lundi 03 Juin 2019, 20:54

un bon petit a écrit:
Mikelenain a écrit:(j'avoue que tout votre code est pour moi un mystère, pas seulement \newtoks ou \def qui sont certainement ce qui me posent le moins de problème)

La programmation en TeX est assez hermétique au premier abord.

J'avoue .... j'ai une petite expérience en C et en php/mysql mais là, c'est assez beurk :s

un bon petit a écrit:J'ai commenté le code en essayant d'être le plus explicite possible.
Code: Tout sélectionner
\documentclass{article}
\usepackage{listofitems}
\def\eaddtotok#1#2{#1\expandafter\expandafter\expandafter{\expandafter\the\expandafter#1#2}}
\newtoks\tabtoksa\newtoks\tabtoksb
\def\buildtab#1{% #1= liste des effectifs
   \begingroup% ouvrir un groupe dans lequel se fait tout le processus
      \setsepchar{,}% déclarer que la virgule est le séparateur entre les effectifs
      \ignoreemptyitems% ignorer les valeurs vides, par exemple "1,,3" sera lu comme "1,3"
      \readlist*\effectifs{#1}% 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{valeur}\tabtoksb{effectif}% 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\effectifcourant\in\effectifs{% pour chaque effectif (dans la boucle, chaque effectif sera mis dans \effectifcourant)
      \eaddtotok\tabtoksa{\expandafter&\the\numexpr\effectifcourantcnt-1}% ajouter à \tabtoksa "&" puis le numéro de l'effectif -1
      \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
}
\begin{document}
Mon tableau : \buildtab{2,1,7,13,14,8,5,6,4,1,9}
\end{document}


Merci bien, ça va beaucoup m'aider :)
"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: 2664
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 » Lundi 03 Juin 2019, 20:57

un bon petit a écrit:
Mikelenain a écrit:(j'avoue que tout votre code est pour moi un mystère, pas seulement \newtoks ou \def qui sont certainement ce qui me posent le moins de problème)

La programmation en TeX est assez hermétique au premier abord.

J'avoue .... j'ai une petite expérience en C et en php/mysql mais là, c'est assez beurk :s

un bon petit a écrit:J'ai commenté le code en essayant d'être le plus explicite possible.
Code: Tout sélectionner
\documentclass{article}
\usepackage{listofitems}
\def\eaddtotok#1#2{#1\expandafter\expandafter\expandafter{\expandafter\the\expandafter#1#2}}
\newtoks\tabtoksa\newtoks\tabtoksb
\def\buildtab#1{% #1= liste des effectifs
   \begingroup% ouvrir un groupe dans lequel se fait tout le processus
      \setsepchar{,}% déclarer que la virgule est le séparateur entre les effectifs
      \ignoreemptyitems% ignorer les valeurs vides, par exemple "1,,3" sera lu comme "1,3"
      \readlist*\effectifs{#1}% 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{valeur}\tabtoksb{effectif}% 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\effectifcourant\in\effectifs{% pour chaque effectif (dans la boucle, chaque effectif sera mis dans \effectifcourant)
      \eaddtotok\tabtoksa{\expandafter&\the\numexpr\effectifcourantcnt-1}% ajouter à \tabtoksa "&" puis le numéro de l'effectif -1
      \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
}
\begin{document}
Mon tableau : \buildtab{2,1,7,13,14,8,5,6,4,1,9}
\end{document}


Merci bien, ça va beaucoup m'aider :)

Mais que signifie "\eaddtotok" ? J'ai vu plus haut que vous utilisiez "\gaddtotok", y a-t-il une différence fondamentale ?

À quoi sert "\expandafter" que vous utilisez si souvent ? Est-ce un espace (je n'y crois pas mais c'est la seule hypothèse que je vois pour le moment) ?
"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: 2664
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 » Mardi 04 Juin 2019, 16:49

Mikelenain a écrit:Mais que signifie "\eaddtotok" ? J'ai vu plus haut que vous utilisiez "\gaddtotok", y a-t-il une différence fondamentale ?

On appelle les macros comme on le veut. J'aurais pu les appeler \turlututu et \chapeaupointu que ça aurait aussi bien fonctionné !
Après, il faut essayer de mettre du sens dans le nom des macros : pour moi (et d'autres) "g" est censé signifier "global" tandis que que "e" signifie développé (expanded an anglais).

Mikelenain a écrit:À quoi sert "\expandafter" que vous utilisez si souvent ? Est-ce un espace (je n'y crois pas mais c'est la seule hypothèse que je vois pour le moment) ?

\expandafter<token1><token2> développe 1 fois le <token2> sans toucher à <token1>. Du coup si <token2> est une macro (on a donc \expandafter<token1><macro>), et bien le \expandafter la développe, c'est-à-dire en extrait son contenu (je simplifie). On se retrouve donc avec <token1><contenu de la macro>.

Le développement étant une affaire propre à TeX, étant très simple, mais aussi très compliquée et surtout très longue à expliquer, je vous renvoie à la référence que je vous indiquais.
un bon petit
Giga-utilisateur
 
Messages: 741
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar Mikelenain » Jeudi 06 Juin 2019, 11:56

un bon petit a écrit:
Mikelenain a écrit:Mais que signifie "\eaddtotok" ? J'ai vu plus haut que vous utilisiez "\gaddtotok", y a-t-il une différence fondamentale ?

On appelle les macros comme on le veut. J'aurais pu les appeler \turlututu et \chapeaupointu que ça aurait aussi bien fonctionné !
Après, il faut essayer de mettre du sens dans le nom des macros : pour moi (et d'autres) "g" est censé signifier "global" tandis que que "e" signifie développé (expanded an anglais).


D'accord, je pensais qu'il y avait un sens derrière. C'est juste un choix personnel.

un bon petit a écrit:
Mikelenain a écrit:À quoi sert "\expandafter" que vous utilisez si souvent ? Est-ce un espace (je n'y crois pas mais c'est la seule hypothèse que je vois pour le moment) ?

\expandafter<token1><token2> développe 1 fois le <token2> sans toucher à <token1>. Du coup si <token2> est une macro (on a donc \expandafter<token1><macro>), et bien le \expandafter la développe, c'est-à-dire en extrait son contenu (je simplifie). On se retrouve donc avec <token1><contenu de la macro>.

Le développement étant une affaire propre à TeX, étant très simple, mais aussi très compliquée et surtout très longue à expliquer, je vous renvoie à la référence que je vous indiquais.

J'ai vu cela dans le bouquin pré-cité. Je n'ai pas vraiment compris mais je vais insister. Les vacances approchant, j'aurais plus de temps.

Une dernière question si je puis me permettre : dans votre code, quelle est la variable contenant les valeurs de la première ligne ? Quel est le mécanisme les incrémentant ?

Pour la première je pense que c'est \the\numexpr mais je n'en suis pas sûr
Pour la seconde je ne vois absolument pas :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: 2664
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 rebouxo » Jeudi 06 Juin 2019, 16:34

Je fais un peu de pub pour le bouquin de Christian. Très bien fait, pédagogique sur un sujet aride.
Il n'y a pas de variable en TeX, seulement des macros qui remplacent (expandent) leur contenu lorsqu'elles sont appelées.

Olivier
A line is a point that went for a walk. Paul Klee
Par solidarité, pas de MP
rebouxo
Modérateur
 
Messages: 6948
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar pzorba75 » Jeudi 06 Juin 2019, 18:35

Comment peut-on acheter ce livre pour l'utiliser en simultané avec la version pdf maintenant disponible à l'écran? Je ne vois plus cette option sur les pages où l'auteur intervient.
On se lasse de tout, excepté d'apprendre.
Virgile
pzorba75
Kilo-utilisateur
 
Messages: 167
Inscription: Mardi 20 Août 2013, 03:50
Localisation: Paris
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar un bon petit » Jeudi 06 Juin 2019, 20:18

Mikelenain a écrit:D'accord, je pensais qu'il y avait un sens derrière. C'est juste un choix personnel.

En programmation, les noms des macros, c'est toujours assez personnel et chacun a ses petites habitudes...


Mikelenain a écrit:Une dernière question si je puis me permettre : dans votre code, quelle est la variable contenant les valeurs de la première ligne ?

C'est \effectifcourantcnt. C'est une macro automatiquement créée par listofitems qui est incrémentée à chaque tour de boucle : elle reflète donc le nombre de tour de boucle effectués.

Mikelenain a écrit:Quel est le mécanisme les incrémentant ?

Le mécanisme est celui de listofitems. Dans la boucle \foreachitem, la macro \effectifcourantcnt contient le numéro de l'effectif en cours (en commençant par 1 pour le 1er élément). À chaque fois, il faut lui soustraire 1 (à l'aide de \the\numexpr) puisque vous voulez que les valeurs commencent à 0 dans votre tableau.

Pour la seconde ligne, il est dit que
Code: Tout sélectionner
\eaddtotok\tabtoksb{\expandafter&\effectifcourant}% ajouter à \tabtoksb "&" puis l'effectif en cours

ce qui signifie qu'à chaque tour de boucle, il est ajouté à \tabtoksb le "&" et le contenu de la macro \effectifcourant qui est la macro itérative de la boucle : celle qui contient tour à tour chaque élément de la liste d'effectifs.
Dernière édition par un bon petit le Jeudi 06 Juin 2019, 21:10, édité 1 fois.
un bon petit
Giga-utilisateur
 
Messages: 741
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 » Jeudi 06 Juin 2019, 20:20

pzorba75 a écrit:Comment peut-on acheter ce livre pour l'utiliser en simultané avec la version pdf maintenant disponible à l'écran? Je ne vois plus cette option sur les pages où l'auteur intervient.

Ce livre est toujours en vente chez lulu.com, comme il l'a été depuis le début...
un bon petit
Giga-utilisateur
 
Messages: 741
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: [Résolu] Tabular et multido

Messagepar Mikelenain » Vendredi 07 Juin 2019, 07:48

Bonjour,

De bon matin, j'ai modifié le code pour obtenir un truc ressemblant à ce que je souhaite pour un autre exercice :
Code: Tout sélectionner
\documentclass{article}
\usepackage{listofitems}
\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{Jour}\tabtoksb{Durée}% 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}% ajouter à \tabtoksa "&" puis le nom du jour courant
   }%
   
   \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
}

\begin{document}

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


\end{document}


Assez fier de moi, merci à un bon petit pour son aide.

Étape suivante pour moi :
Faire tracer un diagramme (en bâtons, par exemple) et faire calculer des fréquences, des ECC ...

Mais ça, ça se fera sur mes prochaines heures de perm de la journé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: 2664
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 » Vendredi 07 Juin 2019, 09:29

Voilà la solution avec un tableau ET un diagramme en bâtons, gérés dynamiquement :

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}


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

\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{Jour}\tabtoksb{Durée}% 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}% ajouter à \tabtoksa "&" puis le nom du jour courant
   }%
   
   \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}[0]
{
   \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){Jour}
   \psline[arrowscale=2]{->}(0,0)(0,60)
   \rput(0.5,65){Durée (en min)}
   \end{pspicture*}
}

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

\begin{document}

\readlist*\jours{Lundi,Mardi,Mercredi,Jeudi,Vendredi}
\readlist*\effectifs{20,15,45,20,15}

\buildtab{\jours}{\effectifs}

\builddiagbatons

\end{document}
"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: 2664
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, 17:59

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

On peut rendre le truc un peu plus automatique. J'ai également mis à profit les possibilités de listofitems pour ne lire qu'une seule liste de la forme <jour>/<valeur>.

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\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{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}%
}

\def\builddiagbatons{%
   \psset{xunit=1cm, yunit=0.1cm}%
   \begin{pspicture*}(-1,-15)({\number\numexpr\dayslen+2},{\the\numexpr\maxval+20})
      \multido{\i=1+1}{\dayslen}{%
         \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){Jour}%
      \psline[arrowscale=2]{->}(0,0)(0,\maxval)%
      \rput(0.5,{\the\numexpr\maxval+5}){Durée (en min)}%
   \end{pspicture*}%
}
\begin{document}
\readdays{Lundi/35,Mardi/20,Mercredi/40,Jeudi/20,Vendredi/15}
\buildtab\par
\builddiagbatons
\bigbreak

\readdays{Lundi/55,Mardi/35,Mercredi/40,Jeudi/65,Vendredi/20,Samedi/60,Dimanche/25}
\buildtab\par
\builddiagbatons
\end{document}
un bon petit
Giga-utilisateur
 
Messages: 741
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Suivante

Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Proximic [Spider], Yandex [Bot] et 14 invités