%%%%%%
% Page de titre du livre

% Inspiré de \titleTH de Peter Wilson, Some Examples of Title Pages
\newcommand*{\titre}{\begingroup
\raggedleft\thispagestyle{empty}
\vspace*{\baselineskip}
{\Large Sylvain Perifel}\\[0.35\textheight]
{\color{teal!80!black}{\Huge COMPLEXITÉ}}\\[\baselineskip]
{\color{teal!80!black}{\Huge ALGORITHMIQUE}}\\[\baselineskip]
\endgroup\newpage\thispagestyle{empty}\null\vfill%
\begin{center}\color{gray}%
  Version électronique sous licence \textit{Creative Commons}

  {\color{black}  \includegraphics[width=6mm]{by.pdf}
  \includegraphics[width=6mm]{nc-eu.pdf}
  \includegraphics[width=6mm]{sa.pdf}}% images de Creative Commons

  (paternité, pas d’utilisation commerciale, partage dans les mêmes
  conditions)

  \url{http://creativecommons.org/licenses/by-nc-sa/3.0/fr/}

  Sylvain Perifel, 2013
\end{center}
}

%%%%%%
% Titres de chapitre - adaptation de la classe book.cls
\makeatletter
% titre de chapitre numéroté (utilisation de \shorthandoff{;:?!} pour éviter
% un problème avec hyperref et babel)
\def\@makechapterhead#1{%
  \vspace*{50\p@}%
  {\parindent \z@ \raggedright \normalfont
    \ifnum \c@secnumdepth >\m@ne
      \if@mainmatter
\hfill{\shorthandoff{;:?!}\tikz[remember picture]\node (nr){\fontsize{120}{70}\selectfont\color{teal!40}\thechapter};}\hfill\null
      \fi
    \fi
    \interlinepenalty\@M
{\shorthandoff{;:?!}\tikz[overlay,remember picture] \draw (nr) node{
    \begin{varwidth}{\textwidth}\centering%
      \fontsize{35}{35}\selectfont\color{teal!50!black}%
      #1\end{varwidth}};}
    \vskip 50\p@
  }}

% titre de chapitre non numéroté
\def\@makeschapterhead#1{%
  \vspace*{50\p@}%
  {\parindent \z@ \raggedright
    \normalfont
    \interlinepenalty\@M
{\shorthandoff{;:?!}\hfill\tikz[overlay,remember picture] \draw (0,0) node{
    \begin{varwidth}{\textwidth}\centering%
      \fontsize{35}{35}\selectfont\color{teal!40!black}%
      #1\end{varwidth}};\hfill\null}
    \vskip 50\p@
  }}
\makeatother


%%%%%%
% Compteur pour les théorèmes, définitions, lemmes...
\newcounter{theoreme}[chapter]

% Pour obtenir des numérotation A,B,...,AA,AB,... commandes AlphAlph et alphalph
\renewcommand\thetheoreme{\thechapter-\AlphAlph{\value{theoreme}}}


%%%%%%%%%%%%
% Théorèmes, définitions, etc. : cadres ou fonds
% (packages framed et mdframed avec Tikz)
%%%%%%%%%%%%

% Tester si un argument est vide
\makeatletter
\def\ifemptyarg#1{%
  \if\relax\detokenize{#1}\relax % H. Oberdiek
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}
\makeatother

% Options Tikz
\pgfdeclarelayer{background}
\pgfsetlayers{background,main}

%%%%%%
% Couleurs
% théorème
\newcommand\coloredthetheoreme{\colorbox{yellow!90!teal!40}{\thetheoreme}}
\colorlet{CoulFondTh}{green!70!black!5}
\tikzset{theo/.style={CoulFondTh, rounded corners}}
% proposition, lemme, corollaire, définition : idem (non redonnées)
% section, figure, etc.
% légende des figures
\renewcommand{\captionfont}{\color{teal}}

%%%%%%
% Sections grâce au package titlesec
% (couleurs CoulSection et CoulNumSec à définir)
\titleformat{\section}[hang]
{\normalfont\Large\bfseries\color{CoulSection}}{\colorbox{CoulNumSec}{\itshape\thesection}}{1em}{}
\titleformat{\subsection}[hang]
{\normalfont\large\bfseries\filcenter\color{CoulSection}}{\colorbox{CoulNumSec}{\itshape\thesubsection}}{1em}{}

%%%%%%
% Figure
% encadrement simple, package mdframed
\newenvironment{figureF}[1][]{
  \noindent\begin{figure}[#1]
    \begin{mdframed}[roundcorner=3pt,innermargin=-2mm,outermargin=-3mm,linecolor=CoulCadreFigure,innerrightmargin=7pt,innerleftmargin=7pt]
    }{%
    \end{mdframed}
  \end{figure}
}

%%%%%%
% Remarque
% mdframed encadrement ouest et sud
\newenvironment{remarque}[1][]{
\refstepcounter{theoreme}%
    \begin{mdframed}[roundcorner=3pt,
    topline=false,rightline=false,innermargin=-2.4ex,outermargin=-2.4ex]
    \textbf{\coloredthetheoreme\quad Remarque#1}\quad}%
{\end{mdframed}\par\medskip}


%%%%%%
% Pour le package framed
% Définir quatre cadres possibles :
% 1. si le théorème est entièrement sur la même page, l'encadrer complètement
% 2. s'il est coupé, début de l'encadrement sur la première page
% 3. le milieu sur les pages suivantes
% 4. la fin sur la dernière page

%%%%%%
% Théorème
% Fond coloré, coins arrondis en début de cadre et fin de cadre

% 1. Entièrement sur la page
\def\cadreth#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1}; % afficher le texte #1 du théorème (noeud A)
  \begin{pgfonlayer}{background} % derrière le texte
  \fill[theo] % remplir un rectangle à bords arrondis autour de A
        (A.south east) -- (A.south west) --
        (A.north west) -- (A.north east) -- cycle;
  \end{pgfonlayer}}}

% 2. Début sur une page
\def\cadrethFirst#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1};
  \begin{pgfonlayer}{background}
    \clip (A.south east) -- (A.south west) --
    (A.north west) -- (A.north east) -- cycle; % clip = astuce pour les deux
                                % coins droits
    \fill[theo] % rectangle avec coins supérieurs arrondis et inférieurs droits
        ($(A.south east)+(0,-.2)$) -- ($(A.south west)+(0,-.2)$) --
        (A.north west) -- (A.north east) -- cycle;
  \end{pgfonlayer}}}

% 3. Milieu sur les pages suivantes
\def\cadrethMiddle#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1};
  \begin{pgfonlayer}{background} 
  \fill[CoulFondTh] % rectangle à coins droits
        (A.south east) -- (A.south west) -- 
        (A.north west) -- (A.north east) -- cycle;
  \end{pgfonlayer}}}

% 4. Fin sur la dernière page
\def\cadrethLast#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1};
  \begin{pgfonlayer}{background}
    \clip (A.south east) -- (A.south west) --
    (A.north west) -- (A.north east) -- cycle;
    \fill[theo]
        ($(A.north east)+(0,.2)$) -- ($(A.north west)+(0,.2)$) --
        (A.south west) -- (A.south east) -- cycle;
  \end{pgfonlayer}}}

% l'environnement
\newenvironment{theoreme}[1][]{%
\refstepcounter{theoreme}% incrément du compteur
  \def\FrameCommand{\cadreth}% définition des types de cadre
  \def\FirstFrameCommand{\cadrethFirst}%
  \def\MidFrameCommand{\cadrethMiddle}%
  \def\LastFrameCommand{\cadrethLast}%
  \vskip\baselineskip\smallskip
  \MakeFramed {\FrameRestore}
\ifemptyarg{#1}% si pas de nom au théorème
{\noindent\tikz\node[inner sep=1ex, draw=black!20,fill=white,%
          anchor=west, overlay] at (0em, 0.8em) {\textbf{\coloredthetheoreme\quad
              Théorème}};\par} % affichage de "théorème"
{\noindent\tikz\node[inner sep=1ex, draw=black!20,fill=white,%
          anchor=west, overlay] at (0em, 0.8em) {\textbf{\coloredthetheoreme\quad
              Théorème (#1)}};\par}}% sinon affichage de "théorème (bla)"
{\endMakeFramed}

%%%%%%
% Proposition
% utilisation de framed comme pour theoreme
% lemme et corollaire idem
% ...

%%%%%%
% Définition
% utilisation de framed comme pour theoreme mais cadre seul sans fond

\def\cadredef#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1};
  \begin{pgfonlayer}{background}
  \draw[CadreDef,line width=.6mm,rounded corners]
        (A.south east) -- (A.south west) -- 
        (A.north west) -- (A.north east) -- cycle;
  \end{pgfonlayer}
}}

\def\cadredefMiddle#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1};
  \begin{pgfonlayer}{background}
  \draw[CadreDef,line width=.6mm] (A.south east) -- (A.north east);
  \draw[CadreDef,line width=.6mm] (A.south west) -- (A.north west);
  \end{pgfonlayer}
}}

\def\cadredefFirst#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1};
  \begin{pgfonlayer}{background}
  \draw[CadreDef,line width=.6mm,rounded corners] (A.south east) -- (A.north east) -- (A.north west) -- (A.south west);
  \end{pgfonlayer}
}}

\def\cadredefLast#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1};
  \begin{pgfonlayer}{background}
  \draw[CadreDef,line width=.6mm,rounded corners] (A.north east) -- (A.south east) -- (A.south west) -- (A.north west);
  \end{pgfonlayer}
}}


\newenvironment{definition}[1][]{%
  \refstepcounter{theoreme}%
  \def\FrameCommand{\cadredef}%
  \def\FirstFrameCommand{\cadredefFirst}%
  \def\LastFrameCommand{\cadredefLast}%
  \def\MidFrameCommand{\cadredefMiddle}%
  \vskip\baselineskip\smallskip
\MakeFramed {\FrameRestore}
\ifemptyarg{#1}%
{\noindent\tikz\node[inner sep=1ex, draw=CadreDef,fill=white,%
          anchor=west,overlay] at (0em, 0.8em) {\textbf{\coloredthetheoreme\quad
              Définition}};\par}
{\noindent\tikz\node[inner sep=1ex, draw=CadreDef,fill=white,%
          anchor=west,overlay] at (0em, 0.8em) {\textbf{\coloredthetheoreme\quad
              Définition (#1)}};\par}}
{\endMakeFramed}


%%%%%%
% Exercice (plus simple, un seul type de cadre, trait sur la gauche)

\def\cadreexo#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1};
  \begin{pgfonlayer}{background}
  \draw[CadreExo]
        ($(A.north west)+(.8,0)$) -- ($(A.south west)+(.8,0)$);
  \end{pgfonlayer}
}}

\newenvironment{exercice}{%
\refstepcounter{theoreme}%
  \def\FrameCommand{\cadreexo}%
  \def\FirstFrameCommand{\cadreexo}%
  \def\LastFrameCommand{\cadreexo}%
  \def\MidFrameCommand{\cadreexo}%
  \vskip\baselineskip\smallskip
  \MakeFramed {\FrameRestore}
\tikz\node[anchor=west,inner sep=1ex,overlay,fill=white] (exo)
 at (-2.88em,0.8em) {{\large\ding{46}}\quad\textbf{\coloredthetheoreme\quad
     Exercice}}; % \ding{46} = "crayon" dans la marge
\begin{adjustwidth}{8mm}{0mm}}
{\end{adjustwidth}\endMakeFramed}

%%%%%%
% environnement type algorithme (trait sur la gauche revenant sur les côtés)

\def\cadrealgo#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1};
  \begin{pgfonlayer}{background}
  \draw[rounded corners] ($(A.north west)+(2.1,0)$) -- ($(A.north
  west)+(1.3,0)$) -- ($(A.south west)+(1.3,0)$) -- ($(A.south west)+(2.1,0)$);
  \end{pgfonlayer}
}}

\def\cadrealgoFirst#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1};
  \begin{pgfonlayer}{background}
  \draw[rounded corners] ($(A.north west)+(2.1,0)$) -- ($(A.north
  west)+(1.3,0)$) -- ($(A.south west)+(1.3,0)$);
  \end{pgfonlayer}
}}

\def\cadrealgoLast#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1};
  \begin{pgfonlayer}{background}
    \draw[rounded corners] ($(A.north west)+(1.3,0)$) -- ($(A.south
    west)+(1.3,0)$) -- ($(A.south west)+(2.1,0)$);
  \end{pgfonlayer}
}}

\def\cadrealgoMiddle#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1};
  \begin{pgfonlayer}{background}
    \draw ($(A.north west)+(1.3,0)$) -- ($(A.south west)+(1.3,0)$);
  \end{pgfonlayer}
}}

\newenvironment{algorithme}{%
  \def\FrameCommand{\cadrealgo}%
  \def\FirstFrameCommand{\cadrealgoFirst}%
  \def\LastFrameCommand{\cadrealgoLast}%
  \def\MidFrameCommand{\cadrealgoMiddle}%
  \vskip\baselineskip\smallskip
  \MakeFramed {\FrameRestore}
\begin{adjustwidth}{12mm}{12mm}}
{\end{adjustwidth}\endMakeFramed}


%%%%%%
% Mise en perspective ("Un peu de recul")

\def\cadrerecul#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1};
  \begin{pgfonlayer}{background}
  \draw[CadreRecul,rounded corners]
        (A.south east) -- (A.south west) -- 
        (A.north west) -- (A.north east) -- cycle;
  \end{pgfonlayer}
}}

\def\cadrereculMiddle#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1};
  \begin{pgfonlayer}{background}
  \draw[CadreRecul] (A.south east) -- (A.north east);
  \draw[CadreRecul] (A.south west) -- (A.north west);
  \end{pgfonlayer}
}}

\def\cadrereculFirst#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1};
  \begin{pgfonlayer}{background}
  \draw[CadreRecul,rounded corners] (A.south east) -- (A.north east) -- (A.north west) -- (A.south west);
  \end{pgfonlayer}
}}

\def\cadrereculLast#1{
\tikz{
  \node[inner sep=0.6em] (A) {#1};
  \begin{pgfonlayer}{background}
  \draw[CadreRecul,rounded corners] (A.north east) -- (A.south east) -- (A.south west) -- (A.north west);
  \end{pgfonlayer}
}}

\newenvironment{recul}{%
  \def\FrameCommand{\cadrerecul}%
  \def\FirstFrameCommand{\cadrereculFirst}%
  \def\LastFrameCommand{\cadrereculLast}%
  \def\MidFrameCommand{\cadrereculMiddle}%
  \vskip\baselineskip\smallskip
  \MakeFramed {\FrameRestore}
\hfill\tikz\node[inner sep=1ex, draw=CadreRecul,fill=FillCadreRecul,%
          overlay] at (0em, 0.8em) {\textbf{Un peu de recul}};\hfill\null\par}
{\endMakeFramed}


%%%%%%
% Environnements simples (sans cadre)
% Exemple

\newenvironment{exemple}%
{        \refstepcounter{theoreme} \begin{list}% pour la marge de gauche
	{\hspace{-.41em}\textbf{\coloredthetheoreme\quad Exemple}}%
	{\setlength{\labelwidth}{5mm}%
         \addtolength{\labelwidth}{-5.9pt}%
	 \setlength{\leftmargin}{5mm}%
         }\item}%
{ \end{list} }

%%%%%%
% Preuve et "Idée de la preuve" idem
% ...

%%%%%%
% Une "claim" dans une preuve
\newenvironment{claim}{\begin{adjustwidth}{8mm}{8mm}% package chngpage (marges
                                % gauche et droite)
    \textit{Démonstration} ---}%
  {\end{adjustwidth}} % Mettre manuellement "\hfill $\diamond$" à la fin
