summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/plain/impatient-fr/fusermacs.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/plain/impatient-fr/fusermacs.tex')
-rw-r--r--Master/texmf-dist/doc/plain/impatient-fr/fusermacs.tex1168
1 files changed, 1168 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/plain/impatient-fr/fusermacs.tex b/Master/texmf-dist/doc/plain/impatient-fr/fusermacs.tex
new file mode 100644
index 00000000000..2fca205015a
--- /dev/null
+++ b/Master/texmf-dist/doc/plain/impatient-fr/fusermacs.tex
@@ -0,0 +1,1168 @@
+% This is part of the book TeX for the Impatient.
+% Copyright (C) 2003 Paul W. Abrahams, Kathryn A. Hargreaves, Karl Berry.
+% Copyright (C) 2004 Marc Chaudemanche pour la traduction française.
+% See file fdl.tex for copying conditions.
+
+\input fmacros
+\chapter{Un abr\'eg\'e de \linebreak macros utiles}
+
+\chapterdef{eplain}
+
+Cette section d\'ecrit |eplain.tex|, une collection de macros et autres
+d\'efi\-nitions qui prolongent le plain \TeX. \bix^^|eplain.tex| Les
+noms des diverses macros expliquent leurs buts, mais habituellement
+n'expliquent pas comment elles fonctionnent, ou ne fournissent pas de
+d\'etails explicites sur la fa\c con dont les employer. Cette information
+est contenue dans les fichiers source de |eplain.tex| et dans la
+documentation qui l'accompagne. Voir \headcit{Ressources}{ressources}
+pour la fa\c con d'obtenir |eplain.tex|.
+
+\section{Pr\'eliminaires}
+
+Nous commen\c cons par quelques macros pour des codes de cat\'egorie qui
+changent et des d\'efinitions pratiques pour deux macros utilis\'ees
+fr\'equem\-ment.
+^^{codes de cat\'egorie//d\'efinitions pratiques pour}
+
+\pix^^|\makeactive|
+\pix^^|\letter|
+\pix^^|\other|
+\pix^^|\uncatcodespecials|
+
+\csdisplay
+\def\makeactive#1{\catcode`#1 = \active \ignorespaces}%
+\chardef\letter = 11 \chardef\other = 12
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1 = \other}%
+ \dospecials}% Defined in plain.
+|
+
+Pour d\'efinir `|^^M|' comme caract\`ere actif, vous devez englober la
+d\'efini\-tion dans un groupe et appeler quelques moyens
+suppl\'ementaires.
+\ttidxref{^^M}
+La macro \pix^|\letreturn| vous permet de d\'efinir `|^^M|' sans ce code
+suppl\'emen\-taire que vous pouvez voir dans la d\'efinition ci-dessous.
+
+\csdisplay
+{\makeactive\^^M \long\gdef\letreturn#1{\let^^M = #1}}%
+|
+
+Ces macros consomment un, deux, ou trois arguments.
+
+\pix^^|\gobble|
+\pix^^|\gobbletwo|
+\pix^^|\gobblethree|
+\csdisplay
+\def\gobble#1{}\def\gobbletwo#1#2{}%
+\def\gobblethree#1#2#3{}%
+|
+
+Maintenant nous \'etablissons quelques conventions pour lire le reste du
+fichier. Dans le fichier nous autorisons des s\'equences de contr\^ole
+``priv\'es'' qui contiennent `|@|' dans leurs noms. Ces s\'equences de
+contr\^ole ne sont pas accessibles de l'ext\'erieur de ce fichier (\`a moins
+que vous rechangez le code de cat\'egorie du `|@|').
+\xrdef{eplainconv}
+
+\csdisplay
+\catcode`@ = \letter % Allow control sequences with @.
+\let\@plainwlog = \wlog % Don't log register allocations.
+\let\wlog = \gobble
+\newlinechar = `^^J
+|
+
+Les deux macros suivantes fournissent une formulation pratique de
+r\'esultat de diagnostic. \pix^|\loggingall| d\'eclenche tout le
+tra\c cage, mais ne provoque le r\'esultat de la trace que dans le \logfile
+et pas sur votre terminal. \pix^|\tracingboxes| montre compl\`etement
+les bo\^\i tes quand elles sont trac\'ees. (\TeX\ ne montre normalement que
+trois niveaux de bo\^\i te et cinq items dans chaque bo\^\i te.)
+
+
+\csdisplay
+\def\loggingall{\tracingcommands\tw@\tracingstats\tw@
+ \tracingpages\@ne\tracingoutput\@ne
+ \tracinglostchars\@ne\tracingmacros\tw@
+ \tracingparagraphs\@ne\tracingrestores\@ne
+ \showboxbreadth\maxdimen\showboxdepth\maxdimen}%
+\def\tracingboxes{\showboxbreadth = \maxdimen
+ \showboxdepth = \maxdimen}%
+|
+
+
+L'\'epaisseur par d\'efaut des traits est de $0.4$\pt. Vous pouvez produire des traits de n'importe quelle \'epaisseur par
+d\'efaut que vous voulez en red\'efinissant |\vruledefaultwidth|, |\hruledefaultheight| et |\hruledefaultdepth| et
+en employant
+\pix^^|\ehrule|
+|\eh!-rule| et
+\pix^|\evrule| au lieu de |\hrule| et |\vrule|. (le `e' repr\'esente
+``eplain''.)
+^^{filets//\'epaisseur de}
+Si vous donnez une dimension explicite (par exemple, |\ehrule height 16pt|), \TeX \ l'utilisera.
+
+\csdisplay
+\newdimen\hruledefaultheight \hruledefaultheight = 0.4pt
+\newdimen\hruledefaultdepth \hruledefaultdepth = 0.0pt
+\newdimen\vruledefaultwidth \vruledefaultwidth = 0.4pt
+\def\ehrule{\hrule height\hruledefaultheight
+ depth\hruledefaultdepth}%
+\def\evrule{\vrule width\vruledefaultwidth}%
+|
+
+La convention |\%| pour \'ecrire un caract\`ere `|%|' ne marche pas quand vous
+voulez inclure ce caract\`ere dans la token liste de |\write|.
+^^|\write//\'ecrire \b\tt\%\e\ avec|
+^^|%//en sortie|
+Vous pouvez utiliser ^|\percentchar| pour r\'ealiser cela.
+Nous red\'efinissons \'egalement ^|^^L| comme \'etant sans effet pour que vous puissiez l'utiliser
+dans une d\'efinition de macro ou un argument.
+
+\csdisplay
+{\catcode`\% = \other \gdef\percentchar{%}}%
+ \def^^L{\par
+}%
+|
+
+\pix^|\tokstostring| convertit son argument en liste de
+^{tokens de caract\`ere}. Il n'emploie que des d\'eveloppements qui sont manipul\'ees
+dans l'\oe sophage de \TeX. Cette propri\'et\'e est lui n\'ecessaire
+pour travailler avec |\edef|. Elle est utilis\'ee par les macros
+de r\'ef\'erences crois\'ees (\xref{xrefs}).
+
+Pour fractionner l'argument sur l'espace, nous devons
+utiliser deux macros subsidiaires. |\@ttsA| trouve les espaces et
+|\@ttsB| manipule une s\'equence de token sans aucun espace. Chaque
+espace est remplac\'e par le d\'eveloppement de \pix^|\spacesub|.
+
+\csdisplay
+\def\tokstostring#1{\@ttsA#1 \ttsmarkA}%
+\def\@ttsA#1 #2\ttsmarkA{\ifempty{#1}\else
+ \@ttsB #1\@ttsmarkB
+ \ifempty{#2}\else
+ \spacesub\@ttsA#2\ttsmarkA\fi\fi}%
+\def\@ttsB#1{\ifx #1\@ttsmarkB\else
+ \string #1%
+ \expandafter\@ttsB\fi}%
+\def\@ttsmarkB{\@ttsmarkB}% should never be expanded
+\def\spacesub{+}%
+|
+
+\noindent
+\pix^|\ifempty| teste si son argument est vide.
+
+\csdisplay
+\def\ifempty#1{\@ifempty #1\@emptymarkA\@emptymarkB}%
+\def\@ifempty#1#2\@emptymarkB{\ifx #1\@emptymarkA}%
+\def\@emptymarkA{\@emptymarkA}%
+|
+
+La macro ^|\for| impl\'emente une version \TeX\ du ``^{for loop}'' des
+langages de programmation traditionnels. Ces macros viennent directement de
+\LaTeX.
+
+\csdisplay
+\def\for#1:=#2\do#3{\edef\@fortmp{#2}%
+ \ifx\@fortmp\empty \else
+ \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}\fi}%
+\def\@nnil{\@nil}%
+\def\@fornoop#1\@@#2#3{}%
+\def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil
+ \else #5\def#4{#2} ifx #4\@nnil \else
+ #5\@iforloop #3\@@#4{#5}\fi\fi}%
+\def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
+ \let\@nextwhile=\@fornoop \else #4\relax
+ \let\@nextwhile=\@iforloop\fi
+ \@nextwhile#2\@@#3{#4}}%
+|
+
+\pix^|\obeywhitespace| est utile pour reproduire des coupures de
+ligne, des interlignes et des espaces dans votre source. Il combine
+les effets de |\obey!-lines| et |\obey!-spaces|, ^^|\obeyspaces|
+^^|\obeylines| et met \'egalement des espaces au d\'ebut d'une ligne
+devant \^etre imprim\'ee. Les caract\`eres ``tabulation'' ne sont pas affect\'es~; ils
+produisent toujours un ressort normal.
+
+\xrdef{ewhitesp}
+^^{caract\`eres espace}
+^^|\fontdimen|
+^^|\font|
+^^|\letreturn|
+
+\csdisplay
+\def\alwaysspace{\hglue\fontdimen2\the\font \relax}%
+{\makeactive\^^M \makeactive\ %
+\gdef\obeywhitespace{%
+\makeactive\^^M\def^^M{\par\indent}%
+\aftergroup\@removebox% Kill extra paragraph at end.
+\makeactive\ \let =\alwaysspace}}%
+\def\@removebox{\setbox0=\lastbox}
+|
+
+\pix^|\frac| est une bonne fa\c con d'afficher des fractions dans du
+texte quand vous ne voulez pas utiliser |\over| et que mettre simplement ``1/2''
+ne semble pas beau. Cette macro est la r\'eponse \`a
+l'exercise~11.6 de \texbook.^^{fractions//en forme de slash}
+
+\csdisplay
+\def\frac#1/#2{\leavevmode
+ \kern.1em \raise .5ex \hbox{\the\scriptfont0 #1}%
+ \kern-.1em $/$%
+ \kern-.15em \lower .25ex \hbox{\the\scriptfont0 #2}}%
+|
+
+Les macros suivantes produisent des logos qui sont utiles dans le monde \TeX.
+Le logo \AMSTeX\ vient de la \knuth{page~420}{483}. Le logo \LaTeX\
+est l\'eg\`erement modifi\'e par rapport \`a celui de |latex.tex| (nous utilisons une
+police diff\'erente pour le `A')~; de m\^eme, le logo \BibTeX\
+emploit |\sevenrm| au lieu d'une v\'eritable police de capitale-et-
+petite-capitale. Le fichier source |.mf| pour le logo \MF\ est
+donn\'e dans le manuel \MF\~:
+
+\smallskip
+{\narrower\noindent
+^{Knuth, Donald E.},{\sl The {\logosl METAFONT}book}.
+ Reading, Mass.: Addison-Wesley, 1986.\par}
+\smallskip
+\pix^^|\LaTeX|
+\pix^^|\AMSTeX|
+\pix^^|\BibTeX|
+\pix^^|\MF|
+
+\csdisplay
+\def\LaTeX{L\kern-.26em \raise.6ex\hbox{\fiverm A}%
+ \kern-.15em TeX}%
+\def\AMSTeX{$\cal A\kern-.1667em \lower.5ex\hbox{$\cal M$}%
+ \kern-.125em S$-\TeX}%
+\def\BibTeX{{\rm B\kern-.05em {\sevenrm I\kern-.025em B}%
+ \kern-.08em T\kern-.1667em \lower.7ex\hbox{E}%
+ \kern-.125emX}}%
+\font\mflogo = logo10
+\def\MF{{\mflogo META}{\tenrm \-}{\mflogo FONT}}%
+|
+
+Les deux macros suivantes produisent des bo\^\i tes. \pix^|\blackbox|
+produit une ``bulle carr\'ee'', utilis\'e dans les macros de liste
+(\xref{listmacs}). \pix^|\makeblankbox| (de \knuth{page~311}{363--364})
+produit un rectangle non rempli, avec l'\'epaisseur des traits de
+bordure donn\'ee par les arguments.
+
+\csdisplay
+\def\blackbox{\vrule height .8ex width .6ex depth -.2ex}%
+\def\makeblankbox#1#2{%
+ \hbox{\lower\dp0\vbox{\hidehrule{#1}{#2}%
+ \kern -#1% overlap rules
+ \hbox to \wd0{\hidevrule{#1}{#2}%
+ \raise\ht0\vbox to #1{}% vrule height
+ \lower\dp0\vtop to #1{}% vrule depth
+ \hfil\hidevrule{#2}{#1}}%
+ \kern-#1\hidehrule{#2}{#1}}}}%
+\def\hidehrule#1#2{\kern-#1\hrule height#1 depth#2
+ \kern-#2}%
+\def\hidevrule#1#2{\kern-#1{\dimen0 = #1
+ \advance\dimen0 by #2 \vrule width\dimen0}\kern-#2}%
+|
+
+\pix^|\numbername| produit la forme en toute lettres d'un nombre. Si
+le nombre est plus grands que dix, la macro ne reproduit que les
+chiffres de son argument.
+
+\csdisplay
+\def\numbername#1{\ifcase#1%
+ zero\or one\or two\or three\or four\or five%
+ \or six\or seven\or eight\or nine\or ten\or #1\fi}%
+|
+
+\pix^|\testfileexistence| d\'etermine si un fichier |\jobname.#1| est
+non\-vide et place |\if!-fileexists| convenablement.
+^^{fichiers//tester l'existence de}
+Le nom de fichier dans l'argument
+n'a pas besoin de finir dans un token d'espace puisque la macro
+fournit la marque d'espace.
+
+\csdisplay
+\newif\iffileexists
+\def\testfileexistence#1{\begingroup
+ \immediate\openin0 = \jobname.#1\space
+ \ifeof 0\global\fileexistsfalse
+ \else \global\fileexiststrue\fi
+ \immediate\closein0
+ \endgroup}%
+|
+
+
+\section Affichages
+
+Par d\'efaut, \TeX\ centre le mat\'eriel affich\'e (le mat\'eriel
+entre |$$|). ^^{affichages, formatage} \pix^|\leftdisplays| provoque
+des affichages justifi\'es \`a gauche par d\'efaut. Vous pouvez
+retourner aux affichages centr\'es avec \pix^|\centereddisplays|.
+
+Les macros ici sont plus g\'en\'eralistes qu'elles doivent l'\^etre pour ne faire
+que des affichages justifi\'es \`a gauche. Pour chaque affichage,
+\pix^|\ifeqno| sera vrai si un |\eqno| appara\^\i t dans l'affichage.
+\pix^|\ifleqno| sera vrai si un |\leqno| appara\^\i t. Si l'une ou l'autre
+sorte d'\'equation num\'erot\'ee appara\^\i t, \pix^|\eqn| produit le texte
+du num\'ero de l'\'equation. \pix^|\eq| produit toujours le texte de
+l'\'equation lui-m\^eme.
+
+Ces macros sont bas\'ees sur le code de la \knuth{page~376}{434}.
+
+\csdisplay
+\newif\ifeqno \newif\ifleqno
+\newtoks\@eqtoks \newtoks\@eqnotoks
+\def\eq{\the\@eqtoks}\def\eqn{\the\@eqnotoks}%
+\def\displaysetup#1$${%
+ \@displaytest#1\eqno\eqno\@displaytest}%
+\def\@displaytest#1\eqno#2\eqno#3\@displaytest{%
+ \if !#3!% No \eqno, check for \leqno:
+ \@ldisplaytest#1\leqno\leqno\@ldisplaytest
+ \else
+ \eqnotrue \leqnofalse % Have \eqno, not \leqno.
+ \@eqnotoks = {#2}\@eqtoks = {#1}%
+ \fi
+ \generaldisplay$$}%
+\def\@ldisplaytest#1\leqno#2\leqno#3\@ldisplaytest{%
+ \@eqtoks = {#1}%
+ \if !#3!%
+ \eqnofalse % No \leqno; we're done.
+ \else
+ \eqnotrue \leqnotrue % Have \leqno.
+ \@eqnotoks = {#2}%
+ \fi}%
+|
+
+Vous pouvez composer des affichages diff\'eremment en d\'efinissant votre
+propre macro analogue \`a \pix^|\leftdisplays|. La d\'efinition de macro doit
+placer l'appel \`a |\display!-setup| dans |\every!-display| ^^|\everydisplay|
+afin de s'assurer que ^^|\displaysetup| |\dis!-play!-setup| soit appel\'e au
+d\'ebut de chaque affichage. La d\'efinition de macro doit \'egalement inclure
+une d\'efinition de ^|\generaldisplay|.
+
+\csdisplay
+\newtoks\previouseverydisplay
+\def\leftdisplays{%
+ \previouseverydisplay = \everydisplay
+ \everydisplay =
+ {\the\previouseverydisplay \displaysetup}%
+ \def\generaldisplay{%
+ \leftline{%
+ \strut \indent \hskip\leftskip
+ \dimen0 = \parindent
+ \advance\dimen0 by \leftskip
+ \advance\displaywidth by -\dimen0
+ \@redefinealignmentdisplays
+ \ifeqno \ifleqno
+ \kern-\dimen0
+ \rlap{$\displaystyle\eqn$}%
+ \kern\dimen0
+ \fi\fi
+ $\displaystyle{\eq}$%
+ \ifeqno \ifleqno\else
+ \hfill $\displaystyle{\eqn}$%
+ \fi\fi}}}%
+\def\centereddisplays{\let\displaysetup = \relax}%
+|
+
+%\filbreak
+\pix^|\leftdisplays| doit travailler dans la douleur pour s'assurer que
+|\dis!-play!-lines|, ^|\eqalignno| ^^|\displaylines| et ^|\leqalignno|
+fonctionnent toujours correctement. |\eq| est compos\'e en mode math\'ematique
+et |\halign| est ill\'egal dans ce mode. ^^|\halign//ill\'egal dans le mode
+math\'ematique| Nous utilisons ^|\vcenter| pour changer le contexte pour que
+|\halign| redevienne l\'egal. Nous enlevons \'egalement les commandes |\hfil| \`a
+gauche du patron pour obtenir la justification \`a droite. \`a part ces
+changements, les macros sont les m\^emes que dans |plain.tex|.
+
+\csdisplay
+\def\@redefinealignmentdisplays{%
+ \def\displaylines##1{\displ@y
+ \vcenter{\halign{\hbox to\displaywidth{$\@lign
+ \displaystyle####\hfil$}\crcr##1\crcr}}}%
+ \def\eqalignno##1{\displ@y
+ \vcenter{\halign to\displaywidth{%
+ $\@lign\displaystyle{####}$\tabskip\z@skip
+ &$\@lign\displaystyle{{}####}$
+ \hfil\tabskip\centering
+ &\llap{$\@lign####$}\tabskip\z@skip\crcr
+ ##1\crcr}}}%
+ \def\leqalignno##1{\displ@y
+ \vcenter{\halign to\displaywidth{%
+ $\@lign\displaystyle{####}$\tabskip\z@skip
+ &$\@lign\displaystyle{{}####}
+ $\hfil\tabskip\centering
+ &\kern-\displaywidth
+ \rlap{\kern-\parindent\kern-\leftskip$
+ \@lign####$}%
+ \tabskip\displaywidth\crcr
+ ##1\crcr}}}}%
+|
+
+
+\section heure du jour
+
+Quand \TeX\ d\'emarre, il d\'etermine les valeurs des param\`etres ^|\time|,
+^|\day|, ^|\month| et ^|\year|.
+^^{heure du jour}^^{date}
+\pix^|\monthname|
+produit le nom du mois, abr\'eg\'e en trois lettres.
+\pix^|\timestring| produit l'heure courante, comme dans ``1:14\thinspace
+p.m.''. \pix^|\timestamp| produit le texte de la date compl\`ete, comme dans
+``23 avr 1964\quad 1:14\thinspace p.m.''.
+
+\csdisplay
+\def\monthname{%
+ \ifcase\month
+ \or Jan\or Feb\or Mar\or Apr\or May\or Jun%
+ \or Jul\or Aug\or Sep\or Oct\or Nov\or Dec%
+ \fi}%
+\def\timestring{\begingroup
+ \count0 = \time \divide\count0 by 60
+ \count2 = \count0 % The hour.
+ \count4 = \time \multiply\count0 by 60
+ \advance\count4 by -\count0 % The minute.
+ \ifnum\count4<10 \toks1 = {0}% Get a leading zero.
+ \else \toks1 = {}%
+ \fi
+ \ifnum\count2<12 \toks0 = {a.m.}%
+ \else \toks0 = {p.m.}%
+ \advance\count2 by -12
+ \fi
+ \ifnum\count2=0 \count2 = 12 \fi % Make midnight `12'.
+ \number\count2:\the\toks1 \number\count4
+ \thinspace \the\toks0
+\endgroup}%
+\def\timestamp{\number\day\space\monthname\space
+ \number\year\quad\timestring}%
+|
+
+
+\section Listes
+
+\null
+\xrdef{listmacs}
+\bix^^{listes d'\'el\'ements}
+\bix^^{\enumerations}
+\pix^|\numberedlist| produit des listes num\'erot\'ees~; |\endnumberedlist| les
+termine.
+\pix^|\unorderedlist| est analogue.
+Pour l'une ou l'autre de ces derni\`eres, les items \`a l'int\'erieur des listes
+commencent par \pix^|\li| (``list item''). Vous pouvez mettre
+\pix^|\listcompact| au d\'ebut d'une liste si vous ne voulez aucun espace
+additionnel entre les \'el\'ements de cette liste. Des listes peuvent \^etre
+imbriqu\'ees arbitrairement.
+
+Vous pouvez contr\^oler plus g\'en\'eralement l'espacement entre les
+\'el\'e\-ments en assignant des valeurs aux registres \'enum\'er\'es
+ci-dessous. Si les \'el\'ements de vos listes tendent \`a \^etre
+longs, vous pourriez vouloir rendre |\interitemskip| diff\'erent de
+z\'ero. L'indentation gauche de chaque \'el\'ement de liste est
+donn\'ee par |\par!-indent| plus |\list!-left!-indent|~; l'indentation
+droite de chaque \'el\'ement de liste est donn\'ee par |\list!-right!|% indent|.
+
+\csdisplay
+\newskip\abovelistskip \abovelistskip = .5\baselineskip
+\newskip\interitemskip \interitemskip = 0pt
+\newskip\belowlistskip \belowlistskip = .5\baselineskip
+\newdimen\listleftindent \listleftindent = \parindent
+\newdimen\listrightindent \listrightindent = 0pt
+\def\listcompact{\interitemskip = 0pt \relax}%
+|
+
+Les listes num\'erot\'ees et non num\'erot\'ees utilisent les macros qui suivent.
+Nous ne changeons pas |\parindent|, puisque beaucoup de macros existantes,
+comme par exemple, |\footnote|, en d\'ependent. Nous devons expliquer la
+possibilit\'e que les \'el\'ements fassent plus d'un paragraphe de long. Dans ce
+cas-ci, tous les paragraphes apr\`es le premier sont indent\'es. Nous
+utilisons |\leftskip| et |\rightskip| pour indenter les \'el\'ements d'une liste.
+L'indentation des affichages est expliqu\'ee par des changements de |\every!-%
+dis!-play|. ^^|\everydisplay|
+
+\csdisplay
+\newdimen\@listindent
+\def\beginlist{%
+ \@listindent = \parindent
+ \advance\@listindent by \listleftindent
+ \everydisplay = \expandafter{\the\everydisplay
+ % Don't lose user's \everydisplay:
+ \advance\displayindent by \@listindent
+ \advance\displaywidth by -\@listindent
+ \advance\displaywidth by -\listrightindent}%
+ \nobreak\vskip\abovelistskip
+ \parskip = 0pt
+ % \leftskip shifts nested lists to the right on the page.
+ \advance\leftskip by \@listindent
+ \advance\rightskip by \listrightindent}%
+\def\printitem{\par\noindent
+ \llap{\hskip-\listleftindent \marker \enspace}}%
+\def\endlist{\vskip\belowlistskip}%
+|
+
+\noindent
+Vous pouvez changer la mani\`ere dont les labels d'\'el\'ements sont compos\'ees en
+red\'efinissant la macro |\numbered!-marker|. \pix^^|\numberedmarker|
+
+\csdisplay
+\newcount\numberedlistdepth \newcount\itemnumber
+\newcount\itemletter
+\def\numberedmarker{%
+ \ifcase\numberedlistdepth
+ (impossible)%
+ \or \itemnumberout)%
+ \or \itemletterout)%
+ \else *%
+ \fi}%
+|
+
+\noindent Voici les d\'efinitions de |\numberedlist| et de
+|\unorderedlist|.
+ces d\'efini\-tions ont la m\^eme structure.
+
+\csdisplay
+\def\numberedlist{\environment{@numbered-list}%
+ \advance\numberedlistdepth by 1
+ \itemnumber = 1 \itemletter = `a
+ \beginlist \let\marker = \numberedmarker
+ \def\li{%
+ \ifnum\itemnumber=1\else \vskip\interitemskip \fi
+ \printitem
+ \advance\itemnumber by 1 \advance\itemletter by 1
+ }}%
+\def\itemnumberout{\number\itemnumber}%
+\def\itemletterout{\char\itemletter}%
+\def\endnumberedlist{\par
+ \endenvironment{@numbered-list}\endlist}%
+!bigskip
+\newcount\unorderedlistdepth
+\def\unorderedmarker{%
+ \ifcase\unorderedlistdepth
+ (impossible)%
+ \or \blackbox
+ \or ---%
+ \else *%
+ \fi}%
+\def\unorderedlist{\environment{@unordered-list}%
+ \advance\unorderedlistdepth by 1
+ \beginlist \itemnumber = 1
+ \let\marker = \unorderedmarker
+ \def\li{%
+ \ifnum\itemnumber=1\else \vskip\interitemskip \fi
+ \printitem \advance\itemnumber by 1
+ }}%
+\def\endunorderedlist{\par
+ \endenvironment{@unordered-list}\endlist}%
+|
+
+\eix^^{listes d'\'el\'ements}
+\eix^^{\enumerations}
+
+
+\section Listing verbatim
+
+La macro \pix^|\listing| produit le listing verbatim d'un fichier sp\'ecifi\'e
+en police |\tt|.
+Elle est bas\'ee sur le code de la \knuth{page~380}{439}.
+Les tabulations produisent un montant d'espace fixe et les sauts de page
+produisent une coupure de page. D'autres caract\`eres de contr\^ole produisent
+ce qui s'av\`ere \^etre \`a cette position dans la police, qui n'est g\'en\'eralement
+pas tr\`es utile. En red\'efinissant |\setup!-listing!-hook|,
+\pix^^|\setuplistinghook| vous pouvez prendre les mesures compl\'ementaires
+qui sont appropri\'ees pour vos polices et\slash ou environnements particuliers
+avant que le fichier ne soit lu.
+
+\csdisplay
+\def\listing#1{%
+ \par \begingroup \@setuplisting \setuplistinghook
+ \input #1 \endgroup}%
+\let\setuplistinghook = \empty
+\def\@setuplisting{%
+ \uncatcodespecials
+ \obeywhitespace \makeactive\` \makeactive\^^I
+ \def^^L{\vfill\eject}\tt}%
+{\makeactive\` \gdef`{\relax\lq}}% Defeat ligatures.
+{\makeactive\^^I\gdef^^I{\hskip8\fontdimen2\tt \relax}}%
+|
+
+
+\section Table des mati\`eres
+
+\null ^^{table des mati\`eres}
+La macro \pix^|\writetocentry| \'ecrit une macro dans le fichier
+|\jobname.toc|. Le premier argument de |\writetocentry|, par exemple,
+``chapitre'', est utilis\'e pour composer le nom de la macro appel\'ee. Le
+deuxi\`eme argument est le texte qui doit appara\^\i tre dans la table des
+mati\`eres. |\writetocentry| appose le num\'ero de la page \`a l'appel de la macro.
+Par exemple~:
+\csdisplay
+\writetocentry{chapter}{Introduction}
+|
+\noindent
+produira la ligne~:
+\csdisplay
+\tocchapterentry{Introduction}{2}
+|
+\noindent dans le fichier |.toc|, ce qui indique que `Introduction' d\'ebute
+en page 2.
+
+Vous pouvez utiliser |\writenumberedtocentry| pour apporter un troisi\`eme
+param\`etre, tel qu'un num\'ero de chapitre. Par exemple~:
+\csdisplay
+\writenumberedtocentry{chapter}{The second chapter}{2}
+|
+\noindent \'ecrira une ligne~:
+\csdisplay
+\tocchapterentry{The second chapter}{2}{14}
+|
+\noindent
+Vous pouvez aussi faire un |\write| vers le |\tocfile| vous-m\^eme.
+
+\csdisplay
+\newwrite\tocfile \newif\iftocfileopened
+\def\opentocfile{\iftocfileopened\else
+ \tocfileopenedtrue
+ \immediate\openout\tocfile = \jobname.toc
+\fi}%
+\def\writenumberedtocentry#1#2#3{\ifrewritetocfile
+ \opentocfile
+ \write\tocfile{%
+ \expandafter\noexpand \csname toc#1entry\endcsname
+ {#2}{#3}{\folio}}%
+\ignorespaces\fi}%
+\def\writenumberedtocentry#1#2#3{\ifrewritetocfile
+ \opentocfile
+ \write\tocfile{%
+ \expandafter\noexpand \csname toc#1entry\endcsname
+ {#2}{#3}{\folio}}%
+\ignorespaces\fi}%
+|
+
+Pour produire une table des mati\`eres, lisez le fichier |.toc| avec
+\pix^|\readtocfile|. Vous devez appeler |\read!-tocfile| avant le premier
+|\write!-toc!-entry|. Quand vous traitez la table des mati\`eres sans la
+r\'eg\'en\'erer, vous ne devriez pas r\'ecrire le fichier |.toc|---si vous le
+faites, son contenu sera perdu. La commande |\rewrite!-tocfile!-false|
+emp\^echera la r\'e\'ecriture.
+
+\csdisplay
+\newif\ifrewritetocfile \rewritetocfiletrue
+\def\readtocfile{\testfileexistence{toc}%
+ \iffileexists
+ \input \jobname.toc
+ \ifrewritetocfile \opentocfile \fi
+ \fi}%
+|
+
+Voici quelques d\'efinitions de macros |\toc|\dots|entry| possibles. Ces
+d\'efinitions ne sont indiqu\'ees que comme exemple---aligner des traits \`a
+travers la ligne n'est normalement pas la meilleure mani\`ere de composer une
+table des mati\`eres.
+
+\csdisplay
+\def\tocchapterentry#1#2{\line{\bf #1 \dotfill\ #2}}%
+\def\tocsectionentry#1#2{%
+ \line{\quad\sl #1 \dotfill\ \rm #2}}%
+\def\tocsubsectionentry#1#2{%
+ \line{\qquad\rm #1 \dotfill\ #2}}%
+|
+
+
+\section R\'ef\'erences crois\'ees
+
+\null ^^{r\'ef\'erences crois\'ees}
+\xrdef{xrefs}
+Les macros qui suivent fournissent des r\'ef\'erences crois\'ees symboliques, pour
+que vous puissiez vous r\'ef\'erer \`a quelque chose dans une autre partie d'un
+document par son nom et non son num\'ero de page r\'eel. \pix^|\xrdef||{foo}|
+d\'efinit une \'etiquette |foo| comme \'etant le num\'ero de page courant et
+\pix^|\xrefn||{foo}| produit ce num\'ero de page, par exemple, $77$. Plus
+fr\'equement, vous voudrez dire quelque chose comme ``voir p.\thinspace77'',
+ainsi \pix^|\xref||{foo}| produit ` p.\thinspace 77''. Si |foo| n'est pas
+d\'efini, un message d'avertissement sera donn\'e. |\xrefwarningfalse| supprime
+l'avertissement.
+
+Ces macros n'assurent aucune protection contre des d\'efinitions dupliqu\'ees.
+Vous pouvez v\'erifier ces d\'efinitions dupliqu\'ees en triant le fichier de
+r\'ef\'erences crois\'ees et en v\'erifiant, m\'ecaniquement ou \emph{de visu}, les
+d\'efinitions adjacentes du m\^eme symbole.
+
+\csdisplay
+\newif\ifxrefwarning \xrefwarningtrue
+\def\xrdef#1{\begingroup
+ \xrlabel{#1}%
+ \edef\@wr{\@writexrdef{\the\@xrlabeltoks}}%
+ \@wr
+ \endgroup \ignorespaces}%
+\def\@writexrdef#1{\write\reffile{%
+ \string\gdef
+ \expandafter\string\csname#1\endcsname
+ {\noexpand\folio}\percentchar}}%
+\def\xrefnumber#1{%
+ \xrlabel{#1}%
+ % \@xrlabeltoks now has the control sequence name.
+ \toks0 =
+ \expandafter{\csname\the\@xrlabeltoks\endcsname}%
+ \expandafter \ifx\the\toks0\relax
+ \ifxrefwarning \message{Undefined label
+ `\tokstostring{#1}'.}\fi
+ {\let\spacesub = \space
+ \expandafter\xdef\the\toks0
+ {`{\tt \tokstostring{#1}}'}}\fi
+ \the\toks0}%
+\def\xref#1{p.\thinspace\xrefnumber{#1}}%
+\def\xrefn#1{\xrefnumber{#1}}%
+|
+
+Cette macro transforme une \'etiquette en liste de tokens de caract\`ere dans le
+registre de tokens |\labeltoks|. Une \'etiquette peut inclure des blancs et
+des s\'equences de contr\^ole aussi bien que les caract\`eres normaux, mais elle
+ne peut pas inclure d'accolades.
+
+\csdisplay
+\newtoks\@xrlabeltoks
+\def\xrlabel#1{\begingroup
+ \escapechar = `\_ \edef\tts{\tokstostring{#1_}}%
+ \global\@xrlabeltoks = \expandafter{\tts}%
+ \endgroup}%
+|
+
+Il faut deux passages pour obtenir des r\'ef\'erences crois\'ees correctes,
+puisque les d\'efinitions sont \'ecrites dans le fichier auxiliaire
+|\jobname.aux|. \pix^|\readreffile| les relit. Si vous ne saisissez pas
+cette commande avant la premi\`ere d\'efinition, vous perdrez toutes les
+d\'efinitions de l'ex\'ecution pr\'ec\'edente.
+
+\csdisplay
+\newwrite\reffile \newif\ifreffileopened
+\def\openreffile{\ifreffileopened\else
+ \reffileopenedtrue
+ \immediate\openout\reffile = \jobname.aux
+ \fi}%
+\def\readreffile{%
+ \testfileexistence{aux}%
+ \iffileexists
+ \begingroup
+ \@setletters
+ \input \jobname.aux
+ \endgroup
+ \else
+ \message{No cross-reference file; I won't give you
+ warnings about undefined labels.}%
+ \xrefwarningfalse
+ \fi
+ \openreffile}%
+\def\@setletters{%
+ \catcode`_ = \letter \catcode`+ = \letter
+ \catcode`- = \letter \catcode`@ = \letter
+ \catcode`0 = \letter \catcode`1 = \letter
+ \catcode`2 = \letter \catcode`3 = \letter
+ \catcode`4 = \letter \catcode`5 = \letter
+ \catcode`6 = \letter \catcode`7 = \letter
+ \catcode`8 = \letter \catcode`9 = \letter
+ \catcode`( = \letter \catcode`) = \letter}%
+|
+
+^^{\equations, labelisation}
+Vous pouvez donnez des noms symboliques aux \'equations de la m\^eme mani\`ere,
+en utilisant \pix^|\eqdef| et \pix^|\eqref|. |\eqdef| ins\`ere sa propre
+commande |\eqno|, donc il doit \^etre appel\'e \`a un endroit o\`u |\eqno| est
+l\'egal.
+
+\csdisplay
+\newcount\eqnumber
+\def\eqdef#1{\global\advance\eqnumber by 1
+ \expandafter\xdef
+ \csname#1eqref\endcsname{\the\eqnumber}%
+ \immediate\write\reffile{\string\def
+ \expandafter\string\csname#1eqref\endcsname
+ {\the\eqnumber}}%
+ \eqno
+ \eqprint{\the\eqnumber}}%
+|
+
+|\eqref| produit le ``(num\'ero de l'\'equation)''. Vous pouvez obtenir un
+formatage plus fantaisiste en red\'efinissant \pix^|\eqprint|. Par exemple,
+vous pourriez la red\'efinir pour que les num\'eros d'\'equation incluent le
+num\'ero du chapitre.
+
+\csdisplay
+\def\eqref#1{%
+ \expandafter \ifx \csname#1eqref\endcsname \relax
+ \ifxrefwarning \message{Undefined equation label
+ `#1'.}\fi
+ \expandafter\def\csname#1eqref\endcsname{00}%
+ \else \eqprint{\csname#1eqref\endcsname}%
+ \fi}%
+\def\eqprint#1{(#1)}%
+|
+
+
+\section Environnements
+
+\null ^^{environnements} Ces macros vous permettent de d\'efinir vos propres
+groupes appel\'es environnements pour des parties de votre manuscrit. Comme
+les groupes de \TeX, ces groupes peuvent \^etre embo\^\i t\'es, et en fait leur
+embo\^\i tement peut \^etre entrelac\'e avec l'embo\^\i tement des groupes de \TeX. Si
+les noms au d\'ebut et \`a la fin d'un environnement ne s'assortissent pas,
+vous recevrez un message d'erreur. Les macros sont con\c cues pour que le
+message que vous recevez quand une telle erreur se produit vous donne une
+bonne chance de localiser la cause de l'erreur facilement.
+
+Vous d\'ebutez un environnement avec
+\pix^^|\environment|
+|\envi!-ron!-ment| |{foo}| et le finissez avec |\endenvironment{foo}|, o\`u
+|foo| est le nom de l'environnement. Nos macros am\'eliorent l\'eg\`erement la
+r\'eponse \`a l'exercice~5.7 du \texbook, en faisant quelques contr\^oles sur les
+paires |\begingroup| et |\endgroup|, et s'assurant aussi que les paires
+|\environment| et |\endenvironment| s'assortissent.
+
+\csdisplay
+\def\environment#1{\ifx\@groupname\undefined\else
+ \errhelp = \@unnamedendgrouphelp
+ \errmessage{`\@groupname' was not closed by
+ \string\endenvironment}\fi
+ \def\@groupname{#1}%
+ \begingroup
+ \let\@groupname = \undefined \ignorespaces}%
+\def\endenvironment#1{\endgroup
+ \def\@thearg{#1}%
+ \ifx\@groupname\@thearg
+ \else
+ \ifx\@groupname\undefined
+ \errhelp = \@isolatedendenvironmenthelp
+ \errmessage{Isolated
+ \string\endenvironment\space for `#1'}%
+ \else
+ \errhelp = \@mismatchedenvironmenthelp
+ \errmessage{Environment `#1' ended,
+ but `\@groupname' started}%
+ \endgroup % Probably a typo in the names.
+ \fi
+ \fi
+ \let\@groupname = \undefined \ignorespaces}%
+|
+
+Nous d\'efinissons \'egalement des messages d'aide pour chacune des erreurs
+ci-dessus. ^^|\newhelp|
+
+\csdisplay
+\newhelp\@unnamedendgrouphelp{%
+ Most likely, you just forgot an^^J%
+ \string\endenvironment.
+ Maybe you should try inserting another^^J%
+ \string\endgroup to recover.}%
+\newhelp\@isolatedendenvironmenthelp{%
+ You ended an environment X, but^^J%
+ no \string\environment\space to start it
+ is anywhere in sight.^^J%
+ You might also be at an
+ \string\endenvironment\space that would match^^J%
+ a \string\begingroup, i.e., you forgot an
+ \string\endgroup.}%
+\newhelp\@mismatchedenvironmenthelp{%
+ You started an environment X, but^^J%
+ you ended it with Y. Maybe you made a typo
+ in one or the other^^J%
+ of the names.}%
+|
+
+Certains environnements ne doivent pas se produire dans d'autres
+environnements. Appelons ces derniers ``environnements externes''
+(outer). |\check!-env| v\'erifie qu'aucun environnement externe n'est
+actuellement effectif, sinon il se plaint. Pour utiliser |\check!-env|,
+vous devez mettre la commande |\environment!-true| au d\'ebut de chaque
+environnement externe.
+
+\csdisplay
+\newif\ifenvironment
+\def\checkenv{%
+ \ifenvironment
+ \errhelp = \@interwovenenvhelp
+ \errmessage{Interwoven environments}%
+ \endgroup
+ \fi}%
+\newhelp\@interwovenenvhelp{%
+ Perhaps you forgot to end the previous^^J%
+ environment? I'm finishing off the current group,^^J%
+ hoping that will fix it.}%
+|
+
+
+\section Justification
+
+\bix^^{cadr\'e \`a gauche}
+\bix^^{cadr\'e \`a droite}
+\bix^^{texte centr\'e}
+Les trois macros \pix^|\flushleft|, \pix^|\flushright| et
+\xrdef{eplaincenter}
+\pix^|\center| justifient le texte des
+lignes suivantes de la mani\`ere indiqu\'ee. La commande doit
+appara\^\i tre seule sur une ligne. La commande et le texte
+doivent \^etre enferm\'es dans un groupe---%
+la fin du groupe
+indique la fin du texte. Le groupe entier est plac\'e comme un paragraphe
+simple, avec des lignes compl\'et\'ees d'un c\^ot\'e ou de l'autre comme
+indiqu\'e. Les lignes blanches sont reproduites.
+
+\csdisplay
+\begingroup
+ \catcode `\^^M = \active
+ \globaldefs = 1 %
+ \def\flushleft{\beforejustify %
+ \aftergroup\@endflushleft %
+ \def^^M{\null\hfil\break}%
+ \def\@eateol^^M{}\@eateol}%
+ \def\flushright{\beforejustify %
+ \aftergroup\@endflushright %
+ \def^^M{\break\null\hfil}%
+ \def\@eateol^^M{\hfil\null}\@eateol}%
+ \def\center {\beforejustify %
+ \aftergroup\@endcenter %
+ \def^^M{\hfil\break\null\hfil}%
+ \def\@eateol^^M{\hfil\null}\@eateol}%
+\endgroup
+|
+
+Les commandes suivantes sont appel\'ees en raison du |\after!-group|
+^^|\aftergroup|
+dans les d\'efinitions de |\flush!-left|, |\flush!- right| et |\center|.
+Elles effectuent les op\'erations de nettoyage n\'ecessaires .
+
+
+\csdisplay
+\def\@endflushleft{\unpenalty
+ {\parfillskip = 0pt plus 1 fil\par}%
+ \ignorespaces}%
+\def\@endflushright{%
+ % Remove the \hfil\null\break we just put on.
+ \unskip \setbox0=\lastbox \unpenalty
+ % We have fil glue at the left of the line;
+ % \parfillskip shouldn't affect that.
+ {\parfillskip = 0pt \par}\ignorespaces}%
+\def\@endcenter{%
+ % Remove the \hfil\null\break we just put on.
+ \unskip \setbox0=\lastbox \unpenalty
+ % We have fil glue at the left of the line;
+ % \parfillskip must balance it.
+ {\parfillskip = 0pt plus 1fil \par}\ignorespaces}%
+\def\beforejustify{%
+ \par\noindent
+ \catcode`\^^M = \active
+ \checkenv \environmenttrue}%
+|
+
+\eix^^{cadr\'e \`a gauche}
+\eix^^{cadr\'e \`a droite}
+\eix^^{texte centr\'e}
+
+
+\section Tables
+
+La macro \pix^|\makecolumns| vous permet de donner toutes les entr\'ees d'une
+table sans vous inqui\'eter de l'endroit o\`u les colonnes se coupent. Par
+exemple, si vous saisissez une longue liste alphab\'etique qui sera compos\'ee
+en plusieurs colonnes, vous ne saurez habituellement pas \`a l'avance o\`u une
+colonne finit et o\`u la suivante commence. Par ailleurs, si un autre \'el\'ement
+est ajout\'e, les coupures de colonne changeront.
+
+|\makecolumns| prend deux arguments (d\'elimit\'es)~: le nombre total de
+rang\'ees et le nombre de colonnes de la table. Par exemple, `|\makecolumns
+37/3:|' d\'esigne une table de trois colonnes dont les rang\'ees sont les $37$
+prochaines lignes. Vous pouvez ajuster le positionnement de la table sur la
+page en changeant |\parindent|, qui d\'etermine l'espace \`a gauche et
+|\hsize|, qui d\'etermine l'espace entre la marge gauche de la page et la
+droite du bloc. Vous pouvez permettre une coupure de page au-dessus du
+|\valign|
+^^|\valign//utilis\'e dans {\tt\\makecolumns}|
+en changeant \pix^|\abovecolumnspenalty|..
+
+\csdisplay
+\newcount\abovecolumnspenalty
+\abovecolumnspenalty = 10000
+\newcount\@linestogo % Lines remaining to process.
+\newcount\@linestogoincolumn % Lines remaining in column.
+\newcount\@columndepth % Number of lines in a column.
+\newdimen\@columnwidth % Width of each column.
+\newtoks\crtok \crtok = {\cr}%
+\def\makecolumns#1/#2: {\par \begingroup
+ \@columndepth = #1 \advance\@columndepth by #2
+ \advance\@columndepth by -1
+ \divide \@columndepth by #2
+ \@linestogoincolumn = \@columndepth \@linestogo = #1
+ \def\@endcolumnactions{%
+ \ifnum \@linestogo<2
+ \the\crtok \egroup \endgroup \par
+ % End \valign and \makecolumns.
+ \else
+ \global\advance\@linestogo by -1
+ \ifnum\@linestogoincolumn<2
+ \global\@linestogoincolumn = \@columndepth
+ \the\crtok
+ \else &\global\advance\@linestogoincolumn by -1
+ \fi
+ \fi}%
+ \makeactive\^^M\letreturn\@endcolumnactions
+ \@columnwidth = \hsize
+ \advance\@columnwidth by -\parindent
+ \divide\@columnwidth by #2
+ \penalty\abovecolumnspenalty
+ \noindent % It's not a paragraph (usually).
+ \valign\bgroup
+ &\hbox to \@columnwidth{\strut ##\hfil}\cr
+}% The next end-of-line starts everything going.
+|
+
+
+\section Notes de pied de page
+
+\null ^^{notes de pied de page}
+Des notes de bas de page sont compos\'ees le plus g\'en\'eralement en utilisant un
+num\'ero incr\'ement\'e comme marque de r\'ef\'erence. Nous d\'efinissons la macro
+\pix^|\numberedfootnote| pour faire cela. Il red\'efinit \'egalement
+^|\vfootnote| pour permettre un formatage l\'eg\`erement plus g\'en\'erique des
+notes de bas de page que ne le fait \plainTeX. Le registre de dimension
+|\foot!-note!-mark!-sepa!-ra!-tion|
+\pix^^|\footnotemarkseparation| contr\^ole
+l'espace entre la marque de la note de bas de page (par exemple, le num\'ero) et le
+d\'ebut du texte. Les tokens \pix^|\everyfootnote| sont
+ins\'er\'es avant de produire la notes de bas de page.
+
+Les d\'efinitions \plainTeX \ de |\footnote| et |\vfootnote| sont pr\'eserv\'es en
+|\@plain!-footnote| et |\@plain!-vfootnote| au cas o\`u vous auriez besoin d'elles.
+\csdisplay
+\newcount\footnotenumber \newtoks\everyfootnote
+\newdimen\footnotemarkseparation
+\footnotemarkseparation = .5em
+\let\@plainfootnote = \footnote
+\let\@plainvfootnote = \vfootnote
+\def\vfootnote#1{\insert\footins\bgroup
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox \splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM
+ \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip
+ \xspaceskip\z@skip
+ \everypar = {}%
+ \the\everyfootnote
+ \indent\llap{#1\kern\footnotemarkseparation}\footstrut
+ \futurelet\next\fo@t}%
+\def\numberedfootnote{\global\advance\footnotenumber by 1
+ \@plainfootnote{$^{\number\footnotenumber}$}}%
+|
+
+
+\section Double colonne
+
+\null ^^{double colonnes} La commande |\doublecolumns| commence la
+composition en double colonne, alors que la commande
+\pix^^|\singlecolumn| |\single!-column| remet la composition en
+colonne simple. Vous pouvez commuter dans les deux sens entre elles
+sur la m\^eme page. Le ressort sp\'ecifi\'e par |\above!-double!-column!-%
+skip| et |\below!-double!-column!-skip| est ins\'er\'ee avant et apr\`es la
+composition en double colonne.
+
+L'approche est d\'eriv\'ee de la \knuth{page~417}{480}.
+
+\csdisplay
+\newskip\abovedoublecolumnskip
+\newskip\belowdoublecolumnskip
+\abovedoublecolumnskip = \bigskipamount
+\belowdoublecolumnskip = \bigskipamount
+\newdimen\gutter \gutter = 2pc
+\newdimen\doublecolumnhsize \doublecolumnhsize = \hsize
+\newbox\@partialpage \newdimen\singlecolumnhsize
+\newdimen\singlecolumnvsize \newtoks\previousoutput
+\def\doublecolumns{\par % Don't start in horizontal mode.
+ \previousoutput = \expandafter{\the\output}
+ \advance\doublecolumnhsize by -\gutter
+ \divide\doublecolumnhsize by 2
+ \output = {\global\setbox\@partialpage =
+ \vbox{\unvbox255\vskip\abovedoublecolumnskip}}%
+ \pagegoal = \pagetotal \break % Expands \output above.
+ \output = {\doublecolumnoutput}%
+ \singlecolumnhsize = \hsize
+ \singlecolumnvsize = \vsize
+ \hsize = \doublecolumnhsize \vsize = 2\vsize}%
+|
+
+Le macro |\@double!-column!-split| fait le d\'edoublement r\'eel. On
+suppose que le source est ins\'er\'ee en colonne simple. Si vous ne
+voulez pas que cela soit le cas, vous devrez modifier la routine de
+r\'esultat. Apr\`es que |\@double!-column!-split| ait effectu\'e son
+travail, |\box255| aura le mat\'eriel en double colonne. Le mat\'eriel en
+double colonne sera pr\'ec\'ed\'e par n'importe quel mat\'eriel en colonne simple
+qui aura \'et\'e compos\'e avant que |\doublecolumns| ait \'et\'e appel\'e.
+|\box4| aura le mat\'eriel qui ne s'est pas adapt\'e \`a la page.
+
+\csdisplay
+\def\@doublecolumnsplit{%
+ \splittopskip = \topskip \splitmaxdepth = \maxdepth
+ \dimen0 = \singlecolumnvsize
+ \advance\dimen0 by -\ht\@partialpage
+ \advance\dimen0 by -\ht\footins
+ \advance\dimen0 by -\skip\footins
+ \advance\dimen0 by -\ht\topins
+ \begingroup
+ \vbadness = 10000
+ \global\setbox1=\vsplit255 to \dimen0 \wd1=\hsize
+ \global\setbox3=\vsplit255 to \dimen0 \wd3=\hsize
+ \endgroup
+ \global\setbox4=\vbox{\unvbox255
+ \penalty\outputpenalty}%
+ \global\setbox255=\vbox{\unvbox\@partialpage
+ \hbox to \singlecolumnhsize{\box1\hfil\box3}%
+ \vfill}}%
+|
+\needspace{.5in}
+|\double!-column!-out!-put| est la routine de sortie r\'eelle. Nous appelons
+l'ancienne |\output| pour faire le travail de sortie de la bo\^\i te.
+
+\csdisplay
+\def\doublecolumnoutput{\@doublecolumnsplit
+ \hsize = \singlecolumnhsize \vsize = \singlecolumnvsize
+ \previousoutput \unvbox4}%
+|
+
+|\singlecolumn| reprend la composition en une colonne. Il suppose que
+|\doublecolumns| a \'et\'e appel\'e.
+
+\csdisplay
+\def\singlecolumn{\par % Don't start in horizontal mode.
+ \output = {\global\setbox1 =
+ \vbox{\unvbox255\vskip\abovedoublecolumnskip}}%
+ \pagegoal = \pagetotal \break \setbox255 = \box1
+ {\singlecolumnvsize = \ht255
+ \divide\singlecolumnvsize by 2
+ \advance\singlecolumnvsize by +\ht\@partialpage
+ \advance\singlecolumnvsize by +\ht\footins
+ \advance\singlecolumnvsize by +\skip\footins
+ \advance\singlecolumnvsize by +\ht\topins
+ \@doublecolumnsplit}%
+ \hsize = \singlecolumnhsize
+ \vsize = \singlecolumnvsize
+ \output = \expandafter{\the\previousoutput}%
+ \unvbox255}%
+|
+
+\margin{`Sensible paragraph skips' section deleted}
+
+
+\section Terminer
+
+Nous devons maintenant d\'efaire les changements que nous avons faits
+quand nous avons commenc\'e (voir la \xref{eplainconv}). Nous donnons
+\'egalement un num\'ero de version, qui sera plus tard
+disponible dans |\fmt!-name| et |\fmt!-version|.
+
+\csdisplay
+\let\wlog = \@plainwlog \catcode`@ = \other
+\def\fmtname{eplain}%
+{\edef\plainversion{\fmtversion}%
+ \xdef\fmtversion{1.0: 15 May 1990
+ (and plain \plainversion)}%
+}%
+|
+
+\eix^^|eplain.tex|
+
+\endchapter
+\byebye
+