16-MEgal1/journal.cls

561 lines
20 KiB
OpenEdge ABL
Raw Normal View History

2016-09-17 12:32:24 +02:00
% 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}%