%% -*-TeX-*-
 % ###################################################################
 % 
 % FILE: "systematic.cls"
 %                                     created: 2006-11-27 14:40:51
 %                                 last update: 2007-01-09 09:58:19
 % Author: Frédéric Boulanger
 % E-mail: <Frederic.Boulanger@supelec.fr>
 %   mail: Supélec - Département Informatique
 %         3 rue Joliot-Curie, 91192 Gif-sur-Yvette, France
 %    www: <http://wwwsi.supelec.fr/fb/>
 % 
 % Description
 % 
 % Classe de document LaTeX pour les rapports des projets du pôle
 % System@tic.
 % 
 % History
 % 
 % modified   by  rev reason
 % ---------- --- --- -----------
 % 2006-11-27 FBO 1.0 original
 % 2006-12-07 FBO 1.1 \paragraph et \subparagraph passent à la ligne
 % 2007-01-08 FBO 1.2 corrections de bugs, \auteur, \filigrane
 % 2007-01-09 FBO 1.3 ordre des langues pour Babel. Fonctionne même
 %                    si eso-pic ou colortbl sont absents
 % 
 % ###################################################################
 %%
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{systematic}[
               2007/01/09 v1.3
               System@tic report document class]
\DeclareOption*{%
  \PassOptionsToClass{\CurrentOption}{report}%
}
\ProcessOptions\relax
% On s'appuie sur la classe LaTeX standard 'report' avec
% les options recto-verso, début des chapitres sur page impaire 
% et police en 10pt.
\LoadClass[twoside,openright,10pt]{report}
% Le codage de police T1 est nécessaire pour la bonne césure du 
% français. De plus, cela permet le copier-coller à partir du PDF
% généré par pdflatex.
\RequirePackage[T1]{fontenc}
% Documents en français. %en anglais
\RequirePackage[english,francais]{babel}
% Polices PostScript Times pour le corps du texte, Helvetica 
% (au lieu d'Arial) pour les titres en sans sérif, et Courier
% pour le style 'machine à écrire'
\RequirePackage{times, helvet, courier}
% tabularx permet de faire des tableaux à colonnes élastiques
\RequirePackage{tabularx}
% % hhline offre différents styles de lignes pour les tableaux
% \RequirePackage{hhline}

% colortbl permet de colorer les cases/colonnes/lignes d'un tableau
\IfFileExists{colortbl.sty}{
  \RequirePackage{colortbl}
}{
  \newcommand{\doublerulesepcolor}{\@gobble@color}
  \newcommand{\rowcolor}{\@gobble@color}
  \newcommand{\cellcolor}{\@gobble@color}
  \ClassWarning{systematic}{%
    Le package colortbl est absent de cette installation.
    \MessageBreak Le rendu des tables d'historique et d'auteurs 
    \MessageBreak ne sera pas optimal.
  }
}
% Calcul sur les dimensions
\RequirePackage{calc}
% package standard pour l'inclusion de graphiques
\RequirePackage{graphicx}
\RequirePackage{color}
% Package eso-pic s'il existe, pour le filigrane
\IfFileExists{eso-pic.sty}{%
  \RequirePackage{eso-pic}
}{%
  \newcommand{\AddToShipoutPicture}[1]{%
    \ClassWarning{systematic}{%
      Utilisation de \string\filigrane\space en l'absence d'eso-pic
      \MessageBreak Le filigrane ne sera pas appose.
    }%
  }%
}
% permet de choisir facilement la taille des marges etc.
\RequirePackage{geometry}
\newlength{\@marge@interne}
\setlength{\@marge@interne}{1.4cm}
\setlength{\evensidemargin}{1in}
\addtolength{\evensidemargin}{\@marge@interne}
\geometry{%
  includehead, includefoot,
  headheight=41pt, headsep=16pt,
  top=1.3cm,
  bottom=1.8cm,
  left=\evensidemargin,
  right=1in,
  asymmetric
}
% Pas d'indentation en début de paragraphe
\setlength{\parindent}{0pt}

%%%%% Commandes pour l'utilisateur %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% \sousProjet{<Nom du sous-projet>} indique le nom du sous-projet
% auquel se rapporte le document.
\newcommand{\sousProjet}[1]{\renewcommand{\nom@sous@projet}{#1}}

% \tache{<numéro de tâche>} indique à quelle tâche du sous-projet
% se rapporte le document.
\newcommand{\tache}[1]{\renewcommand{\num@tache}{#1}}

% \version{<date>}{<version>}{<détails>}{<auteur>} indique une 
% nouvelle version du document. La version du document est la version 
% de la dernière commande \version utilisée.
\newcommand{\version}[4]{%
  \stepcounter{histnum}%
  \expandafter\def\csname @hist@date@\roman{histnum}\endcsname{#1}%
  \expandafter\def\csname @hist@vers@\roman{histnum}\endcsname{#2}%
  \expandafter\def\csname @hist@detl@\roman{histnum}\endcsname{#3}%
  \expandafter\def\csname @hist@auth@\roman{histnum}\endcsname{#4}%
  \def\@version{#2}%
}

% \auteur{<nom>}[<organisation>][<role>] indique que <nom> est un 
% auteur du document en tant que <role> (rŽdacteur principal, 
% contributeur etc.)
\newcommand{\auteur}[1]{%
  \@ifnextchar[{\@auteur{#1}}{\@auteur{#1}[]}%
}

% \acces{<accessibilité>} donne l'accessibilité deu document 
% (confidentiel, diffusion restreinte etc.)
\newcommand{\acces}[1]{%
  \renewcommand{\@access}{#1}%
}

% \droits{<copyright>} donne le propriétaire du copyright et la 
% période couverte par le copyright.
\newcommand{\droits}[1]{%
  \renewcommand{\@copyright}{#1}%
}

% \systematicEiffel{<fichier>} donne le fichier à utiliser pour le 
% logo System@tic "tour Eiffel stylisée" (bas de page de couverture)
\newcommand{\systematicEiffel}[1]{%
  \renewcommand{\@systematic@FL}{#1}%
}

% \systematicParis{<fichier>} donne le fichier à utiliser pour le 
% logo System@tic "Paris Région" (haut de page de couverture)
\newcommand{\systematicParis}[1]{%
  \renewcommand{\@systematic@PR}{#1}%
}

% \filigrane{<taille>}{<texte>} affiche <texte> en taille <taille>
% point en gris p‰le en travers de chaque page du document.
\newcommand{\filigrane}[2]{%
  \savebox{\@bg@box@}{%
    \rotatebox[origin=bl]{55}{%
      \raisebox{-0.5\totalheight}[0pt][0pt]{%
        \makebox[364mm]{%
          \color[gray]{0.9}{\sffamily
          \fontsize{#1}{0}\selectfont #2}%
        }%
      }%
    }%
  }%
  \AddToShipoutPicture{\usebox{\@bg@box@}}%
}

%%%%% Commandes internes %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% comandes pour fonctionner sans colortbl
\newcommand{\@gobble@color}{%
  \@ifnextchar[{\@@gobble@color}{\@@gobble@color[]}%
}
\def\@@gobble@color[#1]#2{}

\newsavebox{\@bg@box@}

% contient le nom du sous projet. La valeur initiale inique la 
% commande à utiliser pour le changer.
\newcommand{\nom@sous@projet}{\string\sousProjet\{Nom sous-projet\}}

% titre ou nom du document
\def\@title{\string\title\{Nom document\}}

% numéro de la tâche
\newcommand{\num@tache}{\string\tache\{x.y.z\}}

% accessibilité
\newcommand{\@access}{Confidentiel}

% copyright
\newcommand{\@copyright}{Usine Logicielle, 2006 -- 2007}

% logo system@tic tour Eiffel
\newcommand{\@systematic@FL}{SystematicFL}

% logo system@tic Paris
\newcommand{\@systematic@PR}{SystematicPR}

% Hauteur et profondeur du strut utilisé pour élargir les lignes 
% des tableaux
\newlength{\@strut@raise}
\newlength{\@strut@height}
\newcommand{\@strut}[1][0pt]{%
  \setlength{\@strut@raise}{0.9ex}%
  \addtolength{\@strut@raise}{#1}%
  \setlength{\@strut@height}{2.9ex}%
  \addtolength{\@strut@height}{#1}%
  \addtolength{\@strut@height}{#1}%
  \rule[-\@strut@raise]{0pt}{\@strut@height}%
}

% Dans les documents system@tic, les chapitres au sens LaTeX du terme 
% ne sont pas utilisés directement. Ils ne servent que pour 
% l'historique, la table des matières et le début de la partie 
% principale du document. Le nom du chapitre est centré en sans-serif 
% gras.
\renewcommand{\@makechapterhead}[1]{%
  \hspace*{-\@marge@interne}\hspace{0pt plus 1 fill}%
  \textsf{\bfseries\LARGE #1}\hspace*{0pt plus 1 fill}%
  \par\vspace{3pt}%
}
% Idem pour les chapitres non numérotés.
\renewcommand{\@makeschapterhead}{\@makechapterhead}

% Les entrées de la table des matières n'ont pas de ligne pointillée 
% entre les titres et les numéros de page, contrairement à ce qui se 
% fait par défaut en LaTeX.
\def\@whitetocline#1#2#3#4#5{%
  \ifnum #1>\c@tocdepth
  \else
    \vskip \z@ \@plus.2\p@
    {%
      \leftskip #2\relax
      \rightskip \@tocrmarg \parfillskip -\rightskip
      \parindent #2\relax\@afterindenttrue
      \interlinepenalty\@M
      \leavevmode
      \@tempdima #3\relax
      \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
      \hspace*{-\@marge@interne}{#4}\nobreak
      \hfill
      \nobreak
      \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}%
      \par
    }%
  \fi
}

% Les sections jouent le rôle de chapitres. Elles ne sont donc pas 
% numérotées par chapitre.
\renewcommand{\thesection}{\@arabic\c@section}

% Format des entrées de la table des matières.
\renewcommand*{\l@chapter}{\pagebreak[3]\vspace{2mm}\@whitetocline{0}{0pt}{2.3em}}
\renewcommand*{\l@section}{\pagebreak[3]\vspace{0.5mm}\@whitetocline{0}{0pt}{2.3em}}
\renewcommand*{\l@subsection}{\pagebreak[2]\vspace{0.5mm}\@whitetocline{1}{2.3em}{2.5em}}
\renewcommand*{\l@subsubsection}{\pagebreak[2]\vspace{0.5mm}\@whitetocline{2}{4.8em}{3.5em}}
\renewcommand*{\l@paragraph}{\pagebreak[1]\vspace{0.5mm}\@whitetocline{3}{8.3em}{4.0em}}
\renewcommand*{\l@subparagraph}{\pagebreak[1]\vspace{0.5mm}\@whitetocline{4}{12.3em}{5em}}
\setcounter{secnumdepth}{4}
\setcounter{tocdepth}{3}

% Format des titres de section
\renewcommand{\section}{%
  \@startsection {section}{1}{\z@}%
    {-3.5ex \@plus -1ex \@minus -.2ex}%
    {2.3ex \@plus.2ex}%
    {\normalfont\large\bfseries\sffamily}%
}
\renewcommand{\subsection}{%
  \@startsection{subsection}{2}{\z@}%
    {-3.25ex\@plus -1ex \@minus -.2ex}%
    {1.5ex \@plus .2ex}%
    {\normalfont\normalsize\bfseries\sffamily}%
}
\renewcommand{\subsubsection}{%
  \@startsection{subsubsection}{3}{\z@}%
    {-3.25ex\@plus -1ex \@minus -.2ex}%
    {1.5ex \@plus .2ex}%
    {\normalfont\normalsize\sffamily}%
}
\renewcommand{\paragraph}{%
  \@startsection{paragraph}{4}{\z@}%
  {3.25ex \@plus1ex \@minus.2ex}%
  {0.5ex}%
  {\normalfont\normalsize\itshape\sffamily}%
}
\renewcommand{\subparagraph}{%
  \@startsection{subparagraph}{5}{\parindent}%
  {3.25ex \@plus1ex \@minus .2ex}%
  {0.5ex}%
  {\normalfont\normalsize\sffamily}%
}
\renewcommand{\@seccntformat}[1]{%
  \protect\makebox[0pt][r]{%
    \protect\makebox[\@marge@interne][l]{%
      \csname the#1\endcsname
    }%
  }%
}

% En-têtes et pieds de page
\newcommand{\ps@systematic}{%
  % Pied des pages impaires (droites)
  \def\@oddfoot{%
    \begin{otherlanguage}{francais}%
      \hspace*{-\@marge@interne}%
      \normalfont\normalsize
      \@access \hfill
      \textcopyright\,\@copyright \hfill
      Page~\thepage
    \end{otherlanguage}%
  }%
  % Pied des pages paires (gauches) identique
  \let\@evenfoot\@oddfoot
  % En-tête des pages impaires
  \def\@oddhead{%
    \hspace*{-\@marge@interne}\normalfont\normalsize\raisebox{\depth}{%
    \begin{otherlanguage}{francais}%
      \begin{tabularx}{\linewidth+\@marge@interne}{|X|p{0.25\linewidth}|}
        \hline
        \@strut\nom@sous@projet &
        Version~: \hfill\ \@version\quad\\
        \hline
        \@strut\@title & Date~: \hfill\ \@date\quad\\
        \hline
        \multicolumn{2}{|l|}{\@strut T\^ache\ \num@tache}\\
        \hline
      \end{tabularx}%
    \end{otherlanguage}%
    }%
  }%
  % En-tête des pages paires identique
  \let\@evenhead\@oddhead
}
% On utilise nos en-têtes même pour la première page des chapitres.
\let\ps@plain\ps@systematic

% Page de titre
\renewcommand{\maketitle}{%
  \begin{titlepage}
    \vspace*{-\headheight}\vspace*{-\headsep}\vspace*{-0.2cm}%
    \noindent\hspace*{-\@marge@interne}\makebox[\linewidth+\@marge@interne]{\hrulefill}\par
    \vspace{5mm}%
    \noindent\hspace*{-\@marge@interne}\makebox[\linewidth+\@marge@interne]{%
      \hspace*{5mm}\includegraphics{\@systematic@PR}\hfill%
      \textsf{\bfseries\Huge Usine Logicielle}%
    }\par
    \vspace{3mm}%
    \noindent\hspace*{-\@marge@interne}\makebox[\linewidth+\@marge@interne]{\hrulefill}\par
    \vspace{6.4cm}
    \noindent\hspace*{-\@marge@interne}\makebox[\linewidth+\@marge@interne]{%
      \hfill\textsf{\bfseries\Huge \nom@sous@projet}%
    }\par
    \vspace{6mm}
    \noindent\hspace*{-\@marge@interne}\makebox[\linewidth+\@marge@interne]{%
      \hfill\textsf{\bfseries\LARGE \@title}%
    }\par
    \vspace{2mm}
    \noindent\hspace*{-\@marge@interne}\makebox[\linewidth+\@marge@interne]{%
      \hfill\textsf{\bfseries\LARGE T\^ache \num@tache}%
    }\par
    \vspace{9mm}
    \noindent\hspace*{-\@marge@interne}\makebox[\linewidth+\@marge@interne]{%
      \hfill\textsf{\bfseries\Large Version \@version}%
    }\par
    \vfill
    \noindent\hspace*{-\@marge@interne}\includegraphics{\@systematic@FL}\hfill
    \raisebox{\depth}{%
      \begin{tabular}{cr}
        \@access \\
        \rule{0.3\linewidth}{0pt} & \rule{0.3\linewidth}{0pt} \\
        \\
        \textcopyright\,\@copyright & Page~\thepage
      \end{tabular}%
    }\vspace*{-\footskip}%\vspace*{-1mm}%
  \end{titlepage}
  \cleardoublepage
}

% Compteur d'entrées de l'historique
\newcounter{histnum}
% strut un peu plus haut pour la table d'historique
\newcommand{\@bstrut}{\@strut[0.5ex]}%

% Valeur par defaut de la version
\newcommand{\@version}{<version ?>}

% Compteur de ligne dans la table d'historique
\newcounter{histidx}
% Traitement d'une version : création d'une ligne dans la table.
\newcommand{\@process@hist}{%
  \ifnum\thehistidx<\thehistnum
    \stepcounter{histidx}%
    \@bstrut\csname @hist@date@\roman{histidx}\endcsname &
    \@bstrut\csname @hist@vers@\roman{histidx}\endcsname &
    \@bstrut\csname @hist@detl@\roman{histidx}\endcsname &
    \@bstrut\csname @hist@auth@\roman{histidx}\endcsname \\
    \ifnum\thehistidx<\thehistnum
      \hhline{|:=::=::=::=:|}
      \@process@hist
    \fi
  \fi
}

% Affiche l'historique du document
\newcommand{\@historique}{%
  \ifnum\thehistnum=0\else
  \chapter*{Historique}
  \noindent
  \doublerulesepcolor{white}%
  \hspace*{-\@marge@interne}\begin{tabularx}{\linewidth+\@marge@interne}{%
    ||>{\centering}p{0.12\linewidth}||>{\centering}p{0.08\linewidth}
    ||X||p{0.3\linewidth}||}
    \hhline{|t:=:t:=:t:=:t:=:t|}
    \rowcolor[gray]{0.8}%
      \textbf{\@bstrut Date}%
    & \textbf{Version}%
    & \hfill\textbf{Description}\hfill\null%
    & \hfill\textbf{Auteur}\hfill\null\\
    \hhline{|:=::=::=::=:|}
    \ifnum\thehistnum=0
      \@bstrut & \@bstrut & \@bstrut & \@bstrut \\
    \else
      \@process@hist
    \fi
    \hhline{|b:=:b:=:b:=:b:=:b|}
  \end{tabularx}
  \cleardoublepage
  \fi
}

%%%%%%%%
% Compteur d'entrées de la table des auteurs
\newcounter{auteursnum}

% Compteur de ligne dans la table des auteurs
\newcounter{auteuridx}
% Traitement d'un auteur : création d'une ligne dans la table.
\newcommand{\@process@auteurs}{%
  \ifnum\theauteuridx<\theauteursnum
    \stepcounter{auteuridx}%
    \@bstrut\csname @auteur@name@\roman{auteuridx}\endcsname &
    \@bstrut\csname @auteur@org@\roman{auteuridx}\endcsname &
    \@bstrut\csname @auteur@role@\roman{auteuridx}\endcsname \\
    \ifnum\theauteuridx<\theauteursnum
      \hhline{|:=::=::=:|}
      \@process@auteurs
    \fi
  \fi
}

% Affiche les auteurs du document
\newcommand{\@auteurs}{%
  \ifnum\theauteursnum=0\else
  \chapter*{Auteurs}
  \noindent
  \doublerulesepcolor{white}%
  \hspace*{-\@marge@interne}%
  \begin{tabularx}{\linewidth+\@marge@interne}{||X||X||X||}
    \hhline{|t:=:t:=:t:=:t|}
    \multicolumn{1}{||c||}{\cellcolor[gray]{0.8}\textbf{\@bstrut Auteur}}%
    & \multicolumn{1}{c||}{\cellcolor[gray]{0.8}\textbf{Partenaire}}%
    & \cellcolor[gray]{0.8}\\
    \hhline{|:=::=::=:|}
    \ifnum\theauteursnum=0
      \@bstrut & \@bstrut & \@bstrut \\
    \else
      \@process@auteurs
    \fi
    \hhline{|b:=:b:=:b:=:b|}
  \end{tabularx}
  \cleardoublepage
  \fi
}

\def\@auteur#1[#2]#3{%
  \stepcounter{auteursnum}%
  \expandafter\def\csname @auteur@name@\roman{auteursnum}\endcsname{#1}%
  \expandafter\def\csname @auteur@org@\roman{auteursnum}\endcsname{#2}%
  \expandafter\def\csname @auteur@role@\roman{auteursnum}\endcsname{#3}%
}

%%%%%%%%%%%%%%
% Version de hhline qui fonctionne même si ':' est actif
%%%%%%%%%%%%%%
\def\HH@box#1#2{\vbox{%
  \hrule \@height \arrayrulewidth \@width #1
  \vskip \doublerulesep
  \hrule \@height \arrayrulewidth \@width #2}}
\def\HH@add#1{\toks@\expandafter{\the\toks@#1}}

\def\HH@xexpast#1*#2#3#4\@@{%
   \@tempcnta #2
   \toks@={#1}\@temptokena={#3}%
   \let\the@toksz\relax \let\the@toks\relax
   \def\@tempa{\the@toksz}%
   \ifnum\@tempcnta >0 \@whilenum\@tempcnta >0\do
     {\edef\@tempa{\@tempa\the@toks}\advance \@tempcnta \m@ne}%
       \let \@tempb \HH@xexpast \else
       \let \@tempb \HH@xexnoop \fi
   \def\the@toksz{\the\toks@}\def\the@toks{\the\@temptokena}%
   \edef\@tempa{\@tempa}%
   \expandafter \@tempb \@tempa #4\@@}

\def\HH@xexnoop#1\@@{}
\def\hhline#1{\omit\@firstamptrue\@tempswafalse
\global\setbox\@ne\HH@box\doublerulesep\doublerulesep
  \xdef\@tempc{\ifx\extrarowheight\HH@undef\hskip-.5\arrayrulewidth\fi}%
    \HH@xexpast\relax#1*0x\@@\toks@{}\expandafter\HH@let\@tempa`}

\def\HH@let#1{\futurelet\@tempb\HH@loop}

\def\HH@loop{%
  \if\@tempb`\def\next##1{\the\toks@\cr}\else\let\next\HH@let
  \if\@tempb|\if@tempswa\HH@add{\hskip\doublerulesep}\fi\@tempswatrue
          \HH@add{\@tempc\vline\@tempc}\else
  \if\@tempb:\if@tempswa\HH@add{\hskip\doublerulesep}\fi\@tempswatrue
      \HH@add{\@tempc\HH@box\arrayrulewidth\arrayrulewidth\@tempc}\else
  \if\@tempb##\if@tempswa\HH@add{\hskip\doublerulesep}\fi\@tempswatrue
         \HH@add{\@tempc\vline\@tempc\copy\@ne\@tempc\vline\@tempc}\else
  \if\@tempb~\@tempswafalse
           \if@firstamp\@firstampfalse\else\HH@add{&\omit}\fi
              \HH@add{\hfil}\else
  \if\@tempb-\@tempswafalse
           \if@firstamp\@firstampfalse\else\HH@add{&\omit}\fi
              \HH@add{\leaders\hrule\@height\arrayrulewidth\hfil}\else
  \if\@tempb=\@tempswafalse
       \if@firstamp\@firstampfalse\else\HH@add{&\omit}\fi
       \HH@add
          {\rlap{\copy\@ne}\leaders\copy\@ne\hfil\llap{\copy\@ne}}\else
  \if\@tempb t\HH@add{\rlap{\HH@box\doublerulesep\z@}}\else
  \if\@tempb b\HH@add{\rlap{\HH@box\z@\doublerulesep}}\else
  \PackageWarning{hhline}%
      {\meaning\@tempb\space ignored in \noexpand\hhline argument%
       \MessageBreak}%
  \fi\fi\fi\fi\fi\fi\fi\fi\fi
  \next}
%%%%%%%%%%%%%%
%%%%%%%%%%%%%%
% Au début du document, on crée automatiquement la page de titre, 
% l'historique et la table des matières. On débute le 'chapitre' qui 
% contient la partie principale du document.
\AtBeginDocument{%
  \maketitle
  \pagestyle{systematic}%
  \@historique
  \@auteurs
  \tableofcontents
  \cleardoublepage
  \chapter*{\protect\@title}
  \vspace{6mm}
}

\endinput
