%--------------------------------------------------
% montchapet.tex
% macros generales pour usage avec LuaTeX
% M. Quercia, 01/09/2010
%--------------------------------------------------

% autorise @ dans les noms
\catcode64=11

% table sans aucun caractere special
\def\desactive{%
 \catcode`\\=12
 \catcode`\{=12
 \catcode`\}=12
 \catcode`\$=12
 \catcode`\&=12
 \catcode13=12
 \catcode`\#=12
 \catcode`\^=12
 \catcode`\_=12
 \catcode32=12
 \catcode`\~=12
 \catcode`\%=12
}

%--------------------------------------------------
% Gestion des polices
%--------------------------------------------------

% familles mathematiques
\chardef\rmfam=0
\chardef\ifam=1
\chardef\syfam=2
\chardef\exfam=3
\newfam\msafam
\newfam\msbfam
\chardef\bbbfam=\msbfam % ou \bffam
\def\sc{\tensc}

% conversion decimal -> hexadecimal
{\def\hex#1{%
\ifnum#1<10 \number#1\else
\ifnum#1=10 A\else
\ifnum#1=11 B\else
\ifnum#1=12 C\else
\ifnum#1=13 D\else
\ifnum#1=14 E\else
\ifnum#1=15 F\fi\fi\fi\fi\fi\fi\fi}
\xdef\msa@{\hex\msafam}
\xdef\msb@{\hex\msbfam}
}

% accents en mode math
\def\bar{\mathaccent"7409\relax}
\def\dot{\mathaccent"740A\relax}
\def\hat{\mathaccent"7402\relax}
\def\tilde{\mathaccent"7403\relax}
\def\interieur{\mathaccent"7406\relax}

% selection des polices
% syntaxe : xx=yyyy,z -> utiliser la police yyyy pour le mode xx
%           si z=f alors on accole la taille (10,7,5) a yyyy
%           si z=p on conserve le nom yyyy pour toutes les tailles

\def\computermodern{\installfonts{%
 rm=cmr,f    % roman
 it=cmti,f   % italique
 sl=cmsl,f   % penche
 bf=cmbx,f   % gras
 sc=cmcsc,f  % petites capitales
 tt=cmtt,f   % machine a ecrire
 i=cmmi,f       % math italique
 sy=cmsy,f      % symboles
 ex=cmex,f      % symboles extensibles
 msa=msam,f     % AMS a
 msb=msbm,f     % AMS b
}}
\def\computermodernbright{\installfonts{%
 rm=ebmr10,p    % roman
 it=ebmo10,p    % italique
 sl=ebmo10,p    % penche
 bf=ebsr10,p    % gras
 sc=ec-lmcsc,f  % petites capitales
 tt=ebtl10,p    % machine a ecrire
 i=cmbrmi10,p   % math italique
 sy=cmbrsy10,p  % symboles
 ex=lmex,f      % symboles extensibles
 msa=msam,f     % AMS a
 msb=msbm,f     % AMS b
}}
\def\concretemath{\installfonts{%
 rm=eorm,f      % roman
 it=eoti,f      % italique
 sl=eosl,f      % penche
 bf=ec-lmbx,f   % gras
 sc=eocc,f      % petites capitales
 tt=ec-lmtt,f   % machine a ecrire
 i=xccmi,f      % math italique
 sy=xccsy,f     % symboles
 ex=xccex,f     % symboles extensibles
 msa=xccam,f    % AMS a
 msb=xccbm,f    % AMS b
}}
\def\concreteeuler{\installfonts{%
 rm=eorm,f      % roman
 it=eoti,f      % italique
 sl=eosl,f      % penche
 bf=ec-lmbx,f   % gras
 sc=eocc,f      % petites capitales
 tt=ec-lmtt,f   % machine a ecrire
 i=eurm,f       % math italique
 sy=cmsy,f      % symboles
 ex=cmex,f      % symboles extensibles
 msa=msam,f     % AMS a
 msb=msbm,f     % AMS b
}}
\def\kurier{\installfonts{%
 rm=ec-kurierr,p    % roman
 it=ec-kurierri,p   % italique
 sl=ec-kurierri,p   % penche
 bf=ec-kurierb,p    % gras
 sc=ec-kurierlcap,p % petites capitales
 tt=ec-lmtt,f       % machine a ecrire
 i=mi-kurierri,p    % math italique
 sy=sy-kurierrz,p   % symboles
 ex=ex-kurierr,p    % symboles extensibles
 msa=msam,f         % AMS a
 msb=msbm,f         % AMS b
}}
\def\anttor{\installfonts{%
 rm=ec-anttr,p    % roman
 it=ec-anttri,p   % italique
 sl=ec-anttri,p   % penche
 bf=ec-anttb,p    % gras
 sc=ec-anttlcap,p % petites capitales
 tt=ec-lmtt,f     % machine a ecrire
 i=mi-anttri,p    % math italique
 sy=sy-anttrz,p   % symboles
 ex=ex-anttr,p    % symboles extensibles
 msa=msam,f       % AMS a
 msb=msbm,f       % AMS b
}%
% Redefinition des longues fleches.
% Attention ! Ces redefinitions vont s'appliquer jusqu'a la fin du groupe qui
% a appele \anttor. Ne pas basculer vers un autre jeu de caracteres avant
% d'etre sorti du groupe.
\mathchardef\equalleft="32CD
\mathchardef\equalright="32CC
\mathchardef\equalc="32CB
\mathchardef\Rightarrow="32D1
\mathchardef\Leftarrowj="32D0
\mathchardef\minusleft="32C9
\mathchardef\minusright="32CA
\mathchardef\minusc="32C8
\mathchardef\rightarrow="32CF
\mathchardef\leftarrow="32CE
\def\joinrel{\mathrel{\mkern-4mu}}%
\def\Longrightarrow{\equalleft\joinrel\Rightarrow}%
\def\Longleftarrow{\Leftarrowj\joinrel\equalright}%
\def\longrightarrow{\minusright\joinrel\rightarrow}%
\def\longleftarrow{\leftarrow\joinrel\minusleft}%
\def\rightarrowfill{$\m@th\minusright\mkern-7mu%
  \cleaders\hbox{$\mkern-2mu\minusc\mkern-2mu$}\hfill
  \mkern-7mu\mathord\rightarrow$}%
\def\leftarrowfill{$\m@th\mathord\leftarrow\mkern-7mu%
  \cleaders\hbox{$\mkern-2mu\minusc\mkern-2mu$}\hfill
  \mkern-7mu\minusleft$}%
}
\def\palatino{\installfonts{%
 rm=p1xr,p      % roman
 it=p1xi,p      % italique
 sl=p1xsl,p     % penche
 bf=p1xb,p      % gras
 sc=p1xsc,p     % petites capitales
 tt=t1xtt,p     % machine a ecrire
 i=pxmi,p       % math italique
 sy=pxsy,p      % symboles
 ex=pxex,p      % symboles extensibles
 msa=pxsya,p    % AMS a
 msb=pxsyb,p    % AMS b
}}
\def\txtimes{\installfonts{%
 rm=t1xr,p      % roman
 it=t1xi,p      % italique
 sl=t1xsl,p     % penche
 bf=t1xb,p      % gras
 sc=t1xsc,p     % petites capitales
 tt=t1xtt,p     % machine a ecrire
 i=txmi,p       % math italique
 sy=txsy,p      % symboles
 ex=txex,p      % symboles extensibles
 msa=txsya,p    % AMS a
 msb=txsyb,p    % AMS b
}}

% installation d'un jeu de polices : on definit les macros
% \petit(8pt), \normal(10pt), \gros(12pt) et \Gros(14.4pt)
\def\installfonts#1{%
 \def\petit{\installfonts@loop  {8,6.1,4.8}#1end=}%
 \def\normal{\installfonts@loop {10,7,5}#1end=}%
 \def\gros{\installfonts@loop   {12,9.1,7.2}#1end=}%
 \def\Gros{\installfonts@loop   {14.4,10.9,8.6}#1end=}%
 \normal
}

% boucle sur la liste des polices : recupere le nom xx a definir
% (rm,it,..,msb) et appelle la macro \installfonts@xx.
% Cette macro est censee rappeler \installfonts@loop pour passer
% au nom suivant. La fin de la boucle est assuree par la macro
% \installfonts@end
\def\installfonts@loop#1#2={\csname installfonts@#2\endcsname#1,#2=}

% forme un nom de fonte avec une taille
% #1 = taille voulue en pt
% #2 = racine du nom de la fonte
% #3 = suffixe de taille (10,7,5)
% #4 = "f" pour accoler le suffixe, "p" pour ne pas en tenir compte
% ex: \installfonts@name {12} {cmr}  {10} {f} -> cmr10 at 12pt
%     \installfonts@name {12} {tx1r} {10} {p} -> tx1r at 12pt
\def\installfonts@name#1#2#3#4{\if#4f#2#3 at #1pt\else#2 at #1pt\fi}

% rm,bf,i,sy,msa,msb
% on definit \tenxx,\sevenxx,\fivexx et on les affecte a \textfont\xxfam,
% \scriptfont\xxfam et \scriptscriptfont\xxfam
\def\installfonts@rm#1,#2,#3,#4=#5,#6 {%
 \expandafter\font\csname ten#4\endcsname=\installfonts@name{#1}{#5}{10}{#6}%
 \expandafter\font\csname seven#4\endcsname=\installfonts@name{#2}{#5}{7}{#6}%
 \expandafter\font\csname five#4\endcsname=\installfonts@name{#3}{#5}{5}{#6}%
 \expandafter\textfont\csname#4fam\endcsname=\csname ten#4\endcsname
 \expandafter\scriptfont\csname#4fam\endcsname=\csname seven#4\endcsname
 \expandafter\scriptscriptfont\csname#4fam\endcsname=\csname five#4\endcsname
 \installfonts@loop{#1,#2,#3}%
}
\let\installfonts@bf=\installfonts@rm
\let\installfonts@i=\installfonts@rm
\let\installfonts@sy=\installfonts@rm
\let\installfonts@msa=\installfonts@rm
\let\installfonts@msb=\installfonts@rm

% it, sl, tt
% on definit seulement \tenxx et \textfont\xxfam
\def\installfonts@it#1,#2,#3,#4=#5,#6 {%
 \expandafter\font\csname ten#4\endcsname=\installfonts@name{#1}{#5}{10}{#6}%
 \expandafter\textfont\csname#4fam\endcsname=\csname ten#4\endcsname
 \installfonts@loop{#1,#2,#3}%
}
\let\installfonts@sl=\installfonts@it
\let\installfonts@tt=\installfonts@it

% sc
% on definit seulement \tenxx
\def\installfonts@sc#1,#2,#3,#4=#5,#6 {%
 \expandafter\font\csname ten#4\endcsname=\installfonts@name{#1}{#5}{10}{#6}%
 \installfonts@loop{#1,#2,#3}%
}

% ex
% on definit \tenxx et on l'affecte a \textfont\xxfam, \scriptfont\xxfam
% et \scriptscriptfont\xxfam
\def\installfonts@ex#1,#2,#3,#4=#5,#6 {%
 \expandafter\font\csname ten#4\endcsname=\installfonts@name{#1}{#5}{10}{#6}%
 \expandafter\textfont\csname#4fam\endcsname=\csname ten#4\endcsname
 \expandafter\scriptfont\csname#4fam\endcsname=\csname ten#4\endcsname
 \expandafter\scriptscriptfont\csname#4fam\endcsname=\csname ten#4\endcsname
 \installfonts@loop{#1,#2,#3}%
}

% fin de boucle
% definit les polices euro,
% regle l'interligne en fonction de la taille de base
% passe en mode \rm
\def\installfonts@end#1,#2,#3,#4={%
 \font\eurofont@rm=feymr10 at #1pt%
 \font\eurofont@bf=feybr10 at #1pt%
 \font\eurofont@sl=feymo10 at #1pt%
 \normallineskip=#1pt\divide\normallineskip by 10
 \normalbaselineskip=12\normallineskip
 \rm
}

% intercepte les changement de police et definit \euro en consequence
{\let\@tmp\rm\xdef\rm{\@tmp\def\noexpand\euro{{\noexpand\eurofont@rm e}}}
 \let\@tmp\bf\xdef\bf{\@tmp\def\noexpand\euro{{\noexpand\eurofont@bf e}}}
 \let\@tmp\sl\xdef\sl{\@tmp\def\noexpand\euro{{\noexpand\eurofont@sl e}}}
 \let\@tmp\it\xdef\it{\@tmp\def\noexpand\euro{{\noexpand\eurofont@sl e}}}}

% polices par defaut = computermodern
\computermodern

%--------------------------------------------------
% Symboles mathematiques
%--------------------------------------------------

% lettres
\def\Bbb{\fam\bbbfam}

% relations
\mathchardef\le="3\msa@36
\mathchardef\lesl="3\msa@34
\mathchardef\ge="3\msa@3E
\mathchardef\gesl="3\msa@3C
\mathchardef\subsetne="3\msb@24
\mathchardef\supsetne="3\msb@25

% norme triple, non extensible
\def\nt{\hbox{\kern0.8pt\vrule height 7pt depth 3pt\kern0.8pt\vrule\kern0.8pt\vrule\kern0.8pt}}

% divers
\def\adots{%
 \mathinner{%
  \mkern 1mu\raise  \p@ \hbox {.}%
  \mkern 2mu\raise 4\p@ \hbox {.}%
  \mkern 2mu\raise 7\p@\vbox{\kern 7\p@\hbox {.}}%
  \mkern 1mu}}

%--------------------------------------------------
% pictogrammes clavier
%--------------------------------------------------

\def\kbup{\hbox{%
 \setbox0=\hbox{\tenmsa\char78}%
 \hbox to\wd0{\hfil\vrule height 3pt depth 2pt width 0.8pt\hfil}\kern-\wd0
 \raise 3pt\box0
}}

\def\kbdn{\hbox{%
 \setbox0=\hbox{\tenmsa\char72}%
 \raise\ht0\hbox to\wd0{%
  \hfil\vrule height 3pt depth 2pt width 0.8pt\hfil}\kern-\wd0
 \lower2pt\box0
}}

\def\kbUP{\hbox{%
 \setbox0=\hbox{\tenmsa\char78}%
 \hbox to\wd0{\hfil\vrule height 3pt depth 2pt width 0.8pt\hfil}\kern-\wd0
 \raise1pt\hbox to \wd0{\hss\vrule width 5pt height 0.4pt\hss}\kern-\wd0
 \lower0.5pt\hbox to \wd0{\hss\vrule width 5pt height 0.4pt\hss}\kern-\wd0
 \lower2pt\hbox to \wd0{\hss\vrule width 5pt height 0.4pt\hss}\kern-\wd0
 \raise 3pt\box0
}}

\def\kbDN{\hbox{%
 \setbox0=\hbox{\tenmsa\char72}%
 \raise\ht0\hbox to\wd0{%
  \hfil\vrule height 3pt depth 2pt width 0.8pt\hfil}\kern-\wd0
 \dimen0=\ht0\advance\dimen0 2.5pt
 \raise\dimen0\hbox to \wd0{\hss\vrule width 5pt height 0.4pt\hss}\kern-\wd0
 \advance\dimen0-1.5pt
 \raise\dimen0\hbox to \wd0{\hss\vrule width 5pt height 0.4pt\hss}\kern-\wd0
 \advance\dimen0-1.5pt
 \raise\dimen0\hbox to \wd0{\hss\vrule width 5pt height 0.4pt\hss}\kern-\wd0
 \lower2pt\box0
}}

\def\kbleft{\hbox{%
  \setbox0=\hbox{\tenmsa\char74}%
  \dimen0=\ht0\advance\dimen0-\dp0\divide\dimen0 2
  \lower\dimen0\box0\kern-1pt
  \vrule height 0.4pt depth 0.4pt width 5pt
}}

\def\kbright{\hbox{%
  \setbox0=\hbox{\tenmsa\char73}%
  \dimen0=\ht0\advance\dimen0-\dp0\divide\dimen0 2
  \vrule height 0.4pt depth 0.4pt width 5pt
  \kern-1pt\lower\dimen0\box0
}}

\def\kbback{\hbox{%
  \setbox0=\hbox{\tenmsa\char74}%
  \dimen0=\ht0\advance\dimen0-\dp0\divide\dimen0 2
  \lower\dimen0\box0\kern-1pt
  \vrule height 0.4pt depth 0.4pt width 15pt
}}

\def\kbtab{\hbox{%
  \setbox0=\hbox{\vrule width 0.8pt\kern-1pt\tenmsa\char74\kern-1pt}%
  \setbox1=\hbox{\kern-1pt\tenmsa\char73\kern-1pt\vrule width 0.8pt}%
  \dimen0=\ht0\advance\dimen0\dp0\divide\dimen0 2
  \raise\dp0\box0
  \raise\dimen0\hbox{\vrule height 0.4pt depth 0.4pt width 10pt}%
  \kern -\wd1\kern-10pt
  \lower\dimen0\hbox{\vrule height 0.4pt depth 0.4pt width 10pt}%
  \lower\ht1\box1
}}

\def\kbenter{\hbox{%
  \setbox0=\hbox{\tenmsa\char74}%
  \dimen0=\ht0\advance\dimen0-\dp0\divide\dimen0 2
  \lower\dimen0\box0\kern-1pt
  \vrule height 0.4pt depth 0.4pt width 10pt
  \vrule height 4pt depth 0.4pt width 0.8pt
}}

\def\kbhome{\hbox{%
  \setbox0=\hbox{\tenmsa\char72}%
  \copy0\kern-0.5\wd0\kern-0.4pt
  \setbox0=\hbox{\tenmsb\char114}%
  \lower1.4pt\copy0\kern-\wd0\kern0.2pt
  \lower1.2pt\copy0\kern-\wd0\kern0.2pt
  \lower1.0pt\copy0
}}

\def\kbshift{\hbox{%
  \setbox0=\hbox{\tensy\char94}%
  \lower2pt\hbox to \wd0{%
    \kern0.5pt
    \vrule height 4pt depth -3.6pt width 1.5pt
    \vrule height 4pt depth 0pt width 0.4pt
    \hrulefill
    \vrule height 4pt depth 0pt width 0.4pt
    \vrule height 4pt depth -3.6pt width 1.5pt
    \kern0.5pt
  }\kern-\wd0
  \raise2pt\box0
}}

\def\kblock{\hbox{%
  \setbox0=\hbox{\kern-1pt\tensy\char91\kern-1pt}%
  \dimen0=\ht0\advance\dimen0 -2pt
  \raise\dimen0\hbox to\wd0{\hss\fivesy\char92\hss}\kern-\wd0
  \raise\dimen0\hbox{\vrule height 0.2pt depth 0.2pt width\wd0}\kern-\wd0
  \raise\dimen0\hbox to\wd0{%
    \hfil\vrule height 0pt depth 2pt width 0.8pt\hfil}\kern-\wd0
  \lower2pt\box0
}}

%--------------------------------------------------
% abreviations
%--------------------------------------------------

% noms de fonction
\def \fct#1{\mathop{\rm#1}\nolimits}
\def \argch {\fct{argch}}
\def \argsh {\fct{argsh}}
\def \argth {\fct{argth}}
\def \car   {\fct{car}}
\def \card  {\fct{card}}
\def \ch    {\fct{ch}}
\def \codim {\fct{codim}}
\def \com   {\fct{com}}
\def \cotan {\fct{cotan}}
\def \diag  {\fct{diag}}
\def \id    {\fct{id}}
\def \Im    {\fct{Im}}
\def \Ker   {\fct{Ker}}
\def \pgcd  {\fct{pgcd}}
\def \ppcm  {\fct{ppcm}}
\def \Re    {\fct{Re}}
\def \rg    {\fct{rg}}
\def \sh    {\fct{sh}}
\def \sp    {\fct{sp}}
\def \th    {\fct{th}}
\def \tcom  {{}^t\!\fct{com}}
\def \tr    {\fct{tr}}
\def \vect  {\fct{vect}}

% texte
\def\text#1{%
\relax
\ifmmode\mathchoice
{\hbox{\tenrm   #1}}%      % mode display
{\hbox{\tenrm   #1}}%      % mode textstyle
{\hbox{\sevenrm #1}}%      % mode scriptstyle
{\hbox{\fiverm  #1}}%      % mode scriptscriptstyle
\else #1\fi}               % mode texte

\def\tq{\text{ tq }}            % tq
\def\pmod#1{\,({\rm mod}\,#1)}  % modulo

%--------------------------------------------------
% matrices
%--------------------------------------------------

% redefinition de \matrix avec ressorts reglables
\def\matrix#1{%
 \null
 \,
 \vcenter{%
   \normalbaselines
   \m@th
   \ialign{%
     \matrixlefthfil
     $##$%
     \matrixrighthfil
     &&\quad
     \matrixlefthfil
     $##$%
     \matrixrighthfil
     \crcr
     \mathstrut
     \crcr
     \noalign{\kern -\baselineskip} 
     #1\crcr 
     \mathstrut
     \crcr
     \noalign{\kern -\baselineskip}%
    }%
  }%
  \,}

% ressorts
\let\matrixlefthfil\hfil
\let\matrixrighthfil\hfil

% choix de la taille et des ressorts
\def\mat{\bgroup\petit\mat@suite}
\def\matl{\bgroup\petit
  \let\matrixlefthfil\relax
  \let\matrixrighthfil\hfil
  \mat@suite}
\def\matr{\bgroup\petit
  \let\matrixlefthfil\hfil
  \let\matrixrighthfil\relax
  \mat@suite}
\def\matc{\bgroup\petit
  \let\matrixlefthfil\hfil
  \let\matrixrighthfil\hfil
  \mat@suite}
\def\Mat{\bgroup\mat@suite}
\def\Matl{\bgroup
  \let\matrixlefthfil\relax
  \let\matrixrighthfil\hfil
  \mat@suite}
\def\Matr{\bgroup
  \let\matrixlefthfil\hfil
  \let\matrixrighthfil\relax
  \mat@suite}
\def\Matc{\bgroup
  \let\matrixlefthfil\hfil
  \let\matrixrighthfil\hfil
  \mat@suite}

% choix des delimiteurs
\def\mat@suite{\afterassignment\mat@fin\let\next=}
\def\mat@fin{%
       \ifx\next(\def\next##1){\left(\matrix{##1\crcr}\right)\egroup}%
  \else\ifx\next[\def\next##1]{\left[\matrix{##1\crcr}\right]\egroup}%
  \else\ifx\next\{\def\next##1\}{\left\{\matrix{##1\crcr}\right\}\egroup}%
  \else\ifx\next|\def\next##1|{\left|\matrix{##1\crcr}\right|\egroup}%
  \else\ifx\next\|\def\next##1\|{\left\|\matrix{##1\crcr}\right\|\egroup}%
  \else\message{delimiteur de matrice inconnu}%
  \fi\fi\fi\fi\fi
  \next
}

%--------------------------------------------------
% applications
%    1: | 2  ----> 3
%       | 4  |---> 4'
%       | 4" |---> 4"'
%         etc.
%
\def \appmult #1#2#3#4{%
{#1}:\;                                             % nom de l'application
\left\{\,%}                                         % accolade
\vcenter{%                                          % empiler par le bas
\normalbaselines                                    % interligne normale
\m@th                                        % pas d'espace entre les formules
\ialign{\hfil$##$                                   % cadre a droite,
        &$\hskip 3mm \longmapsto \hskip 3mm         % bequillon
        ##$\hfil                                    % cadre a gauche
        &\hskip 3mm $##$\hfil\cr                    % condition
        #2                                          % ensemble de depart
        &\omit\hskip 3mm$\longrightarrow\hskip 3mm  % fleche sans bequillon
        #3$\hfil\cr                                 % ensemble d'arrivee
        \noalign{\vskip 1mm}%                       % petit espace vertical
        #4}%                                        % elements et images
}\,\right.}                                         % petit espace final

%
%     1: | 2 ----> 3
%        | 4 |---> 5
%
\def\application#1#2#3#4#5{\appmult {#1}{#2}{#3}{{#4}&{#5}\cr}}

%--------------------------------------------------
% fractions
%--------------------------------------------------

\def \dfrac#1#2{\mathchoice
{{\displaystyle#1\over\displaystyle\strut#2}}%     % mode = display
{{\textstyle#1\over\textstyle\strut#2}}%           % mode = texte
{#1/#2}%                                           % mode = indice
{#1/#2}}                                           % mode = indice d'indice

\def\frac#1#2{\mathchoice                          % petite fraction
{{\textstyle #1\over\textstyle#2}}%                % mode = display
{{#1\over#2}}%                                     % mode = texte
{#1/#2}%                                           % mode = indice
{#1/#2}}                                           % mode = indice d'indice

\def\dbin#1#2{\mathchoice
{{\displaystyle#1\choose\displaystyle#2}}%         % mode = display
{{\textstyle#1\choose\textstyle#2}}%               % mode = texte
{#1\choose#2}%                                     % mode = indice
{#1\choose#2}}                                     % mode = indice d'indice

\def\bin#1#2{\mathchoice
{{\textstyle#1\choose\textstyle#2}}%               % mode = display
{#1\choose#2}%                                     % mode = texte
{#1\choose#2}%                                     % mode = indice
{#1\choose#2}}                                     % mode = indice d'indice


%--------------------------------------------------
% encadrement
%--------------------------------------------------
% \cadrefin{...}     ->  filet fin (0.4pt)
% \cadredouble{...}  ->  double filet fin
% \cadreombre{...}   ->  filet fin et ombre decalee (3pt)
% \cadrerond{...}    ->  filet fin et coins arrondis
%      Toutes ces macros entourent {...} d'un blanc de 1mm puis encadrent
%      l'ensemble. La ligne de base du resultat est celle de {...}.

% options : on peut inserer entre "\cadrexxx" et "{..}" une suite de commandes
% de la forme :
% \w = <dimension>   : fixe la largeur externe du cadre
% \h = <dimension>   : fixe la hauteur externe du cadre
% \d = <dimension>   : fixe la profondeur externe du cadre
% \m = <dimension>   : fixe la marge a utiliser

% Multilignage : Le texte du cadre est compose par "\halign{\hfil#\hfil\cr ...}"
% donc il suffit de separer les differentes lignes par \cr, et d'inserer des
% \hfill eventuellement pour compenser le centrage.
% On peut modifier l'interligne par "\openup ..." dans la chaine d'options

\def\cadre@interne#1#2#{%     #1 = bords, #2 = options
 \bgroup
 \let\cadre@w\w               % sauve les macros \w,\h,\d,\m
 \let\cadre@h\h
 \let\cadre@d\d
 \let\cadre@m\m
 \dimendef\w=255 \w=0pt       % largeur externe
 \dimendef\h=254 \h=0pt       % hauteur externe
 \dimendef\d=253 \d=0pt       % profondeur externe
 \dimendef\m=252 \m=1mm       % marge
 #2%                          % execute les options
 \cadre@suite{#1}%            % continue apres avoir lu le texte
}
\def\cadre@suite#1#2{%        % #1 = bords, #2 = texte
 \let\w\cadre@w               % restaure \w,\h,\d,\m
 \let\h\cadre@h
 \let\d\cadre@d
 \let\m\cadre@m
 \setbox0=\hbox{\vbox{\halign{\hfil##\hfil\cr#2\crcr}}}% texte
 \dimendef\w=255              % remet en place les variables de dimension
 \dimendef\h=254
 \dimendef\d=253
 \dimendef\m=252
 \offinterlineskip            % pas d'interligne
 \csname cadre@#1\endcsname   % ajoute les bords
 \egroup                      % termine
}

\def\cadre@dims#1#2#3{% ajuste les dimensions de \box0 en fonction
% des dimensions \w,\h,\d et \m demandees
% et de l'encombrement du cadre #1 = largeur, #2 = hauteur, #3 = profondeur
 \ifdim\w=0pt\w=\wd0\advance\w2\m\else\advance\w-#1\fi
 \setbox0=\hbox to \w{\hss\box0\hss}%
 \ifdim\h=0pt\h=\ht0\advance\h\m\else\advance\h-#2\fi\ht0=\h
 \ifdim\d=0pt\d=\dp0\advance\d\m\else\advance\d-#3\fi\dp0=\d
}

\def\cadre@fin{%
 \cadre@dims{0.8pt}{0.4pt}{0.4pt}%
 \vtop{\vbox{\hrule\hbox{\vrule\box0\vrule}}\hrule}%
}
\def\cadrefin{\cadre@interne{fin}}

\def\cadre@double{%
 \cadre@dims{3.6pt}{1.8pt}{1.8pt}%
 \setbox0=\hbox{\kern1pt\vrule\vtop{\vbox{\hrule\box0}\hrule}\vrule\kern1pt}%
 \hbox{\vrule\vtop{\vbox{\hrule\kern1pt\box0}\kern1pt\hrule}\vrule}%
}
\def\cadredouble{\cadre@interne{double}}

\def\cadre@ombre{%
 \cadre@dims{2.4pt}{0.4pt}{2pt}%
 \setbox0=\hbox{\vrule\vtop{\vbox{\hrule\box0}\hrule}\vrule}%
 \setbox1=\hbox to 0pt{\hss\vrule height\ht0 depth\dp0 width 1.6pt}%
 \setbox2=\hbox{\kern1.6pt\vrule height 1.6pt depth 0pt width\wd0}%
 \hbox{\vtop{\box0\box2}\lower 1.6pt\box1}%
}
\def\cadreombre{\cadre@interne{ombre}}

\def\cadre@rond{%
 \cadre@dims{0.8pt}{0.4pt}{0.4pt}%
 \font\qc=lcircle10\qc
 \setbox2=\hbox{\char7}%
 \advance\w-\wd2\advance\h-\dp2\advance\d-\ht2\advance\d 0.4pt
 \setbox1=\hbox{%
  \kern0.2pt\char7\kern-0.5\wd2
  \vrule width\w height 0.4pt depth 0pt
  \kern0.5\wd2\char4\kern-\wd2\kern-0.2pt}%
 \setbox2=\hbox{%
  \kern0.2pt\char6\kern-0.5\wd2
  \vrule width\w height 0.4pt depth 0pt
  \kern0.5\wd2\char5\kern-\wd2\kern-0.2pt}%
 \ht1=0.4pt\dp1=0pt\ht2=0.4pt\dp2=0pt
 \vtop{\vbox{%
  \box1
  \hbox{\vrule height\h depth\d\box0\vrule height\h depth\d}}%
  \box2}%
}
\def\cadrerond{\cadre@interne{rond}}

%--------------------------------------------------
% date
%--------------------------------------------------
\def\date{{%
\leavevmode
%
\countdef\M=0\M=\month                             % \M = mois
\countdef\Y=1\Y=\year                              % \Y = annee
\countdef\D=2\D=\day                               % \D = jour
\countdef\aux=3
%
\advance\M by -3                                   % fait commencer l'annee ...
\ifnum\M < 0 \advance\M by 12\advance\Y by -1 \fi  % ... au 1er mars
\advance\Y by -1980                                % origine des temps = 1980
\multiply\Y by 5\divide\Y by 4                     % decalage de 5j par 4ans
\multiply\M by 26\advance\M by 5\divide\M by 10    % decalage de 2.6j par mois
\advance\D by \M\advance\D by\Y                    % cumule les decalages
\aux=\D\divide\aux by 7\multiply\aux by 7\advance\D by -\aux % reduit modulo 7
%
\ifcase\D vendredi    % ecrit le jour de la semaine
      \or samedi      % Tous calculs faits, le 0 mars 1980 est un vendredi ...
      \or dimanche
      \or lundi
      \or mardi
      \or mercredi
      \or jeudi
\fi
\number\day           % ecrit le quantieme du mois
\ifnum\day=1er\fi\    % 1er et non 1
\ifcase\month         % ecrit le mois
      \or janvier
      \or f\'evrier
      \or mars
      \or avril
      \or mai
      \or juin
      \or juillet
      \or ao\^ut
      \or septembre
      \or octobre
      \or novembre
      \or d\'ecembre
\fi
\number\year                           % ecrit l'annee
}}

%--------------------------------------------------
% mode verbatim
%--------------------------------------------------

\def\verbatim#1{%
 \begingroup
 \let\endverbatim\endgroup
 \tt
 \desactive
 \catcode`#1=0%
 \obeyspaces
 \def\par{\endgraf\leavevmode}\obeylines
}

%--------------------------------------------------
% termine
\catcode64=\active
