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.
erwanadam
Utilisateur confirmé
Utilisateur confirmé
Messages : 18
Inscription : lundi 01 août 2016, 17:13

[Résolu] Tabular et multido

Message par erwanadam »

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 modification par erwanadam le mercredi 17 août 2016, 19:13, modifié 1 fois.

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

Re: Tabular et multido

Message par un bon petit »

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}

erwanadam
Utilisateur confirmé
Utilisateur confirmé
Messages : 18
Inscription : lundi 01 août 2016, 17:13

Re: Tabular et multido

Message par erwanadam »

Merci! C'est exactement ce qu'il me fallait.

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

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

Re: [Résolu] Tabular et multido

Message par un bon petit »

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}

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

un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 794
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'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)

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 »

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

un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 794
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'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}

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

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

Re: [Résolu] Tabular et multido

Message par un bon petit »

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.

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

rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Re: [Résolu] Tabular et multido

Message par rebouxo »

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.

pzorba75
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 201
Inscription : mardi 20 août 2013, 04:50
Localisation : Paris

Re: [Résolu] Tabular et multido

Message par pzorba75 »

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

un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 794
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'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 modification par un bon petit le jeudi 06 juin 2019, 22:10, modifié 1 fois.

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

Re: [Résolu] Tabular et multido

Message par un bon petit »

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

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,

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

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

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

Re: [Résolu] Tabular et multido

Message par un bon petit »

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}