Page 1 sur 1

Macro

MessagePosté: Samedi 08 Décembre 2012, 09:14
par SB
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

Re: macro

MessagePosté: Samedi 08 Décembre 2012, 09:40
par evariste_G
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.
}

Re: macro

MessagePosté: Samedi 08 Décembre 2012, 09:47
par un bon petit
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

Re: macro

MessagePosté: Samedi 08 Décembre 2012, 17:29
par SB
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é 136 fois


SB

Re: macro

MessagePosté: Samedi 08 Décembre 2012, 19:04
par un bon petit
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...

Re: macro

MessagePosté: Samedi 08 Décembre 2012, 19:15
par SB
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