\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{polytechnique}[2015/02/01 v1.2, standard scientific documents layout for Ecole polytechnique.]

%=======================================================================================
%Petit historique de la creation du package
%=======================================================================================
%Le binet TypographiX a ete refonde par la promotion 2013 durant son tronc commun, et parmi
%ses projets se trouvait celui de faciliter la vie des eleves pour rediger leurs rapports
%en tout genre. Ainsi est venue l'idee d'un package polytechnique qui donnerait une mise en
%page adaptee a la nouvelle charte graphique de l'X cles en main. La maquette des pages et 
%surtout de la page de couverture a ete faire par une Mme Gaela Riou, infographiste de la 
%DIRCOM de l'X. L'auteur de ce package est Denis MERIGOUX et il a ete code fin janvier 2015.

%=======================================================================================
%Declaration des options.
%Le code qui s'y trouve est execute plus tard (toutes les commandes ont deja ete definies)
%=======================================================================================
\DeclareOption{a4paper}{%Passe l'option a4paper declaree au package geometry pour action
	\PassOptionsToPackage{a4paper}{geometry}
}
\DeclareOption{fancysections}{%Si activee, modifie le formatage des titres de section et sous-sections.
	\AtEndOfPackage{%Voir la documentation du package titlesec pour plus d'explications
		\titleformat{\chapter}[display]{\Huge\bfseries\sffamily}{\LARGE\chaptertitlename{} \thechapter}{0em}{}[]
		\titleformat{\section}[display]{\color{rouge485}\LARGE\bfseries\sffamily\filcenter}{\thesection}{0em}{\MakeUppercase}[
			\vspace*{-0.5\baselineskip}\includegraphics{\polyfiletlongrouge}
		]
		\titleformat{\subsection}[hang]{\color{bleu315}\Large\scshape}{\thesubsection}{0.5em}{}[
		\vspace*{-0.3\baselineskip}\includegraphics{\polyfiletcourtbleuclair}
		]
		\titleformat{\subsubsection}[block]{\color{bleu303}\large\scshape}{\thesubsubsection}{0.5em}{\textbullet{} }[]
	}
}
\DeclareOption{shorttitle}{%Option activee par defaut, titre avec logo vertical sur 1/2 page
	\AtBeginDocument{
		\renewcommand*{\maketitle}{
			\thispagestyle{plain}
			\vspace*{\distancetitrelogo}
			%Bloc de gauche (auteurs)
			\noindent
			\begin{minipage}[b]{\largeurminipage}\polyauthorsave\end{minipage}%La minipage permet les sauts de ligne pour avoir plusieurs auteurs
			\hspace*{\fill}
			%Centre (logo)
			\includegraphics[width=\largeurlogovert]{\polylogovert}\hspace*{\fill}
			%Bloc de droite (date)
			\begin{minipage}[b]{\largeurminipage}\flushright\polydatesave\end{minipage}%Idem ci-dessus
			\\[\separationlogotrait]
			%Deux filets horizontaux, le titre et le sous-titre sont au milieu
			\begin{center}
				\textcolor{bleu303}{\rule{\textwidth}{\epaisseurtrait}}
				\\\color{bleu303}\Huge\scshape\MakeUppercaseWithNewline{\polytitresave}%Le titre
				\ifthenelse{\boolean{subtitle}}{%Si il y a un sous-titre
					\\[\separationlignestitre]
					\Large\upshape\polysoustitresave\\\normalsize
				}{%S'il n'y en a pas
					\\\normalsize
				}
				\textcolor{bleu303}{\rule{\textwidth}{\epaisseurtrait}}
			\end{center}
			\vspace*{\distancetitrecorps}
		}
}
}
\DeclareOption{coverpage}{%Option qui active une page de garde où le titre prend toute la page
	\AtBeginDocument{
		\renewcommand*{\maketitle}{
			%On met les armes de l'Ecole en arriere-plan
			\noindent\makebox[\textwidth][c]{%
  			\raisebox{-\totalheight}[0pt][0pt]{%
    		\includegraphics[height=\hauteurlogopage]{\polyarmes}}}%
			\vspace*{0.125\textheight}
			\begin{center}
				%Le titre
				\Huge\sffamily\bfseries\color{bleu303}\MakeUppercaseWithNewline{\polytitresave}\\
				\vspace*{0.2\textheight}
				%Le sous-titre
				\LARGE\polysoustitresave\\
				\vspace*{0.15\textheight}
				%La date
				\Large\mdseries\polydatesave\\
				\includegraphics{\polyfiletcourtbleu}\\[0.4\baselineskip]
				%Les auteurs
				\rmfamily\polyauthorsave\\[\fill]
				%Le(s) logo(s) en bas de la page
				$\;$\polylogosup{}
				\vspace*{-0.5\margebas}%On rabote la marge basse habituelle
			\end{center}
			\thispagestyle{empty}
			\clearpage
			\setcounter{page}{1}
		}
	}
}
\DeclareOption*{%Toute autre option sera donnee en argument au package geometry (si differentes tailles de papier)
	\PassOptionsToPackage{\CurrentOption}{geometry}
}
\ExecuteOptions{a4paper,shorttitle}%Par defaut, papier A4 et petit titre
\ProcessOptions\relax

%=======================================================================================
%Packages requis
%=======================================================================================
\RequirePackage{ifthen}%Pour la structure conditionnelle
\RequirePackage{ifpdf}%Pour detecter le mode de compilation
\RequirePackage[pagestyles]{titlesec}%Pour les en-tetes - pieds de page
\RequirePackage{graphicx}%Pour les logos inseres
\RequirePackage{geometry}%Pour les marges
\RequirePackage{calc}%Pour faire des operations sur les longueurs
\RequirePackage{color}%Pour mettre les elements en bleu
\RequirePackage{lmodern}%On fixe la police une fois pour toutes

%=======================================================================================
%Couleurs
%Les valeurs RGB proviennent de la charte graphique de l'X (2014)
%=======================================================================================
\definecolor{bleu303}{RGB}{0,62,92}
\definecolor{rouge485}{RGB}{213,43,30}
\definecolor{bleu315}{RGB}{0,104,128}

%=======================================================================================
%Inclusion des logos
%Chaque chemin vers un logo est defini par une commande speciale
%=======================================================================================
\ifpdf%Si la compilation se fait avec pdflatex
	\newcommand{\polyfiletlongrouge}{filetlongrouge.pdf}
	\newcommand{\polyfiletcourtbleuclair}{filetcourtbleuclair.pdf}
	\newcommand{\polyfiletcourtbleu}{filetcourtbleu.pdf}
	\newcommand{\polylogovert}{logovert.pdf}
	\newcommand{\polylogohori}{logohori.pdf}
	\newcommand{\polyarmes}{armes.pdf}
\else%Si la compilation se fait avec latex, xetex ou autres
	\newcommand{\polyfiletlongrouge}{filetlongrouge.eps}
	\newcommand{\polyfiletcourtbleuclair}{filetcourtbleuclair.eps}
	\newcommand{\polyfiletcourtbleu}{filetcourtbleu.eps}
	\newcommand{\polylogovert}{logovert.eps}
	\newcommand{\polylogohori}{logohori.eps}
	\newcommand{\polyarmes}{armes.eps}
\fi

%=======================================================================================
%Longeurs
%Celles-ci sont definies manuellement, le design de la page a ete fait par la Dircom
%=======================================================================================
%Marges
\newlength{\margehaut}\setlength{\margehaut}{40mm}
\newlength{\hauteurentete}\setlength{\hauteurentete}{27mm}
\newlength{\separationentete}\setlength{\separationentete}{12mm}
\newlength{\margecote}\setlength{\margecote}{20mm}
\newlength{\margebas}\setlength{\margebas}{35mm}
\newlength{\separationpied}\setlength{\separationpied}{17.5mm}
%Taille des logos
\newlength{\hauteurlogohori}\setlength{\hauteurlogohori}{15mm}
%Disposition de la page de titre
\newlength{\separationtitre}\setlength{\separationtitre}{15mm}
\newlength{\epaisseurtrait}\setlength{\epaisseurtrait}{1pt}
\newlength{\separationlignestitre}\setlength{\separationlignestitre}{3mm}
\newlength{\separationtitrecorps}\setlength{\separationtitrecorps}{15mm}
\newlength{\hauteurlogopage}\setlength{\hauteurlogopage}{0.6\textheight}%La hauteur de l'image armes.pdf est fausse, 1.5cm doit donner a peu pres 10 cm (bug ?)
%En-tetes
\newlength{\separationentetelogo}\setlength{\separationentetelogo}{20mm}

%=======================================================================================
%Longueurs (suite)
%Celles-là sont déduites des longueurs definies au dessus.
%=======================================================================================
%Taille des logos
\newlength{\largeurlogovert}\setlength{\largeurlogovert}{\paperwidth/\real{7}}%Selon la charte graphique, la largeur est y/7 où y est la largeur de la page.
\newlength{\hauteurlogovert}\setlength{\hauteurlogovert}{\largeurlogovert*\real{1.361}}%1.361 est le ration hauteur/largeur du logo vertical de l'X.
\newlength{\largeurlogohori}\setlength{\largeurlogohori}{\hauteurlogohori*\real{1.859}}%1.859 est le ration hauteur/largeur du logo vertical de l'X.
%Disposition des titres
\newlength{\distancetitrelogo}\setlength{\distancetitrelogo}{\separationtitre-\margehaut}%Hauteur reglee pour qu'il y ait 10mm entre le haut de la page et le haut du logo.
\newlength{\separationlogotrait}\setlength{\separationlogotrait}{-\baselineskip*2+10mm}
\newlength{\largeurminipage}\setlength{\largeurminipage}{(\textwidth-\largeurlogovert)/\real{2}}
%En-têtes
\newlength{\largeurtitreentete}\setlength{\largeurtitreentete}{\textwidth-\largeurlogohori-\separationentetelogo}
\newlength{\decalageverticalentete}\setlength{\decalageverticalentete}{\hauteurlogohori/\real{2.6}}%2.6 pour que le titre soit aligne sur le "polytechnique" du logo à gauche
\newlength{\distancetitrecorps}\setlength{\distancetitrecorps}{\separationtitrecorps-\baselineskip*2}

%=======================================================================================
%Marges, entetes et pieds de page
%On utilise les package geometry et titlesec pour les regler
%=======================================================================================
\geometry{%Definit la geometrie de la page
	%Toutes les commandes en dessous sont des longueurs definies auparavant
	top=\margehaut,headheight=\hauteurentete,headsep=\separationentete,
	left=\margecote,right=\margecote,
	bottom=\margebas,footskip=\separationpied
}
\newcommand{\entetes}{%Comme l'en-tete contient le titre, on les active uniquement quand le titre est defini d'ou cette forme de commande
	\newpagestyle{polytechnique}{%On definit un nouveau style d'en-tetes
	\sethead{\includegraphics[height=\hauteurlogohori]{\polylogohori}}% left
	        {}% center
	        {\raisebox{\decalageverticalentete}{\begin{minipage}[b]{\largeurtitreentete}\scshape\flushright\textcolor{bleu303}{\polytitresave}\end{minipage}}}% right
	\setfoot{}% left
 	        {\textcolor{bleu303}{\shortstack[c]{\rule{4mm}{0.3mm}\\\thepage}}}% center, \shorstack c'est pour mettre le tiret au dessus du numero de page
 	        {}% right
	}
	\pagestyle{polytechnique}
}
\renewpagestyle{plain}{
	\sethead{}% left
	        {}% center
	        {}% right
	\setfoot{}% left
	        {\textcolor{bleu303}{\shortstack[c]{\rule{4mm}{0.3mm}\\\thepage}}}% center, \shorstack c'est pour mettre le tiret au dessus du numero de page
	        {}% right
}
\pagestyle{plain}

%=======================================================================================
%Commandes relatives a la page de titre
%Grace a elles, on peut faire \titre{Machin} au lieu de \renewcommand{\polytitre}{machin}
%=======================================================================================
%Sous-titre
\newboolean{subtitle}\setboolean{subtitle}{false}%Pour detecter si il existe un sous-titre, au debut on met le booleen a false
\newcommand{\polysoustitresave}{}%A voir comme une variable dans laquelle on stocke une valeur
\newcommand*{\subtitle}[1]{
	\renewcommand*{\polysoustitresave}{#1}
	\setboolean{subtitle}{true}%Puis on le met a true quand on definit un sous-titre
}
%Titre
\newcommand{\polytitresave}{}%A voir comme une variable dans laquelle on stocke une valeur
\renewcommand*{\title}[1]{
	\renewcommand*{\polytitresave}{#1}
	\entetes%Comme les en-tete dependent du titre, on les definit une fois qu'on connait le titre
}
%Auteurs
\newcommand{\polyauthorsave}{}%A voir comme une variable dans laquelle on stocke une valeur
\renewcommand*{\author}[1]{
	\renewcommand*{\polyauthorsave}{#1}
}
%Date
\newcommand{\polydatesave}{\today}%A voir comme une variable dans laquelle on stocke une valeur. \today est la date du jour dans la langue qu'il faut si babel est active
\renewcommand*{\date}[1]{
	\renewcommand*{\polydatesave}{#1}
}
%Logo(s) de bas de page pour l'option coverpage
\newcommand{\polylogosup}{\includegraphics[height=\hauteurlogovert]{\polylogovert}}%Variable de stockage initialisee par defaut au logo de l'X vertical
\newcommand{\logo}[1]{%Si l'utilisateur definit un logo personnalise avec \logo{truc}
	\renewcommand{\polylogosup}{%On redefinit la variable
	\includegraphics[height=1.5\hauteurlogohori]{\polylogohori}%Avec le logo horizontal de l'X
		\hspace{0.05\textwidth}
		\includegraphics[height=\hauteurlogovert,
			width=1.5\largeurlogohori,
			keepaspectratio]{#1}%Et le logo personnalise pas trop gros
	}
}
%Divers
\newcommand{\MakeUppercaseWithNewline}[1]{%Permet de mettre plusieurs lignes en majuscules (pour le titre)
  	\begingroup
    	\let\SavedOrgNewline\\%
    	\DeclareRobustCommand{\\}{\SavedOrgNewline}%
    	\MakeUppercase{#1}%
	\endgroup
}