%D \module
%D   [       file=CCSsujet,
%D        version=2021.12.12,
%D          title=Concours Centrale-Supélec,
%D       subtitle=Présentation des sujets,
%D         author=Jean-Philippe Rey,
%D           date=\currentdate,
%D      copyright=Concours Centrale-Supélec]
%C
%C Ce module est la propriété du concours Centrale-Supélec
%C et ne peut pas être utilisé, modifié ou reproduit sans
%C une autorisation expresse.

%D \enableregime[utf-8]

%D Ce module définit la présentation des sujets du Concours
%D Centrale-Supélec. Il s'agit d'une version simplifiée à usage
%D des auteurs de sujets.

\startenvironment *

\setupsynctex[state=start]

\startMPextensions
% Définition des traits d'axe et continu
picture dashdot, dashdotdot, solid;
dashdot := dashpattern (on 6pt off 2pt on 1pt off 2pt on 6pt);
dashdotdot := dashpattern (on 6pt off 2pt on 1pt off 2pt on 1pt off 2pt on 6pt);
solid := dashpattern (on 6pt);

% Épaisseurs de trait compatibles avec TikZ
pen mypen.ultrathin, mypen.verythin, mypen.thin, mypen.semithick, mypen.thick, mypen.verythick, mypen.ultrathick, mypen.dot;
mypen.ultrathin := pencircle scaled 0.1pt;
mypen.verythin := pencircle scaled 0.2pt;
mypen.thin := pencircle scaled 0.4pt;
mypen.semithick := pencircle scaled 0.6pt;
mypen.thick := pencircle scaled 0.8pt;
mypen.verythick := pencircle scaled 1.2pt;
mypen.ultrathick := pencircle scaled 1.6pt;
mypen.dot := pencircle scaled dotlabeldiam;
\stopMPextensions

\startMPinitializations
pickup pencircle scaled 0.4pt; % mypen.thin
save L, u, ux, uy;
u := 10mm;
\stopMPinitializations

\startmode[TIKZ]
% === Chargement de TikZ

\usemodule[tikz]
\usemodule[pgfplots] \pgfplotsset{compat=1.17}
\usetikzlibrary[
	angles,
	arrows.meta,
	backgrounds,
	calc,
	chains,
	circuits.ee.IEC,
	decorations.markings,
	decorations.pathmorphing,
	decorations.pathreplacing,
	decorations.text,
	fit,
	graphs,
	graphs.standard,
	intersections,
	math,
	patterns,
	plotmarks,
	positioning,
	quotes,
	shadows,
	shapes.arrows,
	shapes.callouts,
	shapes.geometric,
	shapes.multipart,
	]

%D Paramètrage de tikz et pgfplots

\tikzset{
	% Têtes de flèche par défaut
	>=Latex,
	% Format par défaut des nombres
	/pgf/number format/set decimal separator={{{,}}},
	/pgf/number format/set thousands separator=,
	/pgf/number format/sci generic={mantissa sep=\times,exponent=10^{#1}},
	/pgfplots/tick scale binop=\times,
	% Style des help lines
	/tikz/help lines/.style={thin,black!25},
	% Style des grilles de pgfplots
	/pgfplots/every tick/.style={thin,black!25},
	/pgfplots/every axis grid/.style={thin,black!25},
	% Configuration des légendes
	/pgfplots/legend cell align=left,
	}

%D Définition du style "show controls" pour visualiser les
%D points de contrôle des courbes de Bézier

\tikzset{
	show controls/.style={
		decorate,
		decoration={
			show path construction,
			curveto code = {
				\draw[#1] (\tikzinputsegmentfirst) circle [radius=1mm] -- (\tikzinputsegmentsupporta);
				\fill[#1] (\tikzinputsegmentsupporta) circle [radius=0.5mm];
				\draw[#1] (\tikzinputsegmentlast) circle [radius=1mm] -- (\tikzinputsegmentsupportb);
				\fill[#1] (\tikzinputsegmentsupportb) circle [radius=0.5mm];
				}
			}
		},
	show controls/.default=green,
	}

%D Définition de \PackageError
\ifx\PackageError\undefined
\def\PackageError#1#2#3{\writestatus{#1}{#2 (#3)}}
\fi

\stopmode

%D Paramétrage de la présentation du code

\definetyping[SQL][
   option=sql,
   before={\resetcharacterspacing\blank[line]},
   after={\blank[line]},
   ]

\definetyping[python][
   option=python,
   strip=yes,
   margin=2em,
   before={\blank[line]},
   after={\blank[line]},
   ]

\definetyping[pythonE][
   option=python,
   strip=yes,
   margin=2em,
   before={\blank[none, samepage]},
   after={\blank[none]},
   ]

\definetyping[caml][
   strip=yes,
   margin=2em,
   before={\blank[line]},
   after={\blank[line]},
   ]

\definetyping[camlE][
   strip=yes,
   margin=2em,
   before={\blank[none, samepage]},
   after={\blank[none]},
   ]


% Paramétrage de l'écriture des algorithmes

\usemodule[algorithmic]
\setupalgorithmictext[fr][require=Entrées :]
\setupalgorithmictext[fr][ensure=Sortie :]
\setupalgorithmictext[fr][end=fin]
\setupalgorithmictext[fr][if=si]
\setupalgorithmictext[fr][then=alors]
\setupalgorithmictext[fr][else=sinon]
\setupalgorithmictext[fr][elsif=sinon si]
\setupalgorithmictext[fr][endif=fin si]
\setupalgorithmictext[fr][for=pour]
\setupalgorithmictext[fr][forall=pour tout]
\setupalgorithmictext[fr][do=faire]
\setupalgorithmictext[fr][endfor=fin pour]
\setupalgorithmictext[fr][while=tant que]
\setupalgorithmictext[fr][endwhile=fin tant que]
\setupalgorithmictext[fr][loop=répéter]
\setupalgorithmictext[fr][endloop=fin répéter]
\setupalgorithmictext[fr][repeat=répéter]
\setupalgorithmictext[fr][until=jusqu'à]
\setupalgorithmictext[fr][print=afficher]
\setupalgorithmictext[fr][return=renvoyer]
\setupalgorithmictext[fr][true=vrai]
\setupalgorithmictext[fr][false=faux]

\definefloat[algorithm][algorithms]
\setupcaption[algorithm][way=bytext,prefixsegments=none]
\setuplabeltext[fr][algorithm=Algorithme ]


%D Les sources des sujets sont attendues en UTF-8.

\enableregime[utf-8]

%D Vérifier les caractères manquants dans la police choisie

\enabletrackers[fonts.missing]

%D Engendrer un pdf en version 1.4

%\directlua{pdf.setminorversion(4)}

%D Autoriser l'utilisation de couleurs (également nécessaire pour
%D l'utilisation de niveaux de gris).

\setupcolors[state=start]


%D Configurations de la présentation des formules mathématiques
%D Par défaut, les expressions dans le texte sont en displaystyle

\let\leq=\leqslant
\let\geq=\geqslant
\setupmathematics[integral=displaylimits, autopunctuation=no]
\appendtoks
    \displaystyle
\to \everymath


%D \macros{Diff, Dif}
%D Utilisée dans une formule mathématique pour générer le symbole
%D d de la différentielle et le différencier de la variable d.
%D La version avec deux f ajoute une espace fine avant, généralement
%D utile dans les intégrales

\def\Diff{{\thinspace\rm d}}
\def\Dif{{\rm d}}


%D \macros{Card, Det, Div, Diag, Grad, Image, Pimag, Preel, Rang, Rot, Spectre, Trace, Vect}
%D Divers opérateurs matriciels ou vectoriels

\definemathcommand[Card][nolop]{\mfunction{card}}
\definemathcommand[Det][nolop]{\mfunction{det}}
\definemathcommand[Diag][nolop]{\mfunction{diag}}
\definemathcommand[Div][nolop]{\mfunction{div}}
\definemathcommand[Grad][nolop]{\vec{\mfunction{grad}}}
\definemathcommand[Image][nolop]{\mfunction{Im}}
\definemathcommand[Pimag][nolop]{\mfunction{Im}}
\definemathcommand[Preel][nolop]{\mfunction{Re}}
\definemathcommand[Rang][nolop]{\mfunction{rg}}
\definemathcommand[Rot][nolop]{\vec{\mfunction{rot}}}
\definemathcommand[Spectre][nolop]{\mfunction{sp}}
\definemathcommand[Trace][nolop]{\mfunction{tr}}
\definemathcommand[Vect][nolop]{\mfunction{Vect}}


%D \macros{Transp}
%D Transposée d'une matrice (notation conseillée dans les programmes 2013)

\def\Transp#1{{#1}^\top}


%D \macros{Expun, Racmun}
%D Les nombres e et i

\def\Expun{{\rm e}}
\def\Racmun{{\rm i}}


%D \macros{[, ]}
%D Intervalles entiers (double crochets)

\let\[=\llbracket
\let\]=\rrbracket


%D matrices :
%D   - bmat entre accolades
%D   - cmat entre crochets
%D   - pmat entre parenthèses
%D   - vmat entre barres verticales simples
%D   - wmat entre barres verticales doubles
%D   - fdef pour définition de fonction (barre verticale à gauche seulement)

\definemathmatrix[bmat][left={\left\{\thinspace}, right={\thinspace\right\}}, simplecommand=Bmat]
\definemathmatrix[cmat][matrix:brackets][simplecommand=Cmat]
\definemathmatrix[pmat][matrix:parentheses][simplecommand=Pmat]
\definemathmatrix[vmat][matrix:bars][simplecommand=Vmat]
\definemathmatrix[wmat][left={\left\Vert\thinspace}, right={\thinspace\right\Vert}, simplecommand=Wmat]
\definemathmatrix[fdef][left={\left\vert\thinspace}, right={\right.}, align={middle, middle, left}, simplecommand=Fdef]


%D \macros{TB, HL, VL}
%D Pour espacer les lignes d'une matrice ou tracer une ligne horizontale
%D et une ligne verticale entre deux colonnes.
%D Simulation en MkIV des macros de LMTX.

\startmkivmode
	\def\TB[#1]{\noalign{\vskip #1}}
	\def\HL{\noalign{\hrule}}
	\def\VL{\dosingleempty\doVL}
	\def\doVL[#1]{\NC \hskip-0.5em \vrule #1 \hskip-0.5em \NC}
\stopmkivmode


%D \macros{MAT} : ensemble des matrices sur un corps donné
%D Deux paramètres optionnels entre crochets :
%D  - dimension ex: m,n, par défault n
%D  - corps de base ex : \complexes, par défaut \defaultCorps (à définir dans le préambule du sujet)
%D Utilisable en mode mathématique ou en mode texte.

\def\MAT{\dotripleempty\doMAT} % ensemble des matrices
\def\doMAT[#1][#2][#3]{% 1: dimension [n], 2: corps [\defaultCorps], 3: symbole [\cal M]
	\ifmmode%
		\def\bM{}%
		\def\eM{}%
	\else%
		\def\bM{\begingroup\tf$}%
		\def\eM{$\endgroup}%
	\fi%
	\iffirstargument\def\N{#1}\else\def\N{n}\fi%
	\ifsecondargument\def\C{#2}\else\def\C{\defaultCorps}\fi%
	\ifthirdargument\def\S{#3}\else\def\S{\cal M}\fi%
	\bM{\S}_{\N}(\C)\eM%
	}


%D Définition de la présentation des unités

\setupunits[method=3, order=reverse]
\registerunit[unit][
    becquerel=Bq, % faute de frappe dans phys-dim.lua
    debye=debye,
    enzymeunit=enzyme unit,
    euro=euro,
    parsec=parsec,
    poiseuille=poiseuille,
    ppm=ppm,
    SI=SI]
\setupunittext[fr][
    astronomicalunit=u.a.,
    byte=o,
    day=jour,
    debye=D,
    enzyme unit=U,
    euro=\euro,
    inch=pouce,
    liter=L,
    parsec=pc,
    percent=\thinspace\%,
    poiseuille=Pl,
    ppm=ppm,
    revolution=tr,
    SI=SI]

%D Pour les nombres écrits en format anglais

\defineunit[enunit][method=3, order=normal]

%D \macros{SourceDate}
%D Fonction lua pour obtenir la date de modification du fichier source

\startluacode
function modification_date(file)
	local f = file
	local attr = lfs.attributes(f)
	assert (type(attr) == "table")
	if attr.mode ~= "directory" then
		return os.date("%Y-%m-%d %H:%M:%S",attr.modification)
	end
end
\stopluacode

\unexpanded\def\SourceDate{%
	\ctxlua{context(modification_date ("\jobname.tex"))}%
}


%D \macros{Sujet}
%D Cette macro est obligatoire et permet de définir le sujet
%D sur lequel on travaille. Elle prend les paramètres suivants :
%D \startitemize
%D \item {\tt Epreuve}, indique le nom de l'épreuve (obligatoire)
%D \item {\tt Filiere}, la ou les filières concernées, s'il
%D   y a plusieurs filière, encadrer la liste entre accolades
%D   (ex. {\tt\{MP, PC, PSI\}}) (obligatoire)
%D \item {\tt Duree}, la durée de l'épreuve (défaut~: {\tt 4 heures})
%D \item {\tt Calculatrice}, indiquer {\tt non} si les calculatrices
%D   sont interdites (défaut~: {\tt oui})
%D \item {\tt Langue}, indiquer {\tt oui} s'il s'agit d'un sujet de
%D   langue vivante (défaut : {\tt non})
%D \stopitemize

\def\Sujet[#1]{%
	\getparameters[ETP][Duree=4 heures,Calculatrice=oui,Langue=non,#1]
	\doifelse{\ETPCalculatrice}{oui}
		{\def\CALC{Calculatrice autoris\'ee}}
		{\def\CALC{Calculatrice interdite}}
	\mainlanguage[fr]
	\doif{\ETPLangue}{non}{\setcharacterspacing[frenchpunctuation]}
}

%D La macro \type{\Sujet} se contente de mémoriser ses paramètres et
%D s'il ne s'agit pas d'un sujet de langue vivante, d'activer la
%D ponctuation à la française.


%D \macros{T}
%D Cette macro est un raccourci pour marquer les titres. Elle
%D s'utilise ainsi~:
%D \starttyping
%D \Ti[ref]{Titre}
%D \stoptyping
%D où
%D \startitemize
%D \item {\tt i} est le niveau du titre (1, 2, 3, 4 ou 5), 1 correspondant
%D   aux titres de plus haut niveau (titres de parties)
%D \item {\tt ref} est optionnel et correspond à une clef utilisable
%D   dans le texte pour faire référence à cette section (à l'aide par
%D   exemple de \type{\in})
%D \item {\tt Titre} est le titre de la section, il peut être vide
%D   (indiqué par \type{{}}) dans ce cas, le numéro est placé au début
%D   du paragraphe suivant.
%D \stopitemize
%D
%D Exemples :
%D \starttyping
%D \T1[Partie 2]{L'Angleterre}
%D \T2{La côte sud}
%D \T3[Solent]{} Le bras de mer situé entre l'île de Wight et la côte ...
%D \stoptyping

\def\T#1{\dodoubleempty\doHead[#1]}
\def\doHead[#1][#2]#3{%
	\ifcase#1 %T0
	\or %T1
		\def\CurHead{\UnTitre}
	\or %T2
		\doifemptyelse{#3}{\def\CurHead{\Deux}}{\def\CurHead{\DeuxTitre}}
	\or %T3
		\doifemptyelse{#3}{\def\CurHead{\Trois}}{\def\CurHead{\TroisTitre}}
	\or %T4
		\doifemptyelse{#3}{\def\CurHead{\Quatre}}{\def\CurHead{\QuatreTitre}}
	\or %T5
		\doifemptyelse{#3}{\def\CurHead{\Cinq}}{\def\CurHead{\CinqTitre}}
	\fi
	\CurHead[#2]{#3}
}


%D \macros{Titre}
%D Cette macro permet de définir le titre général du sujet. Son emploi
%D n'est pas obligatoire, étant donné qu'un sujet n'a pas forcément
%D de titre. Si elle est utilisée, elle devrait logiquement apparaître
%D juste après \type{\EnTete}.

\def\Titre#1{\startalignment[middle]\bic #1\stopalignment\page[no]\blank}

%D \macros{Partie}
%D Cette macro permet de séparer le sujets en grandes parties,
%D indépendamment de la numérotation des différents niveaux de questions.
%D Son usage n'est pas obligatoire.

\def\Partie#1{\blank[line]{\bic #1}\blank[line,samepage]}


%D \macros{Consigne}
%D Comme son nom l'indique, cette macro sert à donner des
%D consignes aux candidats.

\def\Consigne#1{{\it #1}}


%D \macros{Indication}
%D Cette macro sert à donner des indications aux candidats.
%D Son argument doit être un unique paragraphe.

\def\Indication#1{\page[no]\startnarrower[left]\ss #1 \stopnarrower}


%D \macros{PageVide}
%D Cette macro trace un trait en diagonale d'une page.

\def\PageVide{%
	\page
	\startMPcode
	draw origin -- (TextWidth, TextHeight);
	\stopMPcode
}


%D \macros{Fin}
%D Cette macro marque explicitement la fin du sujet. Elle prend
%D un argument optionnel (entre crochets) qui doit être une dimension
%D indiquant la quantité d'espace vertical à ajouter avant la marque
%D de fin (ex. \type{\Fin[line]}).

\def\Fin{\dosingleempty\doFin}
\def\doFin[#1]{%
	\placefloats
	\iffirstargument\blank[#1, samepage]\fi
	\framed[frame=off, topframe=on, bottomframe=on, width=\textwidth]{%
		\hfill$\bullet\ \bullet\ \bullet$ FIN $\bullet\ \bullet\ \bullet$\hfill}
}


%D \macros{Objectif}
%D La macro \type{\Objectif} est principalement utilisée dans les sujets
%D de S2I pour indiquer l'objectif visé par chaque partie du sujet.

\def\Objectif#1{\vbox{\startnarrower[left]\textrule[top]{Objectif}%
	#1
	\textrule\stopnarrower}
}


%D \macros{startInfo, stopInfo}
%D La macro \type{\startInfo} est principalement utilisée dans les sujets
%D d'informatique pour donner des indications spécifiques à un langage
%D particulier (typiquement Caml ou Pascal)

\def\startInfo#1{\textrule[top]{#1}%
\vskip\parskip%
\startframedtext[width=local,before=\vskip-\baselineskip,topframe=off,boffset=-1ex]
}
\def\stopInfo{\stopframedtext}

%D \macros{Reference}
%D La macro \type{\Reference} est principalement utilisée dans les
%D sujets de français et de langue pour donner la référence des
%D textes utilisés.

\def\Reference#1{\blank[line]\startalignment[left]#1\stopalignment}


%D \macros{Mots}
%D La macro \type{\Mots} est principalement utilisée dans les
%D sujets de français et de langue pour donner le nombre de mots
%D d'un texte.

\def\Mots#1{\doifnotmode{BAT}{{\it #1 mots.}}}


% === Présentation du texte

%D Définition de la police de caractères à utiliser.
%D Utilisation de Computer modern 10pt avec protrusion
%D et italique (au lieu de slanted) pour les mises en valeur.

\definefontfeature[default][default][protrusion=quality]
\setupalign[hanging]
\setupbodyfont[10pt]
\setupbodyfontenvironment[default][em=italic]

%D Un petit espace entre les paragraphes et aucun espace
%D autour des listes ou des exemples de programmes.

\setupwhitespace[small]  % Espace entre paragraphes
\setupitemgroup[itemize][each][
	before={\blank[small]},
	after={\blank[small]},
	inbetween={\blank[small]},
	beforehead={\blank[small]},
	afterhead={\blank[none, samepage]},
	]
\setuptyping[typing][before=,after=,margin=15mm]

%D Par défaut, les indentations se font par 15mm comme la largeur des numéros de titres

\setupnarrower[left=15mm, right=15mm, middle=15mm]

%D Définition des listes à la française, le premier
%D niveau utilise des -, le deuxième des puces

\definesymbol[1][—]
\definesymbol[2][$\bullet$]

%D Interdiction des lignes veuves et orphelines.

\setpenalties\clubpenalties{2}{10000}
\setpenalties\widowpenalties{2}{10000}


% === Présentation des titres et questions

\definehead[UnTitre][chapter]
\definehead[DeuxTitre][section]
\definehead[Deux][DeuxTitre]
\definehead[TroisTitre][subsection]
\definehead[Trois][TroisTitre]
\definehead[QuatreTitre][subsubsection]
\definehead[Quatre][QuatreTitre]
\definehead[CinqTitre][subsubsubsection]
\definehead[Cinq][CinqTitre]

\def\InterTitre#1{{\bf #1}\par\nobreak}

\definestructureconversionset[CCS][numbers,Romannumerals,Character,numbers,character,romannumerals][numbers]
\setupheads[sectionconversionset=CCS]
\setuphead[subsubsection][sectionsegments=subsubsection]
\setuphead[subsubsubsection][sectionsegments=subsubsubsection]
\setupformulas[prefixconversionset=CCS]

\def\NumberUn#1{#1}
\def\NumberDeux#1{\hbox to 4.27em{#1\ --\hfil}}
\def\NumberTrois#1{\hbox to 4.27em{#1)\hfil}}
\def\NumberQuatre#1{\hbox to 1.423em{#1)\hfil}}
\def\NumberCinq#1{\hbox to 4.27em{\hfil #1.\hskip1em}}
\unexpanded\def\TitreQuatre#1#2{\hbox{\NumberQuatre{#1}{#2}\hskip1em}}
\unexpanded\def\TitreCinq#1#2{\hbox{\NumberCinq{#1}{#2}\hskip1em}}

\setuphead[chapter][page=no]
\setuphead[UnTitre][
	numbercommand=\NumberUn,
	style=\bfb,
	before={\placefloats\blank[line]},
	after=]
\setuphead[DeuxTitre][
	numbercommand=\NumberDeux,
	style=\bi,
	distance=0mm,
	aligntitle=float,
	before=\blank,
	after=]
\setuphead[Deux][
	alternative=text]
\setuphead[TroisTitre][
	numbercommand=\NumberTrois,
	style=\bf,
	distance=0mm,
	aligntitle=float,
	before=,
	after=]
\setuphead[Trois][
	alternative=text]
\setuphead[QuatreTitre][
	command=\TitreQuatre,
	alternative=text,
	distance=0mm,
	style=\it,
	aligntitle=float,
	before=,
	after=]
\setuphead[CinqTitre][
	command=\TitreCinq,
	alternative=text,
	distance=0mm,
	style=\it,
	aligntitle=float,
	before=,
	after=]

\defineenumeration[Question][
	alternative=serried,
	text=Q,
	stopper=.,
	width=3.7em,
	distance=0.57em,
	before=,
	inbetween=,
	after=,]

%D Numérotation des figures et des tables en séquence
%D pour tout le document.

\setupcaption[figure][way=bytext,prefixsegments=none]
\setupcaption[table][way=bytext,prefixsegments=none]

%D Autant de float que possible en haut de page.

\setupfloats[ntop=100]

% === Macros pour les en-têtes

%D \macros{EnTete}
%D Construit l'en-tête en première page, éventuellement complétée
%D par l'interdiction des calculatrices.

\def\EnTete{%
	\framed[width=170mm,height=30mm,align=middle]{\fr %
		\jobname{} engendr\'e le \currentdate{} \`a \currenttime{}\\
		\`a partir du fichier source modifi\'e le \SourceDate{}\\
		Engine : \texenginename\ \texengineversion\\
		\ConTeXt : \contextversionnumber\\
		PGF : \pgfversion, pgfplots \pgfplotsversion/\pgfkeysvalueof{/pgfplots/compat/current}
		\vfill
		Dur\'ee : \ETPDuree\hfil\CALC
	}
	\blank[5mm]
	\doifelse{\ETPCalculatrice}{oui}{}{
		\midaligned{\ss\it L'usage de tout syst\`eme \'electronique
		ou informatique est interdit dans cette \'epreuve.}
	}
}


% === Présentation générale des pages

%D Définition de la présentation par défaut (A4 sur du A4)

\setuppapersize[A4][A4]


%D Les en-têtes sont vides

\setupheadertexts[]
\setupheadertexts[][]

%D Pied de page au centre : numéro de page / nb total de page

\setupfootertexts[Page {\pagenumber}/{\totalnumberofpages}]


%D Pied de page droite et gauche timestamp et nom de fichier + version

\setupfootertexts[\fr\SourceDate][\jobname/\contextversionnumber]

%D 2 cm de marges droite et gauche, 1 cm de marges haut et bas.

\setuplayout[
	topspace=10mm,
	backspace=20mm,
	width=170mm,
	height=277mm,
	header=0mm,
	footer=10mm
]
