% Fichier INFO.MAC % % +------------------------------------------------------------------------+ % | | % | Macros pour le cours d'informatique | % | | % +------------------------------------------------------------------------+ % % M.Quercia le 18/01/97 \input psfig.sty % inclusion de dessins postscript, % doit être chargé avent carnot.mac pour cause de catcode de " \pssilent % psfig muet \input carnot.mac % ftp.ac-dijon.fr, rép. lcarnot1/info \doublecrochets % [[ et ]] donnent des intervalles entiers \guillemets % " = guillemets françaises \catcode64=11 % @ = lettre pour les macros privées \newlinechar=13 % ^M = nouvelle ligne \hfuzz=1pt % tolérer les petits dépassements \font\titrefont=cmbx10 at 24pt % pour les titres de chapitre %-------------------------------------------------------------- Mise en page \hsize = 16 cm % dimensions d'une page \vsize = 23 cm \hoffset = -0.04 cm \voffset = 0.81 cm \def\makeheadline{\vbox to 0pt{ % Haut de page général \vss \line{\ifodd\pageno\hfill\fi % cadrage à droite p. impaire \footlinefont % fonte indépendante du mode courant \the\headline % titre de page \hfil}% % cadrage à gauche p. paire \vskip1.5cm}} % hauteur du titre \def\normalheadline{% % titre général \ifodd\pageno\botmark % page impaire : dère section \else\chapmark % page paire : chapitre \fi } \def\chapmark{} \def\futureheadline#1{% % titre retardé d'une page \global\headline={% \hfil \global\headline={#1}% }} \headline={\normalheadline} \footline={% % numéro en bas de page \vrule height 2cm width 0pt % cale de hauteur \footlinefont\hfil-- \folio\ --\hfil } % \evitebasdepage{dimension} change de page s'il ne reste pas assez de place \def\evitebasdepage#1{\vskip#1\penalty-100\vskip-#1} % Je préfère une indentation explicite \newdimen\dimindent\dimindent=8mm \parindent=0pt\def\indent{\hskip\dimindent} %----------------------------------------------------- Numérotation automatique % \partie = partie % \ch = chapitre % \qq = question % \sq = sous-question % \ex = exercice \newcount\chnum \newcount\qqnum \newcount\sqnum \newcount\exnum \newif\ifreponse % Nouvelle partie \def\partie#1{{% \vfill\eject % change de page \tmatwrite{\tmatpartie{#1}}% % enregistre dans la table des matières \headline={\hfil}\footline={\hfil}%% pas de haut ni de bas de page \leftskip=0pt\rightskip=0pt % pas de marge \titrefont % écrire en gros \null\vfil \centerline{#1}% % titre centré \vfil\eject }} % Nouveau chapitre \chnum=0 \def\ch#1{% \global\advance\chnum 1 % numérotation automatique \global\qqnum=0 % init. numéro de question \global\exnum=0 % init. numéro d'exercice \global\reponsefalse % pas encore de réponse \edef\currentref{\number\chnum}% % pour les références \SV\evitebasdepage{30mm}% \global\def\chapmark{#1}% % marque de haut de page \tmatwrite{\tmatch{\currentref}{#1}}% enregistre dans la table des matières \leftskip=0pt\rightskip=0pt % réinitialise les marges {\Gros\bfsl\currentref\quad #1}% } % Nouvelle question \def\qq#1{% \global\advance\qqnum 1 % numérotation automatique \global\sqnum=96 % init. numéro de sous-question \global\exnum=0 % init. numéro d'exercice \edef\currentref{\number\chnum-\number\qqnum}% pour les références \SV\evitebasdepage{20mm}% \mark{#1}% % marque de haut de page \tmatwrite{\tmatqq{\currentref}{#1}}% enregistre dans la table des matières \leftskip=0pt\rightskip=0pt % réinitialise les marges {\gros\bfsl\currentref\quad #1}% } % Nouvelle sous-question \def\sq#1{% \global\advance\sqnum 1 \SV\evitebasdepage{15mm}% \edef\currentref{\number\chnum-\number\qqnum-\char\the\sqnum}% \leftskip=0pt\rightskip=0pt {\gros\bfsl\currentref\quad #1}% } % Nouvel exercice \def\ex{% \global\advance\exnum 1 % numérotation automatique \edef\currentref{% \ifnum\chnum>0 \number\chnum-\fi \ifnum\qqnum>0 \number\qqnum-\fi \number\exnum}% \sv\evitebasdepage{8mm}% {\bfsl Exercice \currentref~: }% \ssf\ignorespaces } % Nouveau problème \def\pb#1{% \SV\SV\evitebasdepage{5cm} \global\qqnum=0 % init. numéro de question \mark{#1}% % marque de haut de page \tmatwrite{\tmatpb{#1}}% % enregistre dans la table des matières \leftskip=0pt\rightskip=0pt % réinitialise les marges \centerline{\Gros\bfsl #1}\SV% % enregistre le titre dans le fichier .ans \ifx\reponse\undefined\else\answerwrite{\noexpand\pb{#1}}\fi \reponsetrue } % Nouvelle question de problème \def\pbqq#1{% \global\advance\qqnum 1 % numérotation automatique \global\sqnum=96 % init. numéro de sous-question \edef\currentref{\number\qqnum}% pour les références \sv\evitebasdepage{20mm}% \leftskip=0pt\rightskip=0pt % réinitialise les marges {\bfsl Question \currentref\ #1}\par% } % Nouvelle sous-question de problème \def\pbsq{% \global\advance\sqnum 1 \sv\evitebasdepage{15mm}% \edef\currentref{\number\qqnum-\char\the\sqnum}% \leftskip=7mm\rightskip=0pt {\hskip-\leftskip\bfsl\char\the\sqnum) }% } % Enregistre une réponse d'exercice \def\reponse{% \answerwrite{\noexpand\compreponse{\currentref}} \ifreponse\else % première réponse du chapitre \answerwrite{\noexpand\repch{\the\chnum}}% enregistre le numéro du chapitre \global\reponsetrue \fi \answerwrite } % Enregistre une réponse de problème \def\pbreponse{\answerwrite{\noexpand\comppbreponse{\currentref}}\answerwrite} % fin d'exercice (restaure la référence courante) \def\xe{\rm\edef\currentref{\number\chnum\ifnum\qqnum>0-\number\qqnum\fi}} %------------------------------------------------- Gestion du fichier réponses \newwrite\@answer \immediate\openout\@answer=\jobname.ans \def\answerwrite{% \bgroup \inactivespeciaux % désactive les caractères spéciaux \inactiveaccents % désactive les caractères accentués \catcode 13=12 % y compris ^M \catcode 123=1 % mais pas { \catcode 125=2 % ni } \obeyspaces % les espaces comptent \@answerwrite} % continue avec un argument sans codes spéciaux \def\@answerwrite#1{\immediate\write\@answer{#1}\egroup} % écrit ce qui suit \def\inactiveaccents{% \def\'##1{{\noexpand\'##1}}% \def\`##1{{\noexpand\`##1}}% \def\^##1{{\noexpand\^##1}}% \def\"##1{{\noexpand\"##1}}% \def\c##1{{\noexpand\c##1}}% } % Compose toutes les réponses \def\composereponses{% \relax \partie{Solutions des exercices}% \write\@tablemat{\noexpand\sv} \global\def\chapmark{Solution des exercices}% \immediate\closeout\@answer \let\reponse\undefined \input \jobname.ans } % Solutions des problèmes \def\composepbreponses{% \relax \partie{Solutions des problèmes}% \write\@tablemat{\noexpand\sv} \global\def\chapmark{Solution des problèmes}% } % Compose une réponse d'exercice \def\compreponse#1{% \edef\currentref{#1}% \sv\evitebasdepage{15mm}% \leftskip=0pt\rightskip=0pt {\bfsl Exercice \currentref}% \mark{Exercice #1}% \par } % Compose une réponse de problème \def\comppbreponse#1{% \sv\evitebasdepage{15mm}% \leftskip=0pt\rightskip=0pt {\bfsl Question #1}% \par } % Enregistre le numéro de chapitre d'une réponse \def\repch#1{% \tmatwrite{\tmatchrep{}{Chapitre #1}}% } %---------------------------------------------------------- Table des matières \newwrite\@tablemat \immediate\openout\@tablemat=\jobname.mat % tous ces \noexpand assurent que les macros arrivent telles quelles % dans le fichier .mat \def\tmatwrite#1{{% \def\tmatsection{\noexpand\noexpand\noexpand\tmatsection}% \def\tmatpartie{\noexpand\noexpand\noexpand\tmatpartie}% \def\tmatch{\noexpand\noexpand\noexpand\tmatch}% \def\tmatchrep{\noexpand\noexpand\noexpand\tmatchrep}% \def\tmatqq{\noexpand\noexpand\noexpand\tmatqq}% \def\tmatpb{\noexpand\noexpand\noexpand\tmatpb}% \edef\temp{#1}% \expandafter\write\expandafter\@tablemat\expandafter{\temp{\folio}}% }} \def\tmatline#1#2{\line{\hskip\leftskip\relax #1% \quad\dotfill\quad \hbox to 1.5em{\hfil#2}% \hskip\rightskip}} \def\tmatsection#1{\SV\tmatline{{\Gros\bf #1}}} \def\tmatpartie#1#2{\SV\line{\hskip\leftskip\Gros\bf #1\hfil}} \def\tmatch#1#2{\sv\tmatline{\hbox to 2em{\hfil#1\quad}#2}} \def\tmatchrep#1#2{\tmatline{\hbox to 2em{\hfil#1\quad}#2}} \def\tmatqq#1#2{\tmatline{\indent\hbox to 2.5em{#1\hfil}{\it#2}}} \def\tmatpb#1{\tmatline{\indent{\it#1}}} \def\composetablemat{% \vfill\eject \futureheadline{Table des matières}% \immediate\write\@tablemat{\noexpand\tmatsection{Table des matières}{\folio}}% \immediate\closeout\@tablemat \null\SV \centerline{\Gros\bf Table des matières} \SV \leftskip=2cm\rightskip=2cm \input\jobname.mat } %------------------------------------------------------------------ Références \newcount\fignum % compteur de figures % charge le fichier .aux s'il existe \newread\@testfile \immediate\openin\@testfile=\jobname.aux \ifeof\@testfile\else\input\jobname.aux\fi \immediate\closein\@testfile % Enregistre le nouveau \newwrite\@auxfile \immediate\openout\@auxfile=\jobname.aux % Enregistre une référence {\catcode36=\active \gdef\label#1{% {\catcode36=\active\let$=\expandafter $\ifx\csname .A #1\endcsname\relax % Le label apparaît pour la première fois dans le texte, % note la référence actuelle dans "\.A label" $\global$\let\csname .A #1\endcsname=\par% $\ifx\csname .B #1\endcsname\relax % Le label n'a pas été enregistré dans le fichier .aux, % affiche un message approprié \miseajour{#1}% $\xdef\csname .B #1\endcsname{\currentref}% \else % Le label a été enregistré, vérifie si la référence est la même $\let$\temp\csname .B #1\endcsname $\xdef\csname .B #1\endcsname{\currentref}% $\ifx\csname .B #1\endcsname\temp\else \miseajour{#1}% \fi \fi % enregistre la référence dans le nouveau fichier .aux \immediate\write\@auxfile{\noexpand\expandafter\def\noexpand\csname .B #1\endcsname{\currentref}}% \else \immediate\write16{Double definition de #1}% \fi }\ignorespaces }} % Enregistre un numéro de figure \def\labelfig#1{{% \global\advance\fignum 1 \edef\currentref{\number\fignum}% \label{#1}% }} % Relit une référence {\catcode36=\active \gdef\ref#1{% {\catcode36=\active\let$=\expandafter $\ifx\csname .B #1\endcsname\relax \miseajour{#1}% ???% \else \csname .B #1\endcsname \fi }}} \def\miseajour#1{% \immediate\write16{Reference non a jour (#1), il faut recompiler le fichier}% } %------------------------------------------------------------- Bibliographique % Enregistre l'existence d'une référence bibliographique % #1 = nom abrégé % #2 = nom réel % #3 = titre % #4 = éditeur \def\biblio#1#2#3#4{% \expandafter\let\csname .N #1\endcsname=\par } % charge le fichier .ref s'il existe \immediate\openin\@testfile=\jobname.ref \ifeof\@testfile\else\input\jobname.ref\fi \immediate\closein\@testfile {\catcode36=\active % Ressort une abréviation \gdef\biblio#1{% {\catcode36=\active\let$=\expandafter $\ifx\csname .R #1\endcsname\relax % Première référence à ce nom % Note qu'il faut l'imprimer dans la bibliographie $\global$\let\csname .R #1\endcsname=\par \fi $\ifx\csname .N #1\endcsname\relax % Le nom est inconnu % affiche un message approprié \immediate\write16{Bibliographie inconnue (#1)} \else % Le nom a été enregistré, sort l'abréviation {\smc[#1]}% \fi}} % Compose une bibliographie \gdef\compbiblio#1#2#3#4{% {\catcode36=\active\let$=\expandafter $\ifx\csname .R #1\endcsname\relax\else \hskip-15mm\hbox to 15mm{\smc[#1]\hfil}% {\smc #2\par} {\it #3\par} {\rm #4\sv} \fi }}} % Compose la table des références bibliographiques \def\composebiblio{{% \vfill\eject \tmatwrite{\tmatsection{Bibliographie}}% \futureheadline{Bibliographie}% \leftskip=\dimindent\rightskip=0pt \let\biblio=\compbiblio \null\SV \centerline{\Gros\bf Bibliographie}% \SV \input \jobname.ref }} %--------------------------------------------- Listing de code TeX en verbatim {\obeyspaces\global\let =\ } % espace actif -> espace normal \catcode96=\active \def`{% \begingroup \tt % fonte machine à écrire \inactivespeciaux % inactive les caractères spéciaux \obeycomments % commentaires en penché \obeyspaces % les espaces comptent \obeyaccents % conversion des caractères accentués \catcode96=\active \let`=\endgroup % le prochain ` referme le mode verbatim \def\par{\leavevmode\endgraf}\obeylines} {% modifications locale des catcodes \catcode 47=0 % / remplace \ \catcode 60=1 % < remplace { \catcode 62=2 % > remplace } \catcode123=\active % { \catcode125=12 % } \catcode 39=12 % ' \catcode 94=12 % ^ \catcode 34=12 % " \catcode 92=12 % \ /catcode 32=/active% % espace % /global/def/obeyaccents<% /catcode123=/active% /def{##1%} /def/suiteaccent##1##2##3<% /ifx##1'/def/next##2##3>/else% /ifx##1`/def/next##2##3>/else% /ifx##1^/def/next##2##3>/else% /ifx##1"/def/next##2##3>/else% /ifx##1c/ifx##2 /def/next##3>/else% /def/next/fi/else% /def/next/fi/fi/fi/fi/fi/next>% /def/metunaccent##1##2##3<% /ifx##2\% /ifx##3i/accent##1/i/else% /ifx##3j/accent##1/j/else% /accent##1\##2/fi/fi/else% /accent##1##2/fi% /mangeaccolade##3>% /def/mangeaccolade##1<% /ifx##1}/let/next/relax/else/let/next/mangeaccolade/fi/next>% >>% fin des modifications de catcode %} {\catcode40=\active \catcode42=\active \gdef\obeycomments{% \catcode40=\active \catcode42=\active \def(##1{\ifx*##1\let\next\commentaire\else\char40\let\next=##1\fi\next}%) \def*##1{\ifx)##1\let\next\fincommentaire\else\char42\let\next=##1\fi\next}% \def\commentaire{\bgroup\sltt\char40\char42}% \def\fincommentaire{\char42\char41\egroup}% }} %---------------------------------------------------------------------- divers % nème, ième, jème, kème \def\neme{$n^{\text{ème}}$ } \def\ieme{$i^{\,\text{ème}}$ } \def\jeme{$j^{\,\text{ème}}$ } \def\keme{$k^{\text{ème}}$ } % partie entière \def\f#1{\lfloor#1\rfloor} \def\c@#1{\lceil#1\rceil} % log binaire \def\lg{\log_2} % dénombrements \def\Ntransf{N_{\text{transf}}} \def\Ncomp{N_{\text{comp}}} \def\Ninv{N_{\text{inv}}} \def\Nrec{N_{\text{rec}}} \def\Nech{N_{\text{ech}}} \def\kmax{k_{\text{max}}} \def\vobj{{\tt v.objet.}} % petites fractions même en mode display \def\frac#1#2{\hbox{$#1\over#2$}} %----------------------------------------- Résultat important \def\theoreme#{\bgroup \setbox0=\vbox\bgroup \advance\hsize-\leftskip\leftskip=0pt\advance\hsize-10mm \bgroup\bf\aftergroup\suitetheoreme\let\temp= } \def\suitetheoreme#{\bgroup\aftergroup\fintheoreme\it\let\temp=} \def\fintheoreme{% \egroup\line{\hskip\leftskip\cadreombre\m=5mm{\box0}\hss}\egroup } %------------------------------------------------------------------ Tableau \def\table#1{{% \leavevmode \setbox0=\vtop{% \offinterlineskip \def\vr{\vrule}% \def\hr{\cr\noalign{\hrule}}% \tabskip=1em% \halign{\strut\hfil$##$\hfil&&\hfil$##$\hfil\cr#1}}% \cadreombre{\box0}}} %----------------------------------------- Placement de légendes sur un dessin \def\xyput(#1,#2)#3{% \setbox0=\hbox to 0pt{\kern#1pt\relax#3\hss}% \raise#2pt\box0} {\catcode34=12% \catcode32=12% \gdef\segment#1#2{{% \dimen1=#1% \dimen2=#2% \special{" gsave newpath 0 0 moveto \number\dimen1 \number\dimen2 2 {65536 div 72.27 div 72 mul exch} repeat lineto stroke grestore}% }}} %------------------------------------------------------------ Listes \newcount\listenum \def\liste#1{% \bgroup \advance\leftskip\dimindent \def\item{\par\advance\listenum 1\enmarge{\it#1\ }}% \listenum=0 } \def\finliste{\par\egroup} \def\lnum{\number\listenum.} \def\rnum{\romannumeral\listenum.} \def\anum{{\count0=\listenum\advance\count0 96\relax\char\the\count0.}} %------------------------------------------------------------ Dessins d'arbres % Les arbres sont décrits par une expression parenthésée qui est convertie % par le programme tree (Greg Lee, U. Hawaii Dept. of Linguistics, % lee@uhccux.uhcc.hawaii.edu) % en code TeX et Postscript. % % Deux petits détails : % 1) tree ne fonctionne que sous Unix % 2) Même sous Unix, il ne peut pas être lancé automatiquement par TeX, % il faut le faire à la main ! % % En conséquence, le code TeX-Postscript est généré et transmis à TeX % de la manière suivante : % % Lors de la passe n, TeX enregistre dans le fichier \jobname.tr0 tous les % arbres à dessiner en les numérotant (tree-xxx) % % L'utilisateur lance le programme [tree] sur ce fichier et produit le % fichier \jobname.tr1. typiquement : % bash$ tree -u cours.tr0 >cours.tr1 % % Au début de la passe n+1, TeX charge le fichier \jobname.tr1, il y trouve % les définitions TeX-Postscript et les enregistre comme des définitions % de macros. % Lors de la passe n+1, chaque appel à \tree déclenche la macro adéquate % si elle existe, sinon il y a un message d'erreur. % % Cette erreur peut être due : % 1) à l'adjonction d'un arbre entre les passes n et n+1 % 2) à la déterioration ou la perte du fichier \jobname.tr1 % 3) à un bug dans les macros suivantes. % % Dans les cas 1 et 2, il n'y a pas de problème, tout s'arrangera lors de % la passe n+2. Dans le cas 3, il n'y a pas grand chose à faire ... % % fichier contenant les nouvelles définitions \newwrite\@treefile \immediate\openout\@treefile=\jobname.tr0 % écriture dans le fichier \@treefile \def\treewrite{% \bgroup \inactivespeciaux % désactive les caractères spéciaux \inactiveaccents % désactive les caractères accentués \catcode 13=12 % y compris ^M \catcode 123=1 % mais pas { \catcode 125=2 % ni } \obeyspaces % les espaces comptent \@treewrite} % continue avec un argument sans codes spéciaux \def\@treewrite#1{\immediate\write\@treefile{#1}\egroup} % écrit ce qui suit \newcount\@treenum % numéro de dessin \@treenum=0 % \tree{expression} \def\tree#{% % numérotation automatique \global\advance\@treenum 1 % teste si la macro ayant le numéro \@treenum existe \expandafter\ifx\csname tree-\the\@treenum\endcsname\relax % Elle n'existe pas \immediate\write16{arbre numero \the\@treenum\space introuvable. % Regenerez le fichier \jobname.tr1}% % Elle existe, l'appelle \else\csname tree-\the\@treenum\endcsname \fi % Préparation de l'avenir : enregistre la nouvelle définition \treewrite{\noexpand\@treedef{tree-\the\@treenum}\noexpand\tree}% \treewrite } % Relecture du fichier \jobname.tr1 % petit pb. tree a inséré une ligne blanche entre la macro \@treedef % et le code TeX-Postscript qu'il a produit % Cette ligne blanche et tout ce qui pourrait s'interposer davant l'accolade % suivante est placé dans #2. #1 contient le nom de la macro à définir \long\def\@treedef#1#2#{% \expandafter\long\expandafter\gdef\csname #1\endcsname} \immediate\openin\@testfile=\jobname.tr1 \ifeof\@testfile\else\input\jobname.tr1\fi \immediate\closein\@testfile %------------------------------------------------------------ Règles de césure \hyphenation{ com-pa-rai-son com-pa-rai-sons sui-vant sui-vants } %--------------------------------------------------------------------- Terminé \catcode64=\active