Page 2 sur 2

Re: [Résolu] Représenter une multiplication par jalousie

MessagePosté: Jeudi 07 Mars 2013, 08:03
par SB
Bonjour,

j'ai récupéré le code de pg, et je souhaitais le modifier pour colorer des chiffres. J'ai pu le faire sans difficulté pour l'affichage en dessous tu tableau, par contre je ne sais pas le faire pour les chiffres qui sont en bordure du tableau.
-> chiffres du multiplicateur en bleu
\definecolor{bleu}{rgb}{0.4,0.2,1} \newrgbcolor{bleu}{0.4 0.2 1}
-> chiffres du multiplicande en vert
\definecolor{vert}{rgb}{0.1,0.6,0} \newrgbcolor{vert}{0.1 0.6 0}
-> chiffres du produit en rouge
\definecolor{rouge}{rgb}{1,0,0} \newrgbcolor{rouge}{1 0 0}

Est-ce possible ?

Merci

Re: [Résolu] Représenter une multiplication par jalousie

MessagePosté: Jeudi 07 Mars 2013, 09:22
par pg
Il suffit de rajouter des \noexpand\color{...} aux bons endroits :

tableau_jalousie_couleur.png
tableau_jalousie_couleur.png (15.14 Kio) Vu 681 fois


Code: Tout sélectionner
\documentclass{article}
\usepackage[frenchb]{babel}% pour \addto
\newcommand*\eaddto[2]{% version développée de \addto
   \edef\tmp{#2}%
   \expandafter\addto
   \expandafter#1%
   \expandafter{\tmp}%
}
\usepackage{ifthen}% pour \whiledo
\usepackage{slashbox}% pour le tableau

\usepackage{xcolor}
\definecolor{multiplicateur}{rgb}{0.4,0.2,1}
\definecolor{multiplicande}{rgb}{0.1,0.6,0}
\definecolor{resultatmultiplication}{rgb}{1,0,0}

\makeatletter
\def\@nameedef#1{\expandafter\edef\csname #1\endcsname}
\newcounter{tableaujalousie@somme@chiffres}
\newcommand{\tableaujalousie}[2]{%
%Calcul du nombre de colonnes et de lignes
\tableaujalousie@process@number{cols}{#1}%
\tableaujalousie@process@number{rows}{#2}%
% Calcul des éléments du tableau (sauf retenues et sommes partielles)
\def\tableaujalousie@i{1}%
\def\tableaujalousie@j{1}%
\whiledo{\tableaujalousie@i<\numexpr\tableaujalousie@nbrows+1\relax}{%
  \def\tableaujalousie@j{1}%
  \whiledo{\tableaujalousie@j<\numexpr\tableaujalousie@nbcols+1\relax}{%
    \tableaujalousie@compute@product
      {\tableaujalousie@i}
      {\tableaujalousie@j}%
    \edef\tableaujalousie@j{\number\numexpr\tableaujalousie@j+1\relax}%
  }%
  \edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}%
}%
% Création de la liste des indices correspondant au k-ième chiffre du total
\def\tableaujalousie@i{0}%
\whiledo{\tableaujalousie@i<\numexpr\tableaujalousie@nbcols+\tableaujalousie@nbrows\relax}{%
  \tableaujalousie@calcule@liste@indices{\tableaujalousie@i}%
  \edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}%
}%
% Boucle pour calculer les sommes de chiffres et les retenues
\@namedef{tableaujalousie@retenue@0}{0}%
\def\tableaujalousie@i{0}%
\whiledo{\tableaujalousie@i<\numexpr\tableaujalousie@nbcols+\tableaujalousie@nbrows\relax}{%
   \setcounter{tableaujalousie@somme@chiffres}{0}%
  \expandafter\@for\expandafter\temp
  \expandafter:\expandafter=\expandafter{\csname
     tableaujalousie@liste@indices@\tableaujalousie@i\endcsname}%
   \do{\ifx\temp\empty
       \else\edef\result{\noexpand\tjnb\temp}%
            \addtocounter{tableaujalousie@somme@chiffres}{\result}%
       \fi}%
  \@nameedef{tableaujalousie@somme@chiffre@\tableaujalousie@i}%
      {\number\value{tableaujalousie@somme@chiffres}}%
   \tableaujalousie@process@retenue{\tableaujalousie@i}%
   \edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}
}
% Création du contenu du tableau \tableaujalousie@contenutableau
\def\tableaujalousie@contenutableau{}%
\addto\tableaujalousie@contenutableau{\multicolumn{1}{c}{}}
\def\tableaujalousie@i{1}
\whiledo{\tableaujalousie@i<\numexpr\tableaujalousie@nbcols+1\relax}{%
  \eaddto\tableaujalousie@contenutableau{%
     &\noexpand\multicolumn{1}{c}{\noexpand\color{multiplicande}\@nameuse{tableaujalousie@cols@\tableaujalousie@i}}
  }
  \edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}%
}
\eaddto\tableaujalousie@contenutableau{&\noexpand\\\noexpand\cline{2-\number\numexpr\tableaujalousie@nbcols+1\relax}}

\def\tableaujalousie@i{1}%
\whiledo{\tableaujalousie@i<\numexpr\tableaujalousie@nbrows+1\relax}{%
  \def\tableaujalousie@j{1}%
  \eaddto\tableaujalousie@contenutableau{\noexpand\color{resultatmultiplication}\@nameuse{tableaujalousie@somme@chiffre@\number\numexpr\tableaujalousie@nbcols+\tableaujalousie@nbrows-\tableaujalousie@i\relax}}
  \whiledo{\tableaujalousie@j<\numexpr\tableaujalousie@nbcols+1\relax}{%
    \eaddto\tableaujalousie@contenutableau{%
       & \noexpand\tableaujalousie@case
       {\@nameuse{tableaujalousie@\tableaujalousie@i @\tableaujalousie@j @0}}
       {\@nameuse{tableaujalousie@\tableaujalousie@i @\tableaujalousie@j @1}}
       {\ifnum\tableaujalousie@i=1
        \ifnum\@nameuse{tableaujalousie@retenue@\number\numexpr
            \tableaujalousie@nbcols+\tableaujalousie@nbrows
            -\tableaujalousie@j\relax}=0\else
          \@nameuse{tableaujalousie@retenue@\number\numexpr
            \tableaujalousie@nbcols+\tableaujalousie@nbrows
            -\tableaujalousie@j\relax}\fi\fi}
       {\ifnum\tableaujalousie@j=\tableaujalousie@nbcols\space
        \ifnum\@nameuse{tableaujalousie@retenue@\number\numexpr
            \tableaujalousie@nbrows
            -\tableaujalousie@i\relax}=0\else
          \@nameuse{tableaujalousie@retenue@\number\numexpr
            \tableaujalousie@nbrows
            -\tableaujalousie@i\relax}\fi\fi}%
    }%
    \edef\tableaujalousie@j{\number\numexpr\tableaujalousie@j+1\relax}%
  }%
  \eaddto\tableaujalousie@contenutableau{&\noexpand\color{multiplicateur}\@nameuse{tableaujalousie@rows@\tableaujalousie@i}\noexpand\\\noexpand\cline{2-\number\numexpr\tableaujalousie@nbcols+1\relax}}
  \edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}%
}%
\eaddto\tableaujalousie@contenutableau{\noexpand\multicolumn{1}{c}{}}
\def\tableaujalousie@j{1}%
\whiledo{\tableaujalousie@j<\numexpr\tableaujalousie@nbcols+1\relax}{%
  \eaddto\tableaujalousie@contenutableau{&\noexpand\multicolumn{1}{c}{\noexpand\color{resultatmultiplication}\@nameuse{tableaujalousie@somme@chiffre@\number\numexpr\tableaujalousie@nbcols-\tableaujalousie@j\relax}}}
  \edef\tableaujalousie@j{\number\numexpr\tableaujalousie@j+1\relax}%
}%
% Affichage du tableau
\begin{center}
\begin{tabular}{c|*{\tableaujalousie@nbcols}{c|}c}
\tableaujalousie@contenutableau
\end{tabular}
%\smallbreak
%$#1 \times #2 = \number\numexpr#1*#2\relax$% a commenter pour éviter tout risque d'arithmetic overflow
\smallbreak
\def\tableaujalousie@result{}
\def\tableaujalousie@i{1}
\whiledo{\tableaujalousie@i<\number\numexpr\tableaujalousie@nbcols+\tableaujalousie@nbrows+1\relax}
{\edef\tableaujalousie@result{\tableaujalousie@result\@nameuse{tableaujalousie@somme@chiffre@\number\numexpr\tableaujalousie@nbcols+\tableaujalousie@nbrows-\tableaujalousie@i\relax}}
\edef\tableaujalousie@i{\number\numexpr\tableaujalousie@i+1\relax}}
${\color{multiplicande}#1} \times {\color{multiplicateur}#2} = \color{resultatmultiplication} \expandafter\tableaujalousie@enleve@zero\expandafter{\tableaujalousie@result}$
\end{center}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% macros pour afficher les cases du tableau
\def\tableaujalousie@strut{\vrule width 0pt height 1.5em depth 0.5em}
\def\tableaujalousie@case#1#2#3#4{%
% #1 = chiffre 2
% #2 = chiffre 1
% #3 = retenue position 1
% #4 = retenue position 2
  \slashbox{\tableaujalousie@strut#1$^{#3}$}{\tableaujalousie@strut#2\rlap{$^{#4}$}}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \tableaujalousie@process@number{#1}{#2}
%  #1 = suffixe (ici, cols ou rows)
%  #2 = nombre (4735, par exemple)
%  --> lit le nombre #2 et définit
%      * #1 = nombre de chiffres de #2
%      * \tableaujalousie@#1@i = chiffre i de #2 (gauche->droite)
%  exemple : \tableaujalousie@process@number{cols}{4735} définit
%  * cols égal à 4 (nb de chiffres de 4735)
%  * \tableaujalousie@cols@1 égal à 4
%  * \tableaujalousie@cols@2 égal à 7
%  * \tableaujalousie@cols@3 égal à 3
%  * \tableaujalousie@cols@4 égal à 5
\def\tableaujalousie@process@number#1#2{%
% #1 = suffice (cols ou rows)
% #2 = nombre
  \tableaujalousie@process@number@aux{#1}{1}#2\@nil
}
\def\tableaujalousie@process@number@aux#1#2#3#4\@nil{%
% #1 = suffixe (cols ou rows)
% #2 = nombre de chiffres lus
% #3 = chiffre courant
% #4 = chiffres restant
  \ifx\\#4\\
    \@namedef{tableaujalousie@#1@#2}{#3}%
    \@nameedef{tableaujalousie@nb#1}{#2}%
  \else
    \@namedef{tableaujalousie@#1@#2}{#3}%
    \tableaujalousie@process@number@aux{#1}{\number\numexpr#2+1\relax}#4\@nil
  \fi
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \tableaujalousie@compute@product{#1}{#2}
% #1 = indice de ligne i
% #2 = indice de colonne j
% --> définit des commandes contenant les chiffres du produit \tableaujalousie@cols@j * \tableaujalousie@cols@i :
%     * tableaujalousie@i@j@0 = premier chiffre
%     * tableaujalousie@i@j@1 = second chiffre
% exemples :
%     * si \tableaujalousie@cols@j = 4 et \tableaujalousie@cols@i = 2, alors tableaujalousie@i@j@0 = 0 et tableaujalousie@i@j@1 = 8
%     * si \tableaujalousie@cols@j = 4 et \tableaujalousie@cols@i = 6, alors tableaujalousie@i@j@0 = 3 et tableaujalousie@i@j@1 = 4
\def\tableaujalousie@compute@product#1#2{%
% #1 = indice de ligne i
% #2 = indice de colonne j
  \expandafter\tableaujalousie@parse@twodigit@number\expandafter{\expandafter#1\expandafter}\expandafter{\expandafter#2\expandafter}\expandafter{%
    \number\numexpr
      \@nameuse{tableaujalousie@cols@#2}
      *
      \@nameuse{tableaujalousie@rows@#1}
    \relax
  }%
}
\def\tableaujalousie@parse@twodigit@number#1#2#3{%
% #1 = indice de ligne i
% #2 = indice de colonne j
% #3 = nombre à analyser
  \tableaujalousie@parse@twodigit@number@aux{#1}{#2}#3\@nil
}
\def\tableaujalousie@parse@twodigit@number@aux#1#2#3#4\@nil{%
% #1 = indice de ligne i
% #2 = indice de colonne j
% #3 = premier chiffre à gauche du nombre à analyser
% #4 = reste du nombre à analyser
  \ifx\\#4\\%
    \@namedef{tableaujalousie@#1@#2@0}{0}%
    \@namedef{tableaujalousie@#1@#2@1}{#3}%
  \else
    \@namedef{tableaujalousie@#1@#2@0}{#3}%
    \@namedef{tableaujalousie@#1@#2@1}{#4}%
  \fi
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \tableaujalousie@calcule@liste@indices
% #1 = chiffre k
% --> liste des (i,j,e) avec i+j+e=k, i=1,...,nbrows,
%     j=1,...,nbcols et e=0,1
\def\tableaujalousie@calcule@liste@indices#1{%
\@nameedef{tableaujalousie@liste@indices@#1}{%
  \ifnum\number\numexpr\tableaujalousie@nbcols+\tableaujalousie@nbrows+1-#1\relax>\tableaujalousie@nbrows\space
    \ifnum\number\numexpr\tableaujalousie@nbcols-#1\relax>0
      \expandafter\tableaujalousie@calcule@liste@indices@aux\number\numexpr\tableaujalousie@nbrows\number\numexpr\tableaujalousie@nbcols-#1\relax1\relax
    \else
      \expandafter\tableaujalousie@calcule@liste@indices@aux\number\numexpr\tableaujalousie@nbrows\number\numexpr\tableaujalousie@nbcols-#1+1\relax0\relax
    \fi
  \else
    \expandafter\tableaujalousie@calcule@liste@indices@aux\number\numexpr\number\numexpr(\tableaujalousie@nbcols+\tableaujalousie@nbrows-#1)\relax10\relax
  \fi}%
}
\def\tableaujalousie@calcule@liste@indices@aux#1#2#3{%
  \ifx\\#1\\%
    %
  \else
    \number\numexpr#1#2#3\relax,%
    \ifnum#3=0
      \ifnum#1>1
            \expandafter\tableaujalousie@calcule@liste@indices@aux\number\numexpr\number\numexpr#1-1\relax#2\number\numexpr#3+1\relax\relax
      \fi
    \else
      \ifnum#2<\tableaujalousie@nbcols\space
        \expandafter\tableaujalousie@calcule@liste@indices@aux\number\numexpr#1\number\numexpr#2+1\relax\number\numexpr#3-1\relax\relax
      \fi
    \fi
  \fi
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\tableaujalousie@process@retenue#1{%
% #1 = chiffre k
   \expandafter\tableaujalousie@process@retenue@aux
   \expandafter{\expandafter#1\expandafter}%
   \number\numexpr\@nameuse{tableaujalousie@somme@chiffre@#1}+\@nameuse{tableaujalousie@retenue@#1}\relax\@nil
}
\def\tableaujalousie@process@retenue@aux#1#2#3\@nil{%
  \ifx\\#3\\%
    \@nameedef{tableaujalousie@retenue@\number\numexpr#1+1\relax}{0}%
    \@nameedef{tableaujalousie@somme@chiffre@#1}{#2}%
  \else
    \@nameedef{tableaujalousie@retenue@\number\numexpr#1+1\relax}{#2}%
    \@nameedef{tableaujalousie@somme@chiffre@#1}{#3}%
  \fi
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% macro auxilliaire
\def\tjnb#1#2#3{\@nameuse{tableaujalousie@#1@#2@#3}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% macro pour enlever l'éventuel zéro au début d'un nombre
\def\tableaujalousie@enleve@zero#1{%
  \tableaujalousie@enleve@zero@aux#1\@nil
}
\def\tableaujalousie@enleve@zero@aux#1#2#3\@nil{%
  \number\numexpr#1#2\relax#3%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatother
\begin{document}

\tableaujalousie{4735}{926}

\end{document}

Re: [Résolu] Représenter une multiplication par jalousie

MessagePosté: Jeudi 07 Mars 2013, 12:44
par SB
Merci pg, vite fait et bien fait, je vais tester.

Par ailleurs lorsque je mets ce code dans le fichier où je rassemble des macros externes , j'ai un souci de compilation. Est-ce dû au fait que c'est du Tex ? Peut-on y remédier ?
(Il se peut que mon ignorance fait que je pose une question pas claire).

encore merci pour l'aide apportée.

Re: [Résolu] Représenter une multiplication par jalousie

MessagePosté: Jeudi 07 Mars 2013, 12:56
par MB
Peut-être un problème de \makeatletter et \makeatother ? (tester en commentant)

Re: [Résolu] Représenter une multiplication par jalousie

MessagePosté: Jeudi 07 Mars 2013, 20:21
par SB
Je ne comprends pas :

-> j'ai commenté comme indiqué : j'ai eu un message d'erreur une table qui ne matchait pas sa définition, différent du premier qui était une histoire de begin{document}
-> j'ai dé-commenté : et ça marche ...

merci en tout cas.

Re: [Résolu] Représenter une multiplication par jalousie

MessagePosté: Jeudi 07 Mars 2013, 22:20
par MB
Ton fichier de macros externes c'est un .sty ?

Re: [Résolu] Représenter une multiplication par jalousie

MessagePosté: Samedi 09 Mars 2013, 08:27
par SB
Non c'est un .tex que j'utilise avec un input.

Re: [Résolu] Représenter une multiplication par jalousie

MessagePosté: Samedi 09 Mars 2013, 10:01
par MB
SB a écrit:Non c'est un .tex que j'utilise avec un input.


Ah ok, donc \makeatletter et \makeatother sont bien utiles dans ton cas. (ils ne sont pas nécessaires dans un .sty ou un .cls)