Macro

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.

Macro

Messagepar SB » Samedi 08 Décembre 2012, 09:14

Bonjour,

je souhaiterais faire une macro/commande qui admet 1+6 paramètres, le premier allant de 1 à 11 pour désigner un patron de cube et les six autres sont des nombres écrits sur les faces du patron.
Je n'ai jamais programmé avec latex, j'aimerais avoir quelques conseils. J'ai bien une solution assez brutale que je vais creuser, mais peut-être y a-t-il une manière élégante de s'y prendre.

D'avance merci pour la peine prise à me répondre,
SB
SB
Kilo-utilisateur
 
Messages: 231
Inscription: Lundi 07 Juillet 2008, 07:15
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: macro

Messagepar evariste_G » Samedi 08 Décembre 2012, 09:40

Bonjour.
Je n'ai pas compris la fonction du premier paramètre : "un nombre compris entre 1 et 11 pour désigner le patron d'un cube" ? Qu'est-ce que cela veut-dire ?

Sinon, pour une macro, on peut par exemple avoir la syntaxe suivante :

Code: Tout sélectionner
\newcommand*{\cube}[6]
{
Lignes pour dessiner ce que l'on veut ... où #1 représente le 1er paramètre, #2 le second, etc.
}
Mathématiques, LaTeX et Python : http://www.mathweb.fr
Cours de math, aide à distance : https://cours-particuliers-bordeaux.fr/
evariste_G
Téra-utilisateur
 
Messages: 1419
Inscription: Vendredi 19 Décembre 2008, 19:13
Localisation: Bordeaux
Statut actuel: Actif et salarié | Enseignant

Re: macro

Messagepar un bon petit » Samedi 08 Décembre 2012, 09:47

Le code ci-dessous s'inspire très largement de celui que j'avais donné ici :
Code: Tout sélectionner
\documentclass[10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xstring}
\usepackage{pstricks}
\usepackage[frenchb]{babel}
\makeatletter
\def\name@env{patron}
\newcommand\calc@maxcol[1]{%
   \def\max@col{0}%
   \def\remain@body{#1\\}%
   \loop
      \StrBefore\remain@body{\noexpand\\}[\current@line]%
      \StrCount{\current@line&}&[\tmp@col]%
      \ifnum\tmp@col>\max@col\let\max@col\tmp@col\fi
      \StrBehind\remain@body{\noexpand\\}[\remain@body]%
      \unless\ifx\remain@body\@empty
   \repeat}

\long\def\get@body@tab#1\end{%
   \expandafter\def\expandafter\body@tab\expandafter{\body@tab#1}\test@end@body}

\newcommand\test@end@body[1]{%
   \def\temp@{#1}%
   \ifx\temp@\name@env
      \def\temp@{\end{#1}}%
      \expandafter\temp@
   \else
      \expandafter\def\expandafter\body@tab\expandafter{\body@tab\end{#1}}%
      \expandafter\get@body@tab
   \fi}

\newcommand\patron@grab@arg[2][]{%
   \let\body@tab\@empty
   \edef\temp@{{framearc=0,dimen=middle\ifx\@empy#1\@empty\else,#1\fi}}\expandafter\psset\temp@
   \def\patron@arg{#2}%
   \get@body@tab}

\newenvironment{patron}
   {\expandarg
   \@makeother\!%
   \patron@grab@arg
   }%
   {\unless\ifx\@body@tab\@empty
      \IfEndWith\body@tab{\noexpand\\ }%
         {\StrGobbleRight\body@tab2[\body@tab]}%
         {\IfEndWith\body@tab{\noexpand\\}{\StrGobbleRight\body@tab1[\body@tab]}\relax}%
      \expandafter\calc@maxcol\expandafter{\body@tab}%
      \edef\tab@preamble{{*{\max@col}{c}}}%
      \StrSubstitute{\expandafter\cell@start\body@tab\cell@end}&{\noexpand\cell@end&\cell@start}[\body@tab]%
      \StrSubstitute\body@tab{\noexpand\\}{\noexpand\cell@end\\\cell@start}[\body@tab]%
      \def\arraystretch{0}\tabcolsep\z@
      \expandafter\tabular\tab@preamble\body@tab\endtabular
   \fi}

\def\cell@start#1\cell@end{%
   \StrDel{\noexpand#1}\space[\cell@content]%
   \unless\ifx\@empty\cell@content
      \IfBeginWith\cell@content[%
         {\StrBetween\cell@content[][\opt@color]%
         \StrBehind\cell@content][\cell@content]}%
         {\let\opt@color\@empty}%
      \edef\opt@color{\unless\ifx\opt@color\@empty[fillstyle=solid,fillcolor=\opt@color]\fi}%
      \pspicture(1,1)%
         \expandafter\psframe\opt@color(0,0)(1,1)%
         \rput[c](0.5,0.5){\hbox to \z@{\hss\patron@arg\cell@content\hss}}%
      \endpspicture
   \fi}

\makeatother
\begin{document}
Un patron :
\begin{patron}{}
   &  1\\
 2 &  3 &  5  &4 \\
   &  6
\end{patron}
\medskip

Un autre :
\begin{patron}{\Large\bfseries\color{red}}
[gray]1                                  \\
[blue]2 & [green]3 & [yellow]5 & [pink]4 \\
        &          &           &[orange]6\\
\end{patron}

Un dernier :
\begin{patron}[unit=0.75cm,linewidth=0.6pt,linecolor=blue,framearc=0.2]{\bfseries}
[pink]5 & [gray]1                             \\
        & [blue!50]3                          \\
        & [green!60]6 & [orange!70!green!80]2 \\
        &             & [green!90!blue!30]4
\end{patron}
\end{document}


Résultat :
capture10.png
un bon petit
Giga-utilisateur
 
Messages: 704
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: macro

Messagepar SB » Samedi 08 Décembre 2012, 17:29

Merci,

11 parce qu'à isométrie près il y a 11 patrons de cube et que je voulais automatiser des exercices de calcul.
Je m'en suis sorti en utilisant excel qui m'a permis de faire la macro suivante :
Code: Tout sélectionner
\newcommand*{\NombreCubePatron}[7]
{
\psset{unit=1.3cm}
\ifthenelse{\equal{#1}{1}}
{\begin{pspicture}(0,0)(5,3)
\rput{0}(2.5,1.5){\psframebox[linecolor=white]{#5}} \psline(2,1)(3,1)(3,2)(2,2)(2,1) \psline{->}(2,1)(3,2)\rput{0}(3.5,1.5){\psframebox[linecolor=white]{#6}} \psline(3,1)(4,1)(4,2)(3,2)(3,1) \rput{0}(4.5,1.5){\psframebox[linecolor=white]{#7}} \psline(4,1)(5,1)(5,2)(4,2)(4,1) \rput{0}(0.5,2.5){\psframebox[linecolor=white]{#2}} \psline(0,2)(1,2)(1,3)(0,3)(0,2) \rput{0}(1.5,2.5){\psframebox[linecolor=white]{#3}} \psline(1,2)(2,2)(2,3)(1,3)(1,2) \rput{0}(2.5,2.5){\psframebox[linecolor=white]{#4}} \psline(2,2)(3,2)(3,3)(2,3)(2,2)
\end{pspicture}}{}
\ifthenelse{\equal{#1}{2}}
{\begin{pspicture}(0,0)(5,3)
\rput{0}(1.5,0.5){\psframebox[linecolor=white]{#2}} \psline(1,0)(2,0)(2,1)(1,1)(1,0) \rput{0}(1.5,1.5){\psframebox[linecolor=white]{#3}} \psline(1,1)(2,1)(2,2)(1,2)(1,1) \rput{0}(2.5,1.5){\psframebox[linecolor=white]{#5}} \psline(2,1)(3,1)(3,2)(2,2)(2,1) \psline{->}(2,1)(3,2)\rput{0}(3.5,1.5){\psframebox[linecolor=white]{#6}} \psline(3,1)(4,1)(4,2)(3,2)(3,1) \rput{0}(4.5,1.5){\psframebox[linecolor=white]{#7}} \psline(4,1)(5,1)(5,2)(4,2)(4,1) \rput{0}(1.5,2.5){\psframebox[linecolor=white]{#4}} \psline(1,2)(2,2)(2,3)(1,3)(1,2)
\end{pspicture}}{}
\ifthenelse{\equal{#1}{3}}
{\begin{pspicture}(0,0)(5,3)
\rput{0}(1.5,0.5){\psframebox[linecolor=white]{#2}} \psline(1,0)(2,0)(2,1)(1,1)(1,0) \rput{0}(1.5,1.5){\psframebox[linecolor=white]{#3}} \psline(1,1)(2,1)(2,2)(1,2)(1,1) \rput{0}(2.5,1.5){\psframebox[linecolor=white]{#5}} \psline(2,1)(3,1)(3,2)(2,2)(2,1) \psline{->}(2,1)(3,2)\rput{0}(3.5,1.5){\psframebox[linecolor=white]{#6}} \psline(3,1)(4,1)(4,2)(3,2)(3,1) \rput{0}(4.5,1.5){\psframebox[linecolor=white]{#7}} \psline(4,1)(5,1)(5,2)(4,2)(4,1) \rput{0}(2.5,2.5){\psframebox[linecolor=white]{#4}} \psline(2,2)(3,2)(3,3)(2,3)(2,2)
\end{pspicture}}{}
\ifthenelse{\equal{#1}{4}}
{\begin{pspicture}(0,0)(5,3)
\rput{0}(1.5,0.5){\psframebox[linecolor=white]{#2}} \psline(1,0)(2,0)(2,1)(1,1)(1,0) \rput{0}(1.5,1.5){\psframebox[linecolor=white]{#3}} \psline(1,1)(2,1)(2,2)(1,2)(1,1) \rput{0}(2.5,1.5){\psframebox[linecolor=white]{#5}} \psline(2,1)(3,1)(3,2)(2,2)(2,1) \psline{->}(2,1)(3,2)\rput{0}(3.5,1.5){\psframebox[linecolor=white]{#6}} \psline(3,1)(4,1)(4,2)(3,2)(3,1) \rput{0}(4.5,1.5){\psframebox[linecolor=white]{#7}} \psline(4,1)(5,1)(5,2)(4,2)(4,1) \rput{0}(3.5,2.5){\psframebox[linecolor=white]{#4}} \psline(3,2)(4,2)(4,3)(3,3)(3,2)
\end{pspicture}}{}
\ifthenelse{\equal{#1}{5}}
{\begin{pspicture}(0,0)(5,3)
\rput{0}(1.5,0.5){\psframebox[linecolor=white]{#2}} \psline(1,0)(2,0)(2,1)(1,1)(1,0) \rput{0}(1.5,1.5){\psframebox[linecolor=white]{#3}} \psline(1,1)(2,1)(2,2)(1,2)(1,1) \rput{0}(2.5,1.5){\psframebox[linecolor=white]{#5}} \psline(2,1)(3,1)(3,2)(2,2)(2,1) \psline{->}(2,1)(3,2)\rput{0}(3.5,1.5){\psframebox[linecolor=white]{#6}} \psline(3,1)(4,1)(4,2)(3,2)(3,1) \rput{0}(4.5,1.5){\psframebox[linecolor=white]{#7}} \psline(4,1)(5,1)(5,2)(4,2)(4,1) \rput{0}(4.5,2.5){\psframebox[linecolor=white]{#4}} \psline(4,2)(5,2)(5,3)(4,3)(4,2)
\end{pspicture}}{}
\ifthenelse{\equal{#1}{6}}
{\begin{pspicture}(0,0)(5,3)
\rput{0}(2.5,0.5){\psframebox[linecolor=white]{#2}} \psline(2,0)(3,0)(3,1)(2,1)(2,0) \rput{0}(1.5,1.5){\psframebox[linecolor=white]{#3}} \psline(1,1)(2,1)(2,2)(1,2)(1,1) \rput{0}(2.5,1.5){\psframebox[linecolor=white]{#5}} \psline(2,1)(3,1)(3,2)(2,2)(2,1) \psline{->}(2,1)(3,2)\rput{0}(3.5,1.5){\psframebox[linecolor=white]{#6}} \psline(3,1)(4,1)(4,2)(3,2)(3,1) \rput{0}(4.5,1.5){\psframebox[linecolor=white]{#7}} \psline(4,1)(5,1)(5,2)(4,2)(4,1) \rput{0}(3.5,2.5){\psframebox[linecolor=white]{#4}} \psline(3,2)(4,2)(4,3)(3,3)(3,2)
\end{pspicture}}{}
\ifthenelse{\equal{#1}{7}}
{\begin{pspicture}(0,0)(5,3)
\rput{0}(2.5,0.5){\psframebox[linecolor=white]{#2}} \psline(2,0)(3,0)(3,1)(2,1)(2,0) \rput{0}(1.5,1.5){\psframebox[linecolor=white]{#3}} \psline(1,1)(2,1)(2,2)(1,2)(1,1) \rput{0}(2.5,1.5){\psframebox[linecolor=white]{#5}} \psline(2,1)(3,1)(3,2)(2,2)(2,1) \psline{->}(2,1)(3,2)\rput{0}(3.5,1.5){\psframebox[linecolor=white]{#6}} \psline(3,1)(4,1)(4,2)(3,2)(3,1) \rput{0}(4.5,1.5){\psframebox[linecolor=white]{#7}} \psline(4,1)(5,1)(5,2)(4,2)(4,1) \rput{0}(2.5,2.5){\psframebox[linecolor=white]{#4}} \psline(2,2)(3,2)(3,3)(2,3)(2,2)
\end{pspicture}}{}
\ifthenelse{\equal{#1}{8}}
{\begin{pspicture}(0,0)(5,3)
\rput{0}(2.5,0.5){\psframebox[linecolor=white]{#2}} \psline(2,0)(3,0)(3,1)(2,1)(2,0) \rput{0}(2.5,1.5){\psframebox[linecolor=white]{#5}} \psline(2,1)(3,1)(3,2)(2,2)(2,1) \psline{->}(2,1)(3,2)\rput{0}(3.5,1.5){\psframebox[linecolor=white]{#6}} \psline(3,1)(4,1)(4,2)(3,2)(3,1) \rput{0}(4.5,1.5){\psframebox[linecolor=white]{#7}} \psline(4,1)(5,1)(5,2)(4,2)(4,1) \rput{0}(1.5,2.5){\psframebox[linecolor=white]{#3}} \psline(1,2)(2,2)(2,3)(1,3)(1,2) \rput{0}(2.5,2.5){\psframebox[linecolor=white]{#4}} \psline(2,2)(3,2)(3,3)(2,3)(2,2)
\end{pspicture}}{}
\ifthenelse{\equal{#1}{9}}
{\begin{pspicture}(0,0)(5,3)
\rput{0}(3.5,0.5){\psframebox[linecolor=white]{#2}} \psline(3,0)(4,0)(4,1)(3,1)(3,0) \rput{0}(2.5,1.5){\psframebox[linecolor=white]{#5}} \psline(2,1)(3,1)(3,2)(2,2)(2,1) \psline{->}(2,1)(3,2)\rput{0}(3.5,1.5){\psframebox[linecolor=white]{#6}} \psline(3,1)(4,1)(4,2)(3,2)(3,1) \rput{0}(4.5,1.5){\psframebox[linecolor=white]{#7}} \psline(4,1)(5,1)(5,2)(4,2)(4,1) \rput{0}(1.5,2.5){\psframebox[linecolor=white]{#3}} \psline(1,2)(2,2)(2,3)(1,3)(1,2) \rput{0}(2.5,2.5){\psframebox[linecolor=white]{#4}} \psline(2,2)(3,2)(3,3)(2,3)(2,2)
\end{pspicture}}{}
\ifthenelse{\equal{#1}{10}}
{\begin{pspicture}(0,0)(5,3)
\rput{0}(3.5,0.5){\psframebox[linecolor=white]{#2}} \psline(3,0)(4,0)(4,1)(3,1)(3,0) \rput{0}(4.5,0.5){\psframebox[linecolor=white]{#7}} \psline(4,0)(5,0)(5,1)(4,1)(4,0) \rput{0}(2.5,1.5){\psframebox[linecolor=white]{#5}} \psline(2,1)(3,1)(3,2)(2,2)(2,1) \psline{->}(2,1)(3,2)\rput{0}(3.5,1.5){\psframebox[linecolor=white]{#6}} \psline(3,1)(4,1)(4,2)(3,2)(3,1) \rput{0}(1.5,2.5){\psframebox[linecolor=white]{#3}} \psline(1,2)(2,2)(2,3)(1,3)(1,2) \rput{0}(2.5,2.5){\psframebox[linecolor=white]{#4}} \psline(2,2)(3,2)(3,3)(2,3)(2,2)
\end{pspicture}}{}
\ifthenelse{\equal{#1}{11}}
{\begin{pspicture}(0,0)(5,3)
\rput{0}(4.5,0.5){\psframebox[linecolor=white]{#2}} \psline(4,0)(5,0)(5,1)(4,1)(4,0) \rput{0}(2.5,1.5){\psframebox[linecolor=white]{#5}} \psline(2,1)(3,1)(3,2)(2,2)(2,1) \psline{->}(2,1)(3,2)\rput{0}(3.5,1.5){\psframebox[linecolor=white]{#6}} \psline(3,1)(4,1)(4,2)(3,2)(3,1) \rput{0}(4.5,1.5){\psframebox[linecolor=white]{#7}} \psline(4,1)(5,1)(5,2)(4,2)(4,1) \rput{0}(1.5,2.5){\psframebox[linecolor=white]{#3}} \psline(1,2)(2,2)(2,3)(1,3)(1,2) \rput{0}(2.5,2.5){\psframebox[linecolor=white]{#4}} \psline(2,2)(3,2)(3,3)(2,3)(2,2)
\end{pspicture}}{}
\psset{unit=1cm}
}


ensuite un coup de python pour générer des nombres_cubes au hasard :
Code: Tout sélectionner
#-*- coding:Latin-1 -*-
#!/usr/bin/python

import os
import itertools
import random

copiefichier=[ ]
copiefichier.append(r"\begin{myenumerate}"+"\n")
for i in range(50):
    AleaPatron = random.randint(1,11)
    AleaPermS= random.randint(0,40319)
    LstPermS = list(itertools.permutations([1,2,3,4,5,6,7,8]))
    LstProdS= [0,0,0,0,0,0]
    LstProdS[0]=LstPermS[AleaPermS][0]*LstPermS[AleaPermS][1]*LstPermS[AleaPermS][4]*LstPermS[AleaPermS][5]
    LstProdS[1]=LstPermS[AleaPermS][0]*LstPermS[AleaPermS][3]*LstPermS[AleaPermS][4]*LstPermS[AleaPermS][7]
    LstProdS[2]=LstPermS[AleaPermS][2]*LstPermS[AleaPermS][3]*LstPermS[AleaPermS][6]*LstPermS[AleaPermS][7]
    LstProdS[3]=LstPermS[AleaPermS][0]*LstPermS[AleaPermS][1]*LstPermS[AleaPermS][2]*LstPermS[AleaPermS][3]
    LstProdS[4]=LstPermS[AleaPermS][1]*LstPermS[AleaPermS][2]*LstPermS[AleaPermS][5]*LstPermS[AleaPermS][6]
    LstProdS[5]=LstPermS[AleaPermS][4]*LstPermS[AleaPermS][5]*LstPermS[AleaPermS][6]*LstPermS[AleaPermS][7]
    copiefichier.append(r"\item "+"\n")
    copiefichier.append(r"\begin{minipage}{0.5\textwidth}"+"\n")
    copiefichier.append(r"\NombreCubePatron{"+str(AleaPatron)+"}{"+str(LstProdS[0])+"}{"+str(LstProdS[1])+"}{"+str(LstProdS[2])+"}{"+str(LstProdS[3])+"}{"+str(LstProdS[4])+"}{"+str(LstProdS[5])+"}"+"\n")
    copiefichier.append(r"\end{minipage}"+"\n")
    copiefichier.append(r"\begin{minipage}{0.5\textwidth}"+"\n")
    for p in LstPermS:
        if p[2]*p[3]*p[6]*p[7]==LstProdS[2] and p[0]*p[3]*p[4]*p[7]==LstProdS[1] and p[0]*p[1]*p[2]*p[3]==LstProdS[3] and p[1]*p[2]*p[5]*p[6]==LstProdS[4] and p[4]*p[5]*p[6]*p[7]==LstProdS[5] and p[0]*p[1]*p[4]*p[5]==LstProdS[0]:
            copiefichier.append(r"\NombreCubePerspective{"+str(p[0])+"}{"+str(p[1])+"}{"+str(p[2])+"}{"+str(p[3])+"}{"+str(p[4])+"}{"+str(p[5])+"}{"+str(p[6])+"}{"+str(p[7])+r"}\\"+"\n")
    copiefichier.append(r"\end{minipage}"+"\n")
copiefichier.append(r"\end{myenumerate}"+"\n")
fichier_aux = "E99990.tex"
logfile = open(fichier_aux,'w')
for lignefichier in copiefichier:
    logfile.write(lignefichier)
logfile.close()


et voici ce que j'obtients pour 50 tirages au hasard :
nombres_cubes.pdf
(83.3 Kio) Téléchargé 127 fois


SB
SB
Kilo-utilisateur
 
Messages: 231
Inscription: Lundi 07 Juillet 2008, 07:15
Statut actuel: Actif et salarié | Enseignant

Re: macro

Messagepar un bon petit » Samedi 08 Décembre 2012, 19:04

SB a écrit:11 parce qu'à isométrie près il y a 11 patrons de cube et que je voulais automatiser des exercices de calcul.

Très bien.

Il n'empêche que je n'ai toujours pas compris ce que tu cherches... Dessiner des patrons ? Trouver les patrons différents ? Rédiger des exercices ? Des exercices de calcul mais je ne vois pas de quel genre de calcul il s'agit. Automatiser la rédaction de ces exercices ? Et avec quelles contraintes ? Etc...
un bon petit
Giga-utilisateur
 
Messages: 704
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: macro

Messagepar SB » Samedi 08 Décembre 2012, 19:15

Je suis arrivé à mes fins, regardez le pdf du message précédent :
-> Je donne un patron au hasard avec des produits de nombres entiers de 1 à 8 est sur les faces il s'agit de retrouver 1,2,3 ... 8 (qui sont utilisés une et une seule fois dans les produits associés aux faces) sur les sommets du cube, la face fléchée donnant le lien avec le cube en perspective

S
SB
Kilo-utilisateur
 
Messages: 231
Inscription: Lundi 07 Juillet 2008, 07:15
Statut actuel: Actif et salarié | Enseignant


Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: DotBot [Crawler], Exabot [Bot], Google Adsense [Bot], Proximic [Spider] et 5 invités