diff options
Diffstat (limited to 'Master/texmf-doc/doc/french/impatient-fr/fusermacs.tex')
-rw-r--r-- | Master/texmf-doc/doc/french/impatient-fr/fusermacs.tex | 1168 |
1 files changed, 1168 insertions, 0 deletions
diff --git a/Master/texmf-doc/doc/french/impatient-fr/fusermacs.tex b/Master/texmf-doc/doc/french/impatient-fr/fusermacs.tex new file mode 100644 index 00000000000..2fca205015a --- /dev/null +++ b/Master/texmf-doc/doc/french/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 + |