%--------------------------------------------------
% pb.tex
% macros pour le polycopié de cours
% M. Quercia, 10/08/2014
%--------------------------------------------------

\input montchapet

% autorise @ dans les noms
\catcode64=11

%--------------------------------------------------
% mise en page
%--------------------------------------------------

\footline={\petit
\ifodd\pageno
  \pnumtxt\hfil page \folio
\else
  page \folio\hfil\pnumtxt
\fi}

%--------------------------------------------------
% numérotation automatique
%--------------------------------------------------

% \pnum      = numéro de la partie en cours
% \pnumtxt   = titre de la partie en cours
% \qqnum     = numéro de la question en cours
% \sqnum     = numéro de la sous-question en cours
% \numindent = indentation pour numéros
% \qqmarge   = marge n° de question
% \sqmarge   = marge n° de sous-question

\def\pnumtxt{}
\newdimen\numindent\numindent=5mm
\def\indent{\hskip\numindent}
\newcount\pnum\pnum=0
\newcount\qqnum\qqnum=0   \newdimen\qqmarge\qqmarge=\leftskip
\newcount\sqnum\sqnum=96  \newdimen\sqmarge\sqmarge=\leftskip
\let\xe\relax % pas encore de partie

\def\razqq{\global\qqnum=0}
\def\reserve#1{\vskip#1\baselineskip\goodbreak\vskip-#1\baselineskip}

% nouvelle partie
\def\partie{\catcode13=12\relax\partie@} % accepte ^M comme délimiteur

{\catcode13=12
\gdef\partie@#1^^M{%                 % #1 = titre
\catcode13=5                         % restaure le code de ^M
\xe                                  % termine la partie précédente
\vfill\eject                         % change de page
\global\advance\pnum by 1            % avance le n° de partie
\xdef\pnumtxt{\uppercase\expandafter{\romannumeral\pnum} --- #1}%
\razqq                               % init le n° de question
\global\sqnum=96                     % init le n° de sous-question
\tmatwrite{partie}{{\pnumtxt}}%      % enregistre dans la table des matières
\begingroup                          % isole la partie dans un groupe
\parindent=0pt                       % pas d'indentation
\let\xe\xe@\let\qq\qq@\let\QQ\QQ@    % active les macros \xe, \qq et \QQ
\leftskip=0pt                        % initialise la marge
\qqmarge=\leftskip                   % mesure la marge des questions
\centerline{\bf \pnumtxt}\medskip}}

% fin de partie
\def\xe@{
\vskip 0pt                           % termine le paragraphe
\endgroup                            % referme le groupe de la partie
\vskip3cm\goodbreak\vskip-3cm}       % change de page s'il reste moins de 3cm

% nouvelle question
\def\qq@{%
\global\advance\qqnum by 1           % avance le n° de question
\catcode13=12\relax\QQ@{\the\qqnum}} % annonce la question

{\catcode13=12
\gdef\QQ@#1#2^^M{%                   % #1 = numéro, #2 = titre
\catcode13=5                         % restaure le code de ^M
\vskip\baselineskip\reserve5%        % changer de ligne
\leftskip=\qqmarge                   % remet la marge en place
\global\qqnum=#1%                    % note le numéro de question
\global\sqnum=96                     % init le n° de sous-question
\tmatwrite{qq}{{#1. #2}}%            % enregistre dans la table des matières
\advance\leftskip by \numindent      % décale la marge
\sqmarge=\leftskip                   % mesure la marge des sous-questions
\hskip-\numindent                    % écrit dans la marge
\let\sq\sq@\let\SQ\SQ@               % active les macros \sq et \SQ@
\hbox to\numindent{\hss\bf#1) }{\bf #2}\ignorespaces% numéro et titre
}}

% nouvelle sous-question
\def\sq@{%
\global\advance\sqnum by 1           % avance le n° de sous-question
\catcode13=12\relax\SQ@{\the\sqnum}} % annonce la sous-question

{\catcode13=12
\gdef\SQ@#1#2^^M{%                   % #1 = numéro, #2 = titre
\catcode13=5                         % restaure le code de ^M
\medskip\reserve3%                   % changer de ligne
\leftskip=\sqmarge                   % remet la marge en place
\global\sqnum=#1%                    % note le numéro de sous-question
\advance\leftskip by \numindent      % décale la marge
\hskip-\numindent                    % écrit dans la marge
\hbox to\numindent{\hss\bf\char#1) }{\bf #2}\ignorespaces% numéro et titre
}}

% énumération
\newcount\numitem

\let\item\undefined
\def\item@{\par
\advance\numitem1\relax
\leavevmode\hbox to0pt{\hskip-2\numindent(\romannumeral\numitem)\hss}}
\def\noitem@{\par\advance\leftskip-2\numindent\let\item\item@@}
\def\item@@{\par\advance\leftskip2\numindent\let\item\item@\item}

\def\enum#{\afterassignment\enum@\let\next@}
\def\enum@{%
\par
\begingroup
\advance\leftskip2\numindent
\numitem=0\relax
\let\item\item@
\let\noitem\noitem@
\bgroup
\aftergroup\finenum@}
\def\finenum@{\par\endgroup}

% Exemple, Théorème, ...
\def\xx{\catcode13=12\relax\XX@}
{\catcode13=12
\gdef\XX@#1^^M{%                     % #1 = titre
\catcode13=5                         % restaure le code de ^M
\medskip\goodbreak{\bf #1 }\ignorespaces       % sauter une ligne
}}

\def\thm{\begingroup\let\mht\endgroup\sl\catcode13=12\relax\XX@}

% Fin de démonstration
\newbox\qedbox\setbox\qedbox\hbox{\vrule height 6pt width 6pt depth 0pt}
\def\qed{\hfill\copy\qedbox\par}
\def\qedalign{\omit\hskip\hsize\hskip-\wd\qedbox\copy\qedbox\hidewidth}

% Alignement
\def\align#{\afterassignment\align@\let\next@}
\def\align@{\halign\bgroup\hskip\leftskip##\hfil&&##\hfil\cr}

%---------------------------------------------------------- Table des matières
\newwrite\@tablemat
\openout\@tablemat=\jobname.mat
\let\tmatpartie\relax
\let\tmatqq\relax

\def\tmatwrite#1#2{{%
  \edef\temp{\csname tmat#1\endcsname#2}%
  \expandafter\write\expandafter\@tablemat\expandafter{\temp{\folio}}%
}}

\def\tmatpartie@#1#2{\bigskip\line{\hskip\leftskip\relax
                  #1%
                  \quad\dotfill\quad
                  \hbox to 1.5em{\hfil#2}%
                  \hskip\rightskip}}
\def\tmatqq@#1#2{\line{\hskip\leftskip\hskip1cm #1\hfil}}

\def\composetablemat{%
  \vfill\eject
  \immediate\closeout\@tablemat
  \null\bigskip
  \centerline{\Gros\bf Table des matières}
  \bigskip
  \leftskip=0cm\rightskip=0cm
  \begingroup
  \let\tmatpartie\tmatpartie@
  \let\tmatqq\tmatqq@
  \let\pnumtxt\relax
  \input\jobname.mat\vfill\eject
  \endgroup
}

%--------------------------------------------------
% terminé
\catcode64=\active
