% Syntaxe générale de \place
% \place   x[largeur] position[align] \objet{...}
% \colonne x[largeur] position[align] {...}
%        x: première colonne
%  largeur: nombre de colonnes (ou 1 si non spécifié)
% position: t = top, b = bottom, rien = remplir la page
%    align: n° de colonne sur laquelle aligner (libre par défaut)
%
% À faire :
% - pouvoir spécifier (taille) au lieu de [align] avec (taille) = une
%   taille en unités standard
% - intertitres
% - utiliser keyval pour les options ?
% - XXX \endmakecols ne marche pas si \makecols est aligné
% - virer \colonne en bricolant \output
% 
% 
%
%
%<<<1 Introduction
% 2007/05/27 Adaptation à XeTeX
\XeTeXdefaultencoding utf-8
\RequirePackage{fontspec}
%\RequirePackage{bidi}
% Pour les tirets cadratins et demi-cadratins à base de -- et ---
\defaultfontfeatures{Mapping=tex-text}
%<<<2 Options de paquet
\RequirePackage[xetex]{color}
\let\J@color\color
\DeclareOption{a3paper}{\paperheight 420mm \paperwidth 297mm}%
\DeclareOption{a4paper}{\paperheight 297mm \paperwidth 210mm}%
\DeclareOption{a5paper}{\paperheight 210mm \paperwidth 148mm}%
\DeclareOption{letterpaper}{\paperheight 11in \paperwidth 8.5in}%
\DeclareOption{legalpaper}{\paperheight 14in \paperwidth 8.5in}%
\DeclareOption{executivepaper}{\paperheight 10.5in \paperwidth 7.25in}%
\DeclareOption{landscape}{%
  \advance\paperheight\paperwidth
  \advance\paperwidth-\paperheight \paperwidth-\paperwidth
  \advance\paperheight-\paperwidth \paperheight-\paperheight}
\DeclareOption{10pt}{\def\@ptsize{10}}%
\DeclareOption{11pt}{\def\@ptsize{11}}%
\DeclareOption{12pt}{\def\@ptsize{12}}%
\DeclareOption*{\ClassWarning{journal}{Option \CurrentOption inconnue}}%
\ExecuteOptions{a4paper,10pt}%
\ProcessOptions
\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}
\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}
\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}
\input{size\@ptsize.clo}%
%<<<2 Paramètres
% Nombre de colonnes
\newcount\columns \columns=3
%   Séparation verticale entre les objets
\newdimen\objsep
%   Tokens pour les objets
\newtoks\J@obj@toks
% Variables temporaires à volonté
\newdimen\J@dim@a
\newdimen\J@dim@b
\newdimen\J@dim@c
\newcount\J@cnt@a
\newcount\J@cnt@b
\newbox\J@box@a
% Un offset pour le recolonnage
\newdimen\J@offset

% Les dimensions pour le colonnage
\columnsep 5mm
\objsep 4mm
\topskip 0pt
% Les dimensions LaTeX
\arraycolsep 3pt \tabcolsep 3pt \arrayrulewidth .4pt

%<<<2 \ignorepar, c'est un genre de \ignorespaces, en mieux.
% Merci Knuth
\let\J@par=\\
\def\\{\let\stoken= }\\ % now \stoken is a space token
\let\\\J@par
\let\J@par=\par
\def\ignorepar{\futurelet\J@tmp@a\J@testpar}%
\def\J@testpar{\ifx\J@tmp@a\par \let\par=\ignorepar \else
\ifx\J@tmp@a\stoken\let\par=\ignorepar \ignorespaces \else
\let\par=\J@par\fi\fi}%
%<<<2 Allocation des registres pour les colonnes. Il y en a deux par colonne:
% \botcol@n   taille verticale restant disponible
% \topcol@n  ordonnée où commence la place libre
% On ne peut utiliser ici \J@obj@do car il faut justement construire le nom
% de topcol@i etc.
\def\J@alloc{%
  \J@cnt@a=0 \loop \ifnum\J@cnt@a<\columns \advance\J@cnt@a by 1
    \edef\J@tmp@a{\romannumeral\J@cnt@a}%
    % On n'alloue des registres que s'il n'existent pas déjà
    \expandafter\ifx\csname topcol@\J@tmp@a\endcsname\relax
    \expandafter\newdimen\csname topcol@\J@tmp@a\endcsname\fi
    \expandafter\ifx\csname botcol@\J@tmp@a\endcsname\relax
    \expandafter\newdimen\csname botcol@\J@tmp@a\endcsname\fi
  \repeat
}%
%<<<2 \newpage
% Il faut bien sûr redéfinir \newpage pour remettre en place l'espace
% libre dans les colonnes.
\let\J@newpage=\newpage
\def\J@columns{%
  \J@dim@a=\hsize
  \J@dim@b=\columnsep \multiply\J@dim@b by \columns
  \advance\J@dim@b by -\columnsep
  \advance\J@dim@a by -\J@dim@b
  \divide\J@dim@a by \columns \columnwidth=\J@dim@a%
}%
\def\pageinit{%
  \J@columns
  \J@alloc
  \J@dim@a=\z@
  \J@dim@b=\vsize
  \J@obj@first=1 \J@obj@span=\columns
  \def\col@do{\topcol@\J@dim@a \botcol@\J@dim@b}\J@obj@do\col@do
  \parindent\z@
}%
\def\newpage{\J@newpage \pageinit}%

%<<<1 Positionnement des objets
%<<<2 Algorithme de positionnement
%<<<3 Déclaration des registres
% Position logique d'un objet (en colonnes)
\newcount\J@obj@first \newcount\J@obj@span
% Taille physique d'un objet
\newdimen\J@obj@ht \newdimen\J@obj@wd \newdimen\J@obj@align
% Boîte où est rangée l'objet
\newbox\J@obj@box
%<<<3 Fonctions utiles
% \J@obj@do - Applique la fonction #1 sur l'étendue de colonnes
% [ \J@obj@first, \J@obj@first + \J@obj@span - 1 ]
\def\J@obj@do#1{\J@cnt@a=0 \J@cnt@b=\J@obj@first \loop 
\ifnum\J@cnt@a<\J@obj@span \advance\J@cnt@a by 1
\expandafter\let\expandafter\topcol@
  \csname topcol@\romannumeral\J@cnt@b\endcsname
\expandafter\let\expandafter\botcol@
  \csname botcol@\romannumeral\J@cnt@b\endcsname
#1\advance\J@cnt@b by 1 \repeat}%
% \J@top, \J@bot - met dans \J@dim@a les bornes de l'espace disponible en
% haut (ou en bas).
\def\J@top{\J@dim@a=-1cm
  \def\col@do{\ifdim\J@dim@a<\topcol@ \J@dim@a=\topcol@\fi}%
  \J@obj@do\col@do}%
\def\J@bot{\J@dim@a=\vsize\advance\J@dim@a 1cm
  \def\col@do{\ifdim\J@dim@a>\botcol@ \J@dim@a=\botcol@\fi}%
  \J@obj@do\col@do}
%<<<3 Fonction de positionnement
\def\place{\@killglue \J@obj@ht\vsize
\def\J@calc@obj@ht{\ifdim\J@obj@ht>\J@dim@c \J@obj@ht\J@dim@c\fi}%
\let\J@obj@ex\ignorespaces\@J@obj@first}%
\def\J@calc@obj@x{\J@dim@a=\columnwidth \advance\J@dim@a by \columnsep
\advance\J@cnt@b by -1 \multiply \J@dim@a by \J@cnt@b
\advance\J@dim@a by\J@offset
\advance\J@cnt@b by 1}%
% Appeler l'objet pour qu'il calcule ce qui est nécessaire
\def\J@place{\J@obj@ht=\ht\J@obj@box\advance\J@obj@ht by\dp\J@obj@box
% Calculer les coordonnées (\J@dim@a, \J@dim@b) où placer l'objet
\J@obj@check
\ifx t\J@obj@dir
  \J@dim@b=\z@
  \def\calc@y{\J@dim@c=\topcol@ \advance\J@dim@c by \ht\J@obj@box
    \ifdim\J@dim@c>\J@dim@b \J@dim@b=\J@dim@c\fi}%
  \def\col@chk{\J@dim@c=-\topcol@ \advance\J@dim@c by -\ht\J@obj@box
    \advance\J@dim@c by \J@dim@b
    \ifdim\J@dim@c>\baselineskip \ClassWarning{journal}{%
      \the\J@dim@c\space unused at top of column \the\J@cnt@b}\fi
    }%
  \def\adj@col{\topcol@=\J@dim@b
    \advance\topcol@ by\dp\J@obj@box \advance\topcol@ by \objsep}%
  \else
\ifx b\J@obj@dir
  \J@dim@b=\vsize
  \def\calc@y{\J@dim@c=\botcol@ \advance\J@dim@c by-\dp\J@obj@box
    \ifdim\J@dim@b>\J@dim@c \J@dim@b=\J@dim@c\fi}%
  \def\col@chk{\J@dim@c=\botcol@ \advance\J@dim@c by -\J@dim@b
    \ifdim\J@dim@c>\baselineskip \ClassWarning{journal}{%
      \the\J@dim@c\space unused at bottom of column \the\J@cnt@b}\fi
    }%
  \def\adj@col{\botcol@=\J@dim@b
    \advance\botcol@ by -\ht\J@obj@box \advance\botcol@ by -\objsep}%
  \else
\ifx p\J@obj@dir
  \J@dim@b=\z@
  \def\calc@y{\J@dim@c=\topcol@ \advance\J@dim@c by \ht\J@obj@box
    \ifdim\J@dim@b<\J@dim@c \J@dim@b=\J@dim@c\fi}%
  \def\adj@col{\botcol@ -1pt}%
\else \ClassError{journal}{Unknown object position: '\meaning\J@obj@dir'}{}%
\fi\fi\fi
\J@obj@do\calc@y
% Commented the too-verbose check
% \J@obj@do\col@chk
\J@dim@c=\J@dim@b
\J@cnt@b=\J@obj@first \J@calc@obj@x
\leavevmode\lower\J@dim@c\rlap{\kern\J@dim@a \copy\J@obj@box}%
\J@obj@do\adj@col \J@obj@ht\z@
\ignorepar}%
%<<<2 La fonction pour lire les positions d'objet
% La syntaxe est x[largeur] pos[align]
% Les variables remplies:
% \J@obj@first = première colonne
% \J@obj@span  = deuxième colonne
% \J@obj@dir   = t/b/p  (tête/bas/page)
% \J@obj@ht    = 0 ou hauteur de l'objet
\def\@J@obj@first#1{\J@obj@first=#1\@ifnextchar[\@J@obj@span{\@J@obj@span[1]}}%
\def\@J@obj@span[#1]{\J@obj@span=#1\afterassignment\@J@obj@dir\let\J@tmp@a}%
\def\@J@obj@dir{%
\ifcat x\J@tmp@a
  \ifcat x\J@align \if\J@tmp@a\J@align\else
    \ClassError{journal}{Alignment `\meaning\J@tmp@a' forbidden within
    \string\makecols\space with alignment `\meaning\J@align'}{}
  \fi\fi
  \let\J@obj@dir\J@tmp@a\def\next{\@ifnextchar[\@J@obj@ht{\@J@obj@ht[]}}%
\else
  \ifcat x\J@align \let\J@obj@dir\J@align \else \let\J@obj@dir p\fi
  \let\next\J@tmp@a\@J@obj@ht[]%
\fi\next}%
\def\@J@obj@ht[#1]{\def\J@tmp@a{#1}%
\ifx\J@tmp@a\@empty
  \ifx p\J@obj@dir
    \def\col@do{\J@dim@c=\botcol@
      \advance \J@dim@c by-\topcol@
      \J@calc@obj@ht}\J@obj@do\col@do
    \J@obj@align\z@
  \else 
    \ifdim\J@obj@ht=\z@
    % Colonne seulement !
    % Au final, on trouvera \J@obj@align < 0
    % et \J@obj@ht = la place disponible au total au sommet des colonnes
    \ifx t\J@obj@dir
    \J@top
    \def\col@do{\J@dim@c=\J@dim@a
      \advance \J@dim@c by-\topcol@\J@calc@obj@ht}\J@obj@do\col@do
    \else \ifx b\J@obj@dir
    \J@bot
    \def\col@do{\J@dim@c=-\J@dim@a
      \advance \J@dim@c by \botcol@\J@calc@obj@ht}\J@obj@do\col@do
    \fi\fi
    \J@obj@align -1pt
    \else
      \J@obj@ht\z@
    \fi
  \fi
\else
  \ifx t\J@obj@dir
    \J@obj@align \csname topcol@\romannumeral\J@tmp@a\endcsname
    \advance\J@obj@align by -\objsep
    \def\col@do{%
      \J@dim@c=\J@obj@align
      \advance \J@dim@c by -\topcol@
      \J@calc@obj@ht
    }\J@obj@do\col@do
  \else \ifx b\J@obj@dir
    \J@obj@align \csname botcol@\romannumeral\J@tmp@a\endcsname
    \advance\J@obj@align by \objsep
    \def\col@do{%
      \J@dim@c=-\J@obj@align
      \advance \J@dim@c by \botcol@
      \J@calc@obj@ht
    }\J@obj@do\col@do
  \fi\fi
\fi
\J@obj@ex}%
%<<<2 Code commun aux objets
% Vérifications.
\def\J@obj@check{%
\def\col@do{\ifdim\botcol@<\z@\ClassError{journal}%
{Column \the\J@cnt@b\space is already filled}{}\fi}\J@obj@do\col@do
\J@cnt@b=\J@obj@first \advance \J@cnt@b by \J@obj@span
\advance \J@cnt@b by -1 \ifnum \J@cnt@b>\columns
  \ClassError{journal}{Column \the\J@cnt@b\space does not exist (max is
  \the\columns)}{}\fi
\ifnum \J@obj@first<0 \ClassError{journal}{Negative column numbers
(\the\J@obj@first) not allowed}{}\fi}%

\def\J@calc@obj@wd{%
\J@obj@wd=\columnsep \advance\J@obj@wd by\columnwidth
\multiply\J@obj@wd by\J@obj@span \advance\J@obj@wd by -\columnsep
}%
% \objbox est prévue pour être utilisée par les objets
% Un objet termine par une commande \objbox{ce qu'il y a dans l'objet}%
% Voir ci-dessous les exemples d'utilisations.
\def\objbox{\let\par\J@par
  \def\objbox@{\J@calc@obj@wd\hsize=\J@obj@wd\aftergroup\J@place}%
  \afterassignment\objbox@\setbox\J@obj@box=\vbox}%
%<<<1 Mise en page complexe
%<<<2 \borne
\def\borne #1#2{\begingroup\J@obj@first=1\J@obj@span=\columns
  \edef\@borne{\romannumeral #2}%
  \ifx t#1
    \def\col@do{\topcol@=\csname botcol@\@borne\endcsname
      \advance\topcol@ by \objsep}%
    \xdef\col@res{\noexpand\botcol@=\csname botcol@\@borne\endcsname}%
      \else
  \ifx b#1
    \def\col@do{\botcol@=\csname topcol@\@borne\endcsname
      \advance\botcol@ by-\objsep}%
    \xdef\col@res{\noexpand\topcol@=\csname topcol@\@borne\endcsname}%
      \else
  \fi\fi
  \J@obj@do\col@do
\ignorepar}%
\def\endborne{\endgroup\J@obj@first=1\J@obj@span=\columns\J@obj@do\col@res}
%<<<2 \pushcols - empile les colonnes (et ce, pour pouvoir faire une
% sous-page)
% \def\pushcols{%
%   \def\pop@cols{}%
%   \J@obj@first=1 \J@obj@span=\columns
%   \def\@do{%
%     \xdef\pop@cols{\expandafter\noexpand\pop@cols
%     \noexpand\global\expandafter\noexpand
%     \csname topcol@\romannumeral\J@cnt@b\endcsname=\the\topcol@
%     \noexpand\global\expandafter\noexpand
%     \csname botcol@\romannumeral\J@cnt@b\endcsname=\the\topcol@
%     }%
%   }\J@obj@do\@do
%   \aftergroup\pop@cols
% }%
%<<<2 \makecols
\let\J@sub\relax
\let\J@align\relax
\def\makecols#1{%
  \let\J@sub=\J@obj@dir
  \begingroup
  \columns=#1 \J@calc@obj@wd \hsize=\J@obj@wd
  \J@cnt@b=\J@obj@first \J@calc@obj@x \J@offset=\J@dim@a
  \J@alloc \J@columns
  \ifx t\J@sub \J@top
    \ifdim\J@obj@ht>\z@ \J@dim@b\J@dim@a \advance\J@dim@b\J@obj@ht
    \else \begingroup\J@bot\global\J@dim@b\J@dim@a\endgroup \fi
  \else \J@bot \J@dim@b\J@dim@a
    \ifdim\J@obj@ht>\z@ \J@dim@a\J@dim@b \advance\J@dim@a-\J@obj@ht
    \else \J@top \fi
  \fi
  \J@obj@first=1\J@obj@span\columns
  \def\col@do{\topcol@\J@dim@a \botcol@\J@dim@b}\J@obj@do\col@do
}%
\def\endmakecols{%
  \ifx t\J@sub\J@top \else\J@bot\fi \global\J@dim@a\J@dim@a
  \endgroup
  \ifdim\J@obj@ht>\z@ \espace{\J@obj@ht}\espace{\objsep}%
  \else
    \ifx t\J@sub \def\col@do{\topcol@\J@dim@a}\else
    \def\col@do{\botcol@\J@dim@a}\fi
    \J@obj@do\col@do
  \fi
  \let\J@sub\relax\ignorepar
}%
%<<<1 Définition des objets
%<<<2 \espace et \jointif
\def\espace#1{%
\ifx t\J@obj@dir \def\col@do{\advance\topcol@ by #1}\else
\ifx b\J@obj@dir \def\col@do{\advance\botcol@ by-#1}\fi\fi
% Le \ignorepar est nécessaire puisqu'on n'utilise pas \objbox
\J@obj@do\col@do\ignorepar}%
\def\jointif{\espace{-\objsep}}
%<<<2 \texte
\def\texte{\afterassignment\texte@\J@obj@toks=}%
\def\texte@{%
  \ifdim\J@obj@ht=\z@ \def\J@obj@extra{}\else
  \edef\J@obj@extra{to \the\J@obj@ht}\fi
\objbox\J@obj@extra{\begingroup\leavevmode\J@@txt@init\the\J@obj@toks\J@@txt@init\endgroup}}%

%<<<2 \gencadre
% Merci Knuth
\def\futurenonspacelet#1{\def\cs{#1}%
  \afterassignment\fnslet@i\let\fnslet@next= }
\def\fnslet@i{\expandafter\futurelet\cs\fnslet@ii}
\def\fnslet@ii{\expandafter\ifx\cs\stoken\let\next=\fnslet@three
  \else\let\next=\fnslet@next\fi \next}
\def\fnslet@three{\afterassignment\fnslet@i\let\next= }

\newif\if@J@jointif\@J@jointiffalse
\def\intjointif{\@J@jointiftrue}

% \gencadre{bordure}{marge}{couleur bordure}{couleur fond}{texte}
\newif\if@J@cadre
\def\gencadre#1#2#3#4{\def\J@cadre@{\J@cadre{#1}{#2}{#3}{#4}}%
\afterassignment\J@cadre@@\J@obj@toks=}%
\def\J@cadre@@{\futurenonspacelet\@tmq\J@cadre@}
\def\J@cadre#1#2#3#4{%
  \J@dim@a=#1 \J@dim@b=#2
  \def\J@tmp@a{#3}\ifx\J@tmp@a\@empty\def\J@tmp@a{black}\fi
  \def\J@tmp@b{#4}\ifx\J@tmp@b\@empty\def\J@tmp@b{white}\fi
  \advance \J@dim@b by \J@dim@a
  \ifdim\J@obj@ht=\z@ \def\J@obj@extra{}\else
  \advance\J@obj@ht by -2\J@dim@b \edef\J@obj@extra{to \the\J@obj@ht}\fi
  \setbox\J@box@a=\vbox\J@obj@extra{\J@calc@obj@wd\hsize=\J@obj@wd
    \advance\hsize by -2\J@dim@b
    \vskip \J@dim@b\begingroup
    \let\@tmp\undefined
    \J@dim@c=\J@dim@b \let\jointif\intjointif \@J@cadretrue
    \J@obj@ht \z@
    \J@@txt@init \the\J@obj@toks \J@@txt@end \vskip\J@dim@b\endgroup}%
  \fboxrule #1 \fboxsep #2
  \if@J@cadre \par
  \if@J@jointif\vskip -\ht\strutbox\else\vskip\dp\strutbox\fi
  \leavevmode \hskip-\J@dim@c \fcolorbox{\J@tmp@a}{\J@tmp@b}{\box\J@box@a}\par
  \ifx\@tmq\jointif\vskip-\dp\strutbox\fi
  \global\@J@jointiffalse
  \else
  \objbox{\fcolorbox{\J@tmp@a}{\J@tmp@b}{\box\J@box@a}}%
  \fi
  \ignorepar
}
%<<<2 \genfilet
% \genfilet{epaisseur}{marge}{couleur}
\def\genfilet#1#2#3{%
  \objbox{\J@dim@a=\hsize \advance\J@dim@a by -#2
  \hbox to\hsize{\color{#3}\hss\vrule depth \z@ height #1 width \J@dim@a\hss}}%
\ignorepar
}%
%<<<1 Remplissage des colonnes
%<<<2 Fonction \colonne
% On utilise def, même si ce n'est pas un objet au sens strict.
\def\colonne{\@killglue \J@obj@ht\z@
\def\J@calc@obj@ht{\advance\J@obj@ht by\J@dim@c}%
\let\J@obj@ex\J@colonne\@J@obj@first}%

\def\J@colonne{\afterassignment\J@colonne@\J@obj@toks=}%
\def\J@colonne@{\@killglue
% Arrivé ici, on a la hauteur totale dans \J@obj@ht, il suffit de répartir
\J@obj@check
% Traçage de la boîte
\J@obj@wd=\columnwidth
\setbox\J@obj@box=\vbox{%
  \hsize=\J@obj@wd
  \begingroup \J@@txt@init \the\J@obj@toks \J@@txt@end \endgroup}%
  \J@dim@b=\ht\J@obj@box
\ifdim\J@obj@align<\z@
  % Le cas où on a le droit d'ajuster autant qu'on veut. Dans ce cas, on
  % calcule à quelle hauteur on va ajuster, ce qui permet de reprendre
  % tel quel l'algorithme suivant.
  \J@obj@align= \J@dim@b \advance\J@obj@align by -\J@obj@ht
  \ifdim \J@obj@align<\z@ \ClassError{journal}{%
    Pas assez de texte pour remplir les \the\J@obj@span\space colonnes.^^J}\fi
  \divide\J@obj@align by\J@obj@span \J@obj@ht=\J@dim@b
  \ifx t\J@obj@dir \J@top \advance\J@obj@align by\J@dim@a
  \else \J@bot \J@obj@align=-\J@obj@align \advance\J@obj@align by\J@dim@a
  \fi
\fi
% Répartition de l'espace
\J@dim@c=1pt % Pour des raisons de précision de la division
\divide \J@obj@ht by\J@dim@c \divide \J@dim@b by\J@dim@c
\def\put@col{%
  \ifx t\J@obj@dir \J@dim@a=\J@obj@align \else \J@dim@a=\botcol@ \fi
  \ifx b\J@obj@dir \J@dim@c=\J@obj@align \else \J@dim@c=\topcol@ \fi
  % Maintenant \J@dim@a contient la place libre sur cette colonne
  \advance\J@dim@a by -\J@dim@c \J@dim@c=\J@dim@a
  \divide\J@dim@c by\J@obj@ht \multiply\J@dim@c by \J@dim@b
  % Maintenant \J@dim@c contient la taille qu'on attribue à cette colonne
  \splittopskip\z@
  \setbox\J@box@a=\vsplit\J@obj@box to\J@dim@c
  \setbox\J@box@a=\vbox to\J@dim@a{\unvbox\J@box@a}%
  \ifx t\J@obj@dir \J@dim@c=\J@obj@align\else \J@dim@c=\botcol@ \fi
  \J@calc@obj@x % maintenant dans \J@dim@a
  \begingroup % Filet gauche
  \ifnum \J@cnt@b>1
    % Calcul de l'abscisse
    \ifnum\J@cnt@b=\J@obj@first\let\J@tmp@a\J@vsep@l@c\let\J@tmp@b\J@vsep@l@w 
    \else \let\J@tmp@a\J@vsep@i@c \let\J@tmp@b\J@vsep@i@w \fi
    \expandafter\J@dim@b\J@tmp@b \advance\J@dim@b by \columnsep
    \divide\J@dim@b by 2\advance\J@dim@a by -\J@dim@b
    % Calcul de l'ordonnée
    \ifnum \J@cnt@b=\J@obj@first \J@dim@b=\ht\J@box@a
    \else \J@dim@b=\J@dim@c \advance\J@dim@b by -\ht\J@box@a
      \J@vsep@recalc \J@dim@b=-\J@dim@b \advance\J@dim@b by \J@dim@c \fi
    \leavevmode \lower\J@dim@c \rlap{\kern \J@dim@a
      \ifx\J@tmp@a\@empty\else\color{\J@tmp@a}\fi
      \vrule height \J@dim@b width \J@tmp@b}%
  \fi \endgroup
  \begingroup % Filet droit
  \advance\J@obj@first by\J@obj@span \advance\J@obj@first by -1
  \ifnum \J@cnt@b<\columns
  \ifnum\J@cnt@b=\J@obj@first % droit
    \expandafter\J@dim@b\J@vsep@r@w \advance\J@dim@b by-\columnsep
    \divide\J@dim@b by2\advance\J@dim@a by -\J@dim@b
    \leavevmode \lower \J@dim@c \rlap{\kern\J@dim@a \kern\columnwidth
    \ifx\J@vsep@r@c\@empty\else\color{\J@vsep@r@c}\fi
    \vrule height \ht\J@box@a width \J@vsep@r@w}%
  \else % intérieur
    % Le filet intérieur rejoint les _plus petites_ sous-boîtes communes
    % aux deux colonnes
    \J@dim@b=\J@dim@c \advance\J@dim@b by -\ht\J@box@a
    \xdef\J@vsep@recalc{%
      \noexpand\ifdim\noexpand\J@dim@c>\the\J@dim@c
	\noexpand\J@dim@c=\the\J@dim@c\noexpand\fi
      \noexpand\ifdim\noexpand\J@dim@b<\the\J@dim@b
	\noexpand\J@dim@b=\the\J@dim@b\noexpand\fi}%
  \fi\fi \endgroup
  \leavevmode \lower\J@dim@c \rlap{\kern\J@dim@a \box\J@box@a}%
  \ifx t\J@obj@dir \topcol@=\J@obj@align \advance \topcol@ by \objsep\else
  \ifx b\J@obj@dir \botcol@=\J@obj@align \advance \botcol@ by -\objsep\else
  \botcol@= -1pt\fi\fi
  }\J@obj@do\put@col
\ignorepar}% end \J@colonne@
%<<<2 Séparateurs verticaux
\def\separateur#1#2#3{\J@sep@def{#2}{#3}#1.\ignorepar}
\def\J@sep@def#1#2#3{\edef\J@tmp@b{.}\def\next{\J@sep@def{#1}{#2}}%
  \ifx .#3\let\next\relax \else
  \edef\J@tmp@a{#1}\ifx\J@tmp@b\J@tmp@a\else
    \expandafter\def\csname J@vsep@#3@w\endcsname{#1}\fi
  \edef\J@tmp@a{#2}\ifx\J@tmp@b\J@tmp@a\else
    \expandafter\def\csname J@vsep@#3@c\endcsname{#2}\fi
\fi\next
}%
\J@sep@def{\z@}{}lri.
%<<<2 Styles de texte
%   Faut-il mettre un filet dans le texte?
\newif\if@J@filet
\def\txtgenfilet#1#2#3{%
  \J@footnotes
  % take care of footins
  \if@J@filet \J@dim@b=#2
  \J@dim@a=\hsize \advance \J@dim@a by -2\J@dim@b
  \bigbreak
  \cleaders\hbox{{\hskip\J@dim@b \color{#3}%
    \vrule width \J@dim@a height #1 depth \z@}}\vskip #1
  \leavevmode\fi
  \@J@filettrue
}%
%   Les notes de bas d'article
\def\J@@txt@init{%
  \linewidth\hsize
  \@J@filetfalse
  \leavevmode
  \setcounter{footnote}0%
  \def\J@fns{}%
  \let\par\J@par % restore it to prevent wrapfigure from being confused
  \J@txt@init
}%
\def\J@@txt@end{%
  \J@footnotes
  \J@txt@end
}%
\let\J@txt@init\relax % hook for derived classes
\let\J@txt@end \relax % hook for derived classes
%<<<2 Footnotes
% On ne peut pas utiliser de registre token pour les footnotes, car il
% faut expander la valeur de \@thefnmark.
\long\def\@footnotetext#1{%
  \long\edef\J@tmp@a##1##2{\noexpand\def\noexpand\J@fns{%
    \expandafter\noexpand\J@fns##1\noexpand\hbox to 1.4em{%
      \noexpand\hss\@thefnmark. }##2}}%
  \J@tmp@a{\noindent\interlinepenalty\interfootnotelinepenalty}{#1\par}%
}
\def\J@footnotes{\ifnum\c@footnote>0
  \penalty 150 \medskip \footnoterule
  \begingroup\reset@font\footnotesize\J@fns\endgroup
  \def\J@fns{}\c@footnote=0
\fi}
\def\footnoterule{\kern -3pt\hrule width .4\hsize \kern 2.6pt}
\let\J@@footnotes\J@footnotes
\def\skipfootnotes{\def\J@footnotes{\let\J@footnotes\J@@footnotes}}
% vim: fdm=marker fmr=<<<,>>>
\AtBeginDocument{\pageinit}%
