summaryrefslogtreecommitdiff
path: root/info/impatient/fr/fmacros.tex
diff options
context:
space:
mode:
Diffstat (limited to 'info/impatient/fr/fmacros.tex')
-rw-r--r--info/impatient/fr/fmacros.tex4688
1 files changed, 2344 insertions, 2344 deletions
diff --git a/info/impatient/fr/fmacros.tex b/info/impatient/fr/fmacros.tex
index 04740d0e3d..4bc83b5ea1 100644
--- a/info/impatient/fr/fmacros.tex
+++ b/info/impatient/fr/fmacros.tex
@@ -1,2345 +1,2345 @@
-% 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.
-%
-% Macros for typesetting TeX for the Impatient.
-%
-% These macros are being distributed without any warranty whatsoever.
-% The level of commentary is that which we, the authors, found necessary
-% for our own purposes.
-%
-% ==========================================================================
-%
-% The macros use the term `chapter' for what in the book is called
-% a `section', `section' for the book's `subsection', etc. For purposes of
-% defining macros it's convenient to think of the book as divided into
-% chapters, but because of the nonsequential nature of the book we don't
-% want to tell the readers that they are reading chapters.
-%\language2
-% An embedded file should end with \byebye.
-%
-%%%%%%%%%%%%%%% COULEUR %%%%%%%%%%%%%%%%%%%%%%
-\input ifpdf.sty
-\ifpdf
-\def\Red{\pdfliteral{0 1 1 0 k}}
-\def\Blue{\pdfliteral{1 1 0 0 k}}
-\def\Green{\pdfliteral{1 0 1 0 k}}
-\def\RawSienna{\pdfliteral{0 0.72 1 0.45 k}}
-\def\Black{\pdfliteral{0 0 0 1 k}}
-\else
-\def\Red{\special{color rgb 1. 0 0}}
-\def\Blue{\special{color rgb 0 0 1.}}
-\def\Green{\special{color rgb 0 1. 0}}
-\def\RawSienna{\special{color rgb 0.63 0.32 0.18}}
-\def\Black{\special{color rgb 0 0 0}}
-\fi
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\begingroup
-\ifx \macsin\relax
- % In frontm.tex, we do \input macros several times, and we still want
- % the \byebye at the end to end the job.
- % So we \input inside a group in frontm, and make the assignment to
- % \endinput local.
- \aftergroup\let\aftergroup\byebye\aftergroup\endinput
- \aftergroup\endinput % Don't read this file again.
-\else
- \global\let\byebye = \end
- \global\let\macsin = \relax
-\fi
-\endgroup
-
-% This must come before config.tex.
-\input eplain
-
-% Define configuration switches and then read their values.
-%
-\newif\ifcenterpage \centerpagetrue
-\newif\ifcompletebook
-\newif\iffinal % true for the 2000dpi copy
-\newif\ifmsdos
-\newif\ifedgetabs \edgetabstrue
-\newif\ifdvi \dvitrue % true if we want a .dvi file
-
-%\xrefwarningfalse
-
-% The config file contains settings for flags, e.g.,
-% \completebookfalse
-% It can be empty as long as it exists.
-\input config
-\ifcompletebook \else\rewritetocfilefalse \fi
-\edef\tempfile{\ifmsdos g:temp \else x \fi}
-\ifx\setmodes\undefined\else\setmodes\fi % modify from command line input
-
-% Certain defaults are forced by certain others.
-%
-\iffinal \centerpagetrue \edgetabstrue\fi
-
-% Initial definitions. (These should come before \input fonts.)
-%
-\catcode`\@ = \letter % For the macro file only.
-
-% We don't want register allocation information in the log,
-% so we redefine the relevant macro from plain.tex.
-
-\def\alloc@#1#2#3#4#5{\global\advance\count1#1 by 1
- \ch@ck#1#4#2%
- \allocationnumber=\count1#1 \global#3#5=\allocationnumber
-}
-
-% The fonts. This should come before defining the new character control
-% sequences that follow.
-%
-\input fonts
-
-\hyphenation{script-script base-line-skip no-base-line-skip line-skip
- line-skip-limit max-dead-cycles output-penalty no-inter-line-skip
- show-box-depth show-box-breadth if-hmode if-vmode if-mmode
- back-spaces back-space par-indent tracing-on-line}
-
-{
- \catcode`\| = 0
- \catcode`\\ = \other
- |global|let|bsc = \ % \bsc is a true backslash character.
-}
-
-\let\\ = \bsc
-
-\def\bslash{$\backslash$} % backslash suitable for printing
-\let\shriek = !
-\let\vbar = |
-{
- \catcode `\[ = 1 \catcode `\] = 2
- \catcode `\{ = \other \catcode `\} = \other
- \global\let\lbracechar = {
- \global\let\rbracechar = }
-]
-\def\blbrace{{\bt \{}}
-\def\brbrace{{\bt \}}}
-
-{
- \catcode`\ =\other% Notice no spaces at beginning of next line.
-\gdef\otherspace{ }
-}
-
-\let\mathlbrace = \{ \let\mathrbrace = \}
-{
- \catcode `\[ = 1 \catcode `\] = 2
- \catcode `\{ = \other \catcode `\} = \other
- \gdef\{[\ifmmode\mathlbrace\else [\bt {]\fi]
- \gdef\}[\ifmmode\mathrbrace\else [\bt }]\fi]
-]
-
-
-% These are for debugging (less drastically than \tracingall or \loggingall).
-%
-\def\tron{\tracingmacros=2 \tracingcommands=2 \tracingonline=1}
-\def\troff{\tracingmacros=0 \tracingcommands=0}
-
-% \pagebreak should always cause a break, even if the resulting
-% page is empty.
-%
-\def\pagebreak{\null\vfill\eject}
-
-% \linebreak causes a line break in chapter headings, but outside of that
-% context we don't want it to do anything.
-%
-\let\linebreak = \relax
-
-
-% Parameters.
-%
-\parskip = 0pt plus 0.3pt
-\newdimen\codefuzz \codefuzz = 10pt % for \csdisplay, \example
-\hbadness = 4000
-\vbadness = 8000
-\hfuzz = 0.1pt % as in plain TeX
-\vfuzz = 0.1pt % as in plain TeX
-\exhyphenpenalty = 0 % we don't mind these
-\widowpenalty = 10000 % these are very bad
-\clubpenalty = 10000 % these are very bad too
-
-% Page margins.
-%
-% Note that the \newdimens can't be within an \if or a \def
-% because \newdimen is an \outer macro (thanks to DEK).
-%
-\newdimen\insidemargin \newdimen\outsidemargin
-\newdimen\topmargin \newdimen\bottommargin
-\newdimen\headmargin
-\newdimen\totalwidth \newdimen\totalheight
-\newdimen\oddoffset \newdimen\evenoffset
-\newif\ifnoheadline
-
-% \totalwidth and \totalheight are the actual trim size of the book.
-% \insidemargin, \outsidemargin, \topmargin, and \bottommargin are margins
-% with respect to the pages of the book, not the draft 8 1/2 x 11 pages.
-%
-
-% This makes it so that we only have to cut twice on a page.
-% 8.5" = 51.19125pc exactly.
-% \totalwidth should = \outsidemargin + \insidemargin + \hsize.
-%
-%\totalwidth = 7.375in % 44.4159375pc = 7 3/8".
-\totalwidth = 18.7325cm % 44.4159375pc = 7 3/8".
-\outsidemargin = 8pc
-\insidemargin = 10pc
-\hsize = \totalwidth
-\advance \hsize by -\outsidemargin
-\advance \hsize by -\insidemargin
-% \hsize should now be 26.4159375pc
-
-% Now that we know \hsize, we can set \parfillskip to eliminate (most)
-% widows.
-%
-\parfillskip = .75\hsize plus .06\hsize minus .75\hsize
-
-
-% \oddoffset and \evenoffset are the \hoffset values needed to
-% align the left edge of the virtual page with the left edge of the
-% draft paper (not the left edge of the book pages).
-%
-% The -1in below comes from the default margin, which the DVI driver must
-% set at 1in. Odd pages are on the left, even on the right.
-%
-% First, align the left edge of the virtual page with the left edge of the
-% draft page.
-%
-\oddoffset = -1in
-\advance\oddoffset by \insidemargin
-%
-\evenoffset = -1in
-\advance\evenoffset by \outsidemargin
-
-% For centered pages, move the virtual page right by half the trim width.
-%
-\ifcenterpage
-% \dimen0 = 8.5in
- \dimen0 = 21cm
- \advance\dimen0 by -\totalwidth
- \divide\dimen0 by 2
- \advance\oddoffset by \dimen0
- \advance\evenoffset by \dimen0
-
-% For uncentered even-numbered pages, align the right edge of the virtual
-% page with the right edge of the draft paper so that we can remove the trim
-% of two-sided pages with a single cut.
-%
-\else
-% \advance\evenoffset by 8.5in
- \advance\evenoffset by 21cm
- \advance\evenoffset by -\totalwidth
-\fi
-
-\hoffset = \oddoffset % First page is numbered one.
-
-% Now for the vertical, which is simpler, since it doesn't vary from
-% page to page.
-% 11" = 66.2475pc exactly.
-% \totalheight should = \topmargin + \bottommargin + \vsize.
-%
-%\totalheight = 9.25in % 9 1/4" = 55.708125pc
-\totalheight = 24.39cm % 9 1/4" = 55.708125pc
-\topmargin = 6pc % Distance from top of page to baseline of text line 1
-\bottommargin = 6pc % Distance from last line to bottom of page.
-\topskip = 2pc % Distance from top of \box255 to baseline of text line 1
-% \vsize Distance from top of \box255 to last line of text.
-% \headmargin Distance from top of \box255 to top of page
-% We'll place the headline just above \box255
-
-\headmargin = \topmargin \advance \headmargin by -\topskip
-
-\vsize = \totalheight
-\advance \vsize by -\headmargin
-\advance \vsize by -\bottommargin
-% \vsize should now be 46.708125pc
-
-\voffset = -1in % align top of logical page with top of physical page
-\advance \voffset by \headmargin
-\ifcenterpage
-% \dimen0 = 11in
- \dimen0 = 29cm
- \advance\dimen0 by -\totalheight
- \divide\dimen0 by 2
- \advance\voffset by \dimen0
-\fi
-
-\topskip = 2pc % Distance from headline to first line of text.
-
-
-% Other formatting parameters.
-%
-% The basic increments we'll use in the layout.
-%
-\def\setskip#1 = #2 {%
- \dimen0 = #2\baselineskip
- \csname #1skipamount\endcsname =
- \dimen0 plus .33\dimen0 minus .25\dimen0
- \ignorespaces
-}
-\newskip\greaterskipamount
-\newskip\greatskipamount
-\newskip\biggerskipamount
-\newskip\medbigskipamount
-\newskip\medsmallskipamount
-\newskip\tinyskipamount
-
-\setskip greater = 2.5
-\setskip great = 2.0
-\setskip bigger = 1.5
-\setskip big = 1.0
-\setskip medbig = .75
-\setskip med = .5
-\setskip medsmall = .375
-\setskip small = .25
-\setskip tiny = .125
-
-\parindent = 1em
-\newdimen\normalindent \normalindent = \parindent
-
-\footnotemarkseparation = .16666em
-
-\abovelistskip = \smallskipamount
-\interitemskip = \tinyskipamount
-\belowlistskip = \smallskipamount
-\listleftindent = \parindent
-
-% Displays involve text and math. We don't want as much flexibility in
-% the glue as plain.tex sets.
-%
-\abovedisplayskip = \medsmallskipamount
-\abovedisplayshortskip = 0pt plus 2pt
-\belowdisplayskip = \medsmallskipamount
-\belowdisplayshortskip = \belowdisplayskip
-
-\newskip\intercapsuleskip \intercapsuleskip = .75\tinyskipamount plus 0.4pt
-\newdimen\capsulehangindent \capsulehangindent = 2pc
-
-\newskip\aboveconceptskip \aboveconceptskip = \bigskipamount
-
-
-\newskip\abovesectionskip \abovesectionskip = \greaterskipamount
-% No stretch or shrink below heads, according to A-W.
-\newskip\belowsectionskip \belowsectionskip = 1\biggerskipamount
-
-\newskip\abovesubsectionskip \abovesubsectionskip = \greatskipamount
-\newskip\belowsubsectionskip \belowsubsectionskip = 1\bigskipamount
-
-\newskip\abovedescriptionskip \abovedescriptionskip = \biggerskipamount
-\newskip\belowdescriptionskip \belowdescriptionskip = \medskipamount
-
-\newskip\explainskip \explainskip = \tinyskipamount
-\newskip\exampleskip \exampleskip = \smallskipamount
-
-\def\interexampleskip{\vskip\medsmallskipamount}
-\def\tinyskip{\vskip\tinyskipamount}
-
-% Space in which a symbol is shown in a columnated list of commands.
-\newdimen\symbolspace \symbolspace = 14pt
-
-% \colsindent is the indentation before material arranged in columns and
-% displayed, as in the list of Greek letters.
-\newskip\colsindent \colsindent = \parindent
-
-% The indentation for page lists in the index that don't fit on one line.
-\newdimen\indexpageindent \indexpageindent = 1pc
-
-% The indentation for subsidiary entries in the index. (Should be less
-% than \indexpageindent.)
-\newdimen\indexlevelindent \indexlevelindent = .5pc
-
-\newskip\codebaselineskip \codebaselineskip = \baselineskip
-
-% Fill the previous page with blank space before a command.
-%
-\def\cmdbreak{\par\nobreak\vfil\penalty 1000\vfilneg\par}
-
-% Penalties.
-%
-\newcount\conceptpenalty \conceptpenalty = -1500
-\newcount\intercmdnamepenalty \intercmdnamepenalty = 300
-\newcount\@intercmdnamepenalty \@intercmdnamepenalty = \intercmdnamepenalty
-
-
-
-% The output routine.
-%
-\output = {%
- \onepageout
- %
- % Odd pages are right-hand pages.
- %
- % Note \pageno has been incremented when we get here -- it now refers
- % to the page number of the page about to be typeset, not the page
- % that we just shipped out.
- %
- \ifodd\pageno % \onepageout advances \pageno.
- \global\hoffset = \oddoffset
- \global\intercmdnamepenalty = 10000
- \else
- \global\hoffset = \evenoffset
- \global\intercmdnamepenalty = \@intercmdnamepenalty
- \fi
-}
-
-\ifdvi\else\output={%
- \setbox0=\box255\deadcycles=0
- \advancepageno
- \global\advance \truepage by 1
- \ifnum\outputpenalty>-20000\else \dosupereject \fi
- }
-\fi
-
-\def\onepageout{%
- \shipout\vbox{%
- \offinterlineskip % The page should have vertically abutting boxes.
- \ifodd\pageno
- \cropmargin = \insidemargin
- \else
- \cropmargin = \outsidemargin
- \fi
- \addcropmarks % Does not affect the position.
- \ifcenterpage \addtruepage \fi
- %
- \ifedgetabs \ifodd\pageno \ifnoheadline\else
- \edgetabs % Does not affect the position.
- \fi\fi\fi
- %
- \vbox to 0pt{\vskip-\headmargin \vskip-3.5pc
- \rightline{\sevenrm\timestamp}\vss}%
- %
- \smash{\line{\the\headline}}% Simplified \makeheadline.
- \pagebody
- \vskip 2\normalbaselineskip
- % The footline is needed on one page (for an example).
- \line{\the\footline}%
- }%
- % Now the rest from \plainoutput:
- \advancepageno
- \global\advance\truepage by 1
- \ifnum\outputpenalty>-20000\else \dosupereject \fi
-}
-
-\footline = {\hfil}
-
-% The headline always includes the name of the current chapter. This
-% goes on the inside. If more information, such as the concept we're
-% explaining, is included, it goes on the outside.
-%
-\headline = {%
- % Produce the timestamp
- \ifnoheadline
- \hfil
- \global\noheadlinefalse
- \else
- \let\\ = \ignorespaces
- \ifodd \pageno % Right-hand page.
- {\tenit \firstmark}\hfil {\tenbf \folio}%
- \else % Left-hand page.
- {\tenbf \folio}%
- \hfil
- {\tenit
- \chaptername
- \ifnum\pageno>0\ifback\else
- \quad $\backslash$\quad\S\the\chapterno
- \fi\fi
- }%
- \fi
- \fi
-}
-
-% Sizes for cropmarks:
-%
-\newdimen\cropthick \cropthick = 0.4pt
-\newdimen\crophsize \crophsize = 1pc
-\newdimen\cropvsize \cropvsize = 1pc
-\newdimen\cropoffset \cropoffset = .0625in
-
-% Each of the following macros generates a quarter of a cropmark as
-% a zero-size box at the center point of the cropmark.
-% We want the cropmarks to be centered with respect to their thicknesses.
-
-\def\vcropdown {\hbox to 0pt{%
- \kern -.5\cropthick
- \vbox to 0pt{%
- \vskip \cropoffset
- \hrule width\cropthick depth\cropvsize height0pt
- \vss}%
- \kern -.5\cropthick}%
-}
-
-\def\vcropup {\hbox to 0pt{%
- \kern -.5\cropthick
- \vbox to 0pt{%
- \vss
- \hrule width\cropthick depth\cropvsize height0pt
- \vskip \cropoffset}%
- \kern -.5\cropthick}%
-}
-
-\def\hcropright{\rlap{\kern\cropoffset\smash{%
- \vrule width\crophsize depth .5\cropthick height .5\cropthick}}}
-
-\def\hcropleft{\llap{\smash{%
- \vrule width\crophsize depth .5\cropthick height .5\cropthick}%
- \kern\cropoffset}}
-
-% \cropmargin will be set to the left margin on the current page.
-%
-\newdimen\cropmargin
-\def\cropline#1{\moveleft\cropmargin\hbox to \totalwidth{#1}}
-
-% \addcropmarks adds the cropmarks to a page while leaving everything else
-% alone. It assumes we're positioned at the top of the page.
-
-\def\addcropmarks{%
- \vbox to 0pt{%
- \offinterlineskip % contextually redundant but precautionary
- \vskip -\headmargin % to get to logical top of page
- \ifcenterpage
- \cropline{\hcropleft\vcropup \hfil \vcropup\hcropright}
- \else
- \cropline{\hfil \vcropdown}%
- \fi
- \vskip\totalheight
- \ifcenterpage
- \cropline{\hcropleft\vcropdown \hfil \vcropdown\hcropright}%
- \else
- \cropline{\hcropright\hfil\hcropleft\vcropup\vcropdown\hcropright}%
- \fi
- \vss
-}}
-
-% \addtruepage adds a small page number near the upper right cropmark.
-%
-\newcount\truepage \truepage = 1
-\def\addtruepage{%
- \vbox to 0pt{\vskip -\headmargin\vskip -2pc
- \moveleft\cropmargin\hbox to \totalwidth{%
- \twelvebf
- \quad\TeX\ pour l'Impatient\hss
- N\raise 3.3pt\hbox{o} \the\truepage\quad}%
- \vss}%
-}
-
-
-% The mark information is output by \markinfo.
-%
-% We can use a different mark, e.g., a shorter heading, by calling
-% \changemark.
-%
-\newtoks\shortmark \shortmark = {}
-\newif\ifchangemark
-
-\def\markinfo#1{%
- \ifchangemark
- \mark{\the\shortmark}\changemarkfalse
- \else
- \mark{#1}%
- \fi
-}
-
-\def\changemark#1{\shortmark = {#1}\changemarktrue}
-
-
-% ``Tabs'' down the side of the book.
-% Say \nextedgetab to move the thing down to the next.
-% Say \edgetabsfalse to turn them off.
-%
-\newcount\numtabs \numtabs = 7
-\newdimen\edgetabjump \edgetabjump = 0pt
-\def\nextedgetab{%
- \advance\edgetabjump by \edgetabdepth
-}
-
-\def\settabdepth#1{%
- \edgetabdepth = #1
- \setbox\tabbox = \vbox to \edgetabdepth{%
- \leaders
- \vbox{\vskip \edgespacing
- \hrule width\edgetabwidth height0pt depth\edgethick}%
- \vfil}
-}
-
-\newskip\bigtab \newskip\smalltab
-\newskip\edgetabdepth
-\newbox\tabbox
-
-\bigtab = \totalheight \divide\bigtab by \numtabs
-\smalltab = .4\bigtab % five smalls make two bigs
-
-\newdimen\edgetabin \edgetabin = .25in
-\newdimen\edgetabbleed \edgetabbleed = .25in
-\newdimen\edgetabwidth
- \edgetabwidth = \edgetabin
- \advance \edgetabwidth by \edgetabbleed
-\newdimen\edgethick \edgethick = 1.2pt % line thickness
-\newdimen\edgespacing \edgespacing = .0pt % line spacing
-
-
-\def\edgetabs{\vbox to 0pt{%
- \vskip-\headmargin
- \vskip\edgetabjump
- \hbox{%
- \hskip \hsize
- \hskip\outsidemargin
- \hskip-\edgetabin
- \copy\tabbox
- }%
- \vss
-}}
-
-
-% We can simplify \pagecontents (which is called by \pagebody) somewhat,
-% since we don't have \topinserts.
-%
-\def\pagecontents{%
- \unvbox255 % The main page contents.
- %
- \ifvoid\footins\else % Footnotes are present.
- \vskip\skip\footins
- \footnoterule
- \unvbox\footins
- \fi
-}
-
-
-% The command chapters had a mini-index at the bottom of right-hand
-% pages. These definitions are the way to put entries into it.
-%
-% \minref generates a reference for the mini-index, and prints the
-% reference on the page, also.
-%
-\def\minref#1{%
- #1% Print it on the page.
- % That's it, now.
-}
-
-% Mini-index entry without printing the argument on the page.
-% Just ignore the argument now.
-%
-\def\minrefs#1{%
- \ignorespaces
-}
-
-% This is used for producing the concept mini-index.
-%
-\def\minrefsdelim#1\endmark{\minrefs{#1}}
-
-% One last insertion-oriented thing:
-% we always want numbered footnotes, as defined in eplain.
-% We'll do them in 8-point type.
-%
-\let\@plainfootnote = \footnote
-\let\footnote = \numberedfootnote
-\everyfootnote = {\footnotefonts}
-
-
-% The \margin macro produces a marginal note at the same level as its call.
-% It should only be used in a paragraph or in the main vertical list.
-% It is nullified when we're printing the final copy.
-%
-\def\margin#1{%
- \ifhmode
- \vadjust{\printmarginnote{#1}}%
- \else
- \dimen0 = \prevdepth
- \prevdepth = -1000pt
- \printmarginnote{#1}%
- \prevdepth = \dimen0
- \fi
- \ignorespaces
-}
-
-\def\printmarginnote#1{%
- \hbox to 0pt{%
- \hskip 1.1\hsize
- \vbox to 0pt{%
- \everypar = {}% Don't inherit hanging indentation.
- \hsize = 1in \rightskip = 0pt plus 1fil \noindent \sevenrm
- \let\tt = \eighttt
- \parfillskip = 0pt plus 1fil
- \baselineskip = 8pt #1%
- \vss
- }%
- \hss
- }%
-}
-
-%\iffinal
-\iftrue
- \def\margin#1{\ignorespaces}
-\fi
-
-
-% Stuff to preserve page breaks inserted for the 2nd printing.
-% This macro takes one ``argument''.
-%
-\def\secondprinting{\afterassignment\finishsecondprinting \toks0 = }
-\def\finishsecondprinting{\the\toks0}
-
-
-
-% Parts of the book.
-%
-%
-% Chapters.
-%
-\let\chaptername = \empty
-\newcount\chapterno
-
-\def\chaprule{\vrule depth3\baselineskip height1.5pc width1pt}
-
-% Chapter openings should not have headlines.
-% The text of each chapter starts on a right-hand page in the final
-% book. The facing page has an illustration. This means that if the
-% previous chapter ended on a left-hand (i.e., even) page, we have to
-% eject an extra blank page.
-%
-\outer\def\chapter#1 \par{%
- \ifcompletebook % Don't do the blank pages for proof copies.
- \blankpage % the illustration page
- % The first real chapter starts on page 1.
- \ifnum\pageno < 0 \pageno = 1 \fi
- \fi
- %
- \def\chaptername{ #1\Black}%
- \advance\chapterno by 1
- %
- \setbox0 = \hbox{\Blue\chapternumeralfont
- \kern1pt
- \expandafter\kernchapno\the\chapterno\empty
- \kern3pt}%
- \vglue 0pt % But we get a \topskip of 2pc now.
- \nointerlineskip
- \leftline{%
- \ifback\else
- \vtop{%
- \copy0
- \vskip6pt
- \hrule width\wd0 height2.2pc
- }%
- \kern 16pt
- \fi
- \chapterfonts % to get \baselineskip now
- \chaprule
- \kern 6pt
- \vtop{%
- \def\linebreak{\hfil\break}%
- \noindent \chaptername}%
- }%
- \vskip 6pc plus.5pc minus.5pc
- \noheadlinetrue
- \toks0=\expandafter{\chaptername}
- \edef\writechaptertoc{%
- \noexpand\writenumberedtocentry{chapter}{\the\toks0}{\the\chapterno}%
- }%
- \writechaptertoc
- %
- % Use chaptername as first A-head (or only one).
- \mark{\chaptername}%
- \footnotenumber = 0 % Number footnotes from 1 in each chapter.
- \beginit{CHAPTER}%
- \noindent
- \ignorespaces
-}
-
-\def\endchapter{%
- \mark{\chaptername}% Use chapter name on last blank recto page
- \vfil\eject % be sure everything's out before testing for recto
- \ifodd\pageno
- \message{Le chapitre se termine sur une page paire.}%
- \blankpage
- \fi
- \endit{CHAPTER}%
-}
-%
-% \blankpage creates a blank page with no headline.
-% In the final book, it just advances the page number.
-% For the web edition, the blank pages serve no purpose except to keep
-% the indexing correct. I didn't want to rerun the index.
-%
-\def\blankpage{%
- \iffinal
- \advancepageno
- \global \advance \truepage by 1
- \else
- \noheadlinetrue\pagebreak
- \fi
-}
-
-% This hokey little macro kerns between the numerals in the chapter
-% number. We want to kern more between `11' then otherwise; also, we
-% want to remove the extra space before the chapter number, and after
-% `11'.
-%
-\def\kernchapno#1#2{%
- \ifx\empty#2\else \kern-3pt \fi
- #1%
- \ifx\empty#2\else
- \if1#2%
- \kern-.1em
- \else
- \kern-.05em
- \fi
- \fi
- #2%
- \if 1#2\kern-.1em\fi
-}
-
-% Sections.
-%
-\newif\ifheading % Avoid breaking after a heading.
-
-% get section numbers for the fdl only, since it has internal references.
-\let\fdlkludge=\empty
-
-% The heading flag is turned on by headings and turned off
-% at the start of a description.
-%
-\outer\def\section#1 \par{%
- \par % be sure we're in vertical mode
- \saveskip = \lastskip % will be 0 if no skip
- \cmdbreak
- \combineskips\abovesectionskip
- \dimen0 = 2.5\baselineskip \advance\dimen0 by -\topskip
- \vskip -\dimen0
- \vglue \dimen0
- %
- {\sectionfonts \leftline{\fdlkludge\Red #1\Black}}%
- %
- \markinfo{#1}%
- \writetocentry{section}{#1}%
- \nobreak
- % Don't go into horizontal mode within the command descriptions.
- %
- \vskip\belowsectionskip
- \ifcommands \else \noindent \fi
- \headingtrue
- \everypar = {\headingfalse \global\everypar = {}}%
- % only gets executed for \par in horizontal mode
- \ignorespaces
-}
-
-
-% Subsections. We don't want a break at the glue if we were preceded by
-% a \nobreak.
-%
-\def\subsection#1 \par{%
- \par % be sure we're in vertical mode
- \saveskip = \lastskip % will be 0 if no skip
- \ifheading % Did we just have \section?
- \nobreak
- \fi
- \combineskips\abovesubsectionskip
- \dimen0 = 2.5\baselineskip \advance\dimen0 by -\topskip
- \vskip -\dimen0
- \vglue \dimen0
- %
- {\subsectionfonts
- \leftline{\vrule width.5em height1.2ex depth.2ex \enspace \RawSienna #1\Black}}%
- \writetocentry{subsection}{#1}%
- \nobreak
- % Don't go into horizontal mode within the command descriptions.
- \vskip\belowsubsectionskip
- \ifcommands \else \noindent \fi
- \headingtrue
- \everypar = {\headingfalse \global\everypar = {}}%
- % only gets executed for \par in horizontal mode
- \ignorespaces
-}
-
-% \combineskips combines the current skip (#1) with the previous skip
-% (which must be in \saveskip), and effectively skips by the larger of
-% the two.
-%
-\newskip\saveskip
-\def\combineskips#1{\ifdim\saveskip<#1\vskip-\saveskip \vskip#1\fi}
-
-
-
-% List macros.
-%
-
-% We want to use different names than eplain.
-%
-\let\ulist = \unorderedlist
-\let\endulist = \endunorderedlist
-%
-\let\olist = \numberedlist
-\let\endolist = \endnumberedlist
-
-\let\compact = \listcompact
-
-% The \noindent here keeps us from getting indentation on the first line.
-% It also makes the display into a `short' display, FYI.
-% The \belowdisplayskip and \abovedisplayskip glue are inserted by the
-% display.
-%
-\long\def\display#1{%
- \ifvmode \noindent \fi
- $$\vtop{\everypar = {}\hsize = \displaywidth
- \parfillskip = 0pt plus 1fil % don't worry about widows
- \noindent #1\par\global\savedepth = \prevdepth}$$%
- \endgraf
- \prevdepth = \savedepth
-}
-
-% \vdisplay is like \display, except it's for vertical mode material. Use it
-% to avoid an unwanted initial lineskip.
-%
-\long\def\vdisplay#1{%
- \ifvmode \noindent \fi
- $$\vtop{\everypar = {}\hsize = \displaywidth
- \parfillskip = 0pt plus 1fil % don't worry about widows
- #1\par\global\savedepth = \prevdepth}$$%
- \endgraf
- \prevdepth = \savedepth
-}
-
-
-
-% Indexing.
-% Derived from Knuth's manmac macros.
-%
-\newwrite\index
-
-\immediate\openout\index = \jobname.idx
-\newif\ifsilent
-
-% We need ^ to be active temporarily, while we define it.
-%
-{ \catcode`\^ = \active
-%
-\gdef^{%
- \ifmmode
- \let \nextaction = \sp
- \else
- \let \nextaction = \beginindexref
- \begingroup
- \catcode `| = \other \catcode `^ = \other
- \fi
- \nextaction
-}}
-
-\def\beginindexref{\futurelet\next\checksilence}
-
-{% And for here, we need ^ to be deactivated
-\catcode `^ = \other
-
-\gdef\checksilence{%
- \if ^\next
- \silenttrue \let\nextaction = \secondhat
- \else
- \silentfalse \let\nextaction = \checkbar
- \fi
- \nextaction
-}
-
-% Eat the `^' that we saw would be the next token.
-%
-\gdef\secondhat^{\checkbar}
-
-} % end scope where ^ is \other
-
-\def\checkbar{\futurelet\next\iswitch}
-
-% Here we start reading the text of the actual index entry;
-% we've determined whether it's silent or not.
-%
-% We handle the following cases:
-% ^{alpha} and ^^{alpha}
-% ^|alpha| and ^^|alpha|
-% ^|\alpha| and ^^|\alpha|
-%
-% When this is called, \next is either `|' or `{'.
-%
-\def\iswitch{%
- \ifx |\next
- \let \nextaction = \checkbackslash
- \else
- \let \nextaction = \normalidx
- \fi
- \nextaction
-}
-
-\def\checkbackslash|{%
- % within |...| we allow anything (but another |)
- \deactivate \catcode `\ = \other
- \futurelet\next\litidx
-}
-
-% The thing after the ^ is a |. We have further checking to do -- is
-% the next character a \?
-%
-{ % reverse \ and /
-\catcode`\/ = 0
-\catcode`\\ = \other
-/gdef/litidx{%
- /if \/next
- /expandafter/litidxA
- /else
- /expandafter/litidxB
- /fi
-}
-
-% The thing being indexed starts with a \.
-%
-/gdef/litidxA \#1|{%
- /ctsidxref{#1}%
- /litidxswitch{/\#1}%
-}
-
-% The thing being indexed is just a word.
-%
-/gdef/litidxB #1|{%
- /ttidxref{#1}%
- /litidxswitch{#1}%
-}
-}% end reversal of \ and /
-
-% The thing after the ^ is not a |.
-%
-\def\normalidx#1{%
- \ifsilent
- \aftergroup\ignorespaces
- \else
- #1%
- \fi
- \idxref{#1}%
- \endgroup % group started by \iswitch.
-}
-
-\def\litidxswitch#1{%
- \ifsilent
- \aftergroup\ignorespaces
- \else
- {\tt #1}%
- \fi
- \endgroup % group started by \iswitch.
-}
-
-
-
-% Indexing macros for external use.
-
-% \idxref generates an index entry for #1. If #1 contains any control
-% sequences, they are treated literally.
-%
-\def\idxref#1{\indexwrite{#1}N\ignorespaces}
-
-
-% For creating an index entry for control space.
-{\catcode `\ =\other
-\gdef\blankidxref{\ctsidxref{ }}
-}
-
-% I removed this macro from eplain because \csname works as well, but
-% since the macros below are already written to use it ...
-\def\@tokstostring#1{\@ttsA#1 \@ttsmarkA}%
-\let\tokstostring=\@tokstostring
-\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{+}%
-\let\spacesub = \@spacesub
-%
-\def\@ifempty#1{\@@ifempty #1\@emptymarkA\@emptymarkB}%
-\def\@@ifempty#1#2\@emptymarkB{\ifx #1\@emptymarkA}%
-\def\@emptymarkA{\@emptymarkA}% Again, so \ifx won't complain.
-
-% #1 is the index term, #2 is the reference as in
-% Diacritical mark, see accent.
-
-\def\idxsee#1#2{%
- \begingroup
- \def\spacesub{\otherspace}%
- \edef\nextaction{\write\index{\tokstostring{#1}::N::*\tokstostring{#2}}}%
- \nextaction
- \ignorespaces
-\endgroup}
-
-
-% \ttidxref generates an index entry for #1 in the program font.
-% If #1 contains any control sequences, they are treated literally.
-%
-\def\ttidxref#1{\indexwrite{#1}T\ignorespaces}
-
-
-% \ctsidxref generates an index entry for a control sequence. #1
-% should not have a preceding backslash, so that the proper call for
-% indexing \alpha is \ctsidxref{alpha}.
-%
-\def\ctsidxref #1{\indexwrite{#1}C\ignorespaces}
-
-% \indexchar is needed to generate index entries for three especially
-% difficult single characters: {, }, and \. They are blank-delimited.
-%
-\def\indexchar{\begingroup \deactivate \indexcharA}
-\def\indexcharA#1 {\indexwrite{#1}T\endgroup}
-
-% \pix indicates that the next index entry is a principal one.
-%
-\newif\ifpix
-\def\pix{\global\pixtrue}
-
-% \bix and \eix indicate that the next index entry begins or ends a
-% range of pages.
-%
-\newif\ifbix \def\bix{\bixtrue}
-\newif\ifeix \def\eix{\eixtrue}
-
-% #1 is the text of the entry, #2 is N (normal), T (typewriter) or
-% C (control sequence) or `cs' for now.
-%
-\def\indexwrite#1#2{\begingroup
- \def\spacesub{\otherspace}%
- \edef\tts{\tokstostring{#1}}%
- \edef\nextaction{\write\index{\tts::#2::\noexpand\number\noexpand\pageno
- \ifbix B\fi\ifeix E\fi\ifpix P\fi}}%
- \nextaction
- \global\pixfalse \global\bixfalse \global\eixfalse
-\endgroup}
-
-{\catcode `\^ = \other \gdef\twocarets{^^}}
-
-
-% For generating index entries with weird characters, we need to deactivate
-% them: { } blank \ and substitute [ ] ! for { } \ . \recat does this.
-% It should be enclosed in a group (which must end in `]').
-\def\recat{%
- \aftergroup\ignorespaces
- \catcode `\! = 0 \catcode `[ = 1 \catcode `] = 2
- \catcode `\ = \other \deactivate
-}
-
-
-
-% Macros for the front matter.
-%
-% Space at the top of the frontmatter pages.
-%
-\def\sinkage{\vglue 7pc \relax}
-
-% And at the top of the backmatter pages.
-%
-\def\backsinkage{\vglue 2pc \relax}
-
-% \frontchapter doesn't care if we're on an even page or an odd page.
-%
-\def\frontchapter#1 \par{%
- \def\chaptername{ #1}%
- \leftline{%
- \chapterfonts
- \chaprule
- \kern 6pt
- \vtop{%
- \def\linebreak{\hfil\break}%
- \noindent \Blue\chaptername\Black}%
- }%
- \vskip 4pc
- \noheadlinetrue
- % Use chaptername as first A-head (or only one)
- \mark{\chaptername}%
- \noheadlinetrue
- \noindent \ignorespaces
-}
-
-
-% We are called from inside a group, so we can redefine the \toc... macros.
-%
-\def\shortcontents{{%
- \firsttoctrue
- \backfalse
- \shorttocfonts
- \let\tocchapterentry = \shorttocchapter
- \let\tocsectionentry = \gobblethree
- \let\tocsubsectionentry = \gobblethree
- \halign{\hfil\strut##&\strut ##\hfil\cr
- \readtocfile
- \crcr}}%
- \pagebreak
- \global\backfalse
-}
-
-% #1 is the chapter name, #2 the chapter number, #3 the page number.
-%
-\def\shorttocchapter#1#2#3{%
- \ifback\else#2\quad $\backslash$\quad\fi&#1\qquad
- \raise3pt\hbox{\vrule height2pt width4pt depth2pt}$\,\,$#3\cr
-}
-
-% Yes, we read the entire contents (several pages) as one alignment.
-%
-\def\contents{{%
- \firsttoctrue
- \backfalse
- \tocfonts
- \interlinepenalty = 100
- \halign{\hfil\strut##&\strut ##\hfil\cr
- \readtocfile
- \crcr}}%
- \pagebreak
- % We want to end the contents on a recto page, even if it's blank
- \ifodd\pageno\pagebreak\fi % leaves us on an even page.
- \global\backfalse
-}
-
-\newif\iffirsttoc
-
-\def\tocchapterentry#1#2#3{%
- \iffirsttoc
- \global\firsttocfalse
- \else
- \noalign{\penalty-1000 \bigskip\smallskip}%
- \fi
- %
- \ifback\else\bf#2\quad $\backslash$\quad\fi
- &\bf#1\qquad\raise3pt\hbox{\vrule height2pt width4pt depth2pt}%
- $\,\,$#3\cr
- \noalign{\nobreak\vskip2pt}%
-}
-
-\def\tocsectionentry#1#2#3{%
- \noalign{\penalty-500 \vskip\medsmallskipamount}%
- &\it #1\quad \openbox$\,\,$\rm #3\cr
-}
-
-\def\tocsubsectionentry#1#2#3{%
- &\qquad #1\quad $\cdot\,$#3\cr
-}
-
-\def\openbox{\ht0 = 1.75pt \dp0 = 1.75pt \wd0 = 3.5pt
- \raise 2.75pt \makeblankbox{.2pt}{.2pt}%
-}
-
-\newif\ifback
-% \ifback is true when we're doing the table of contents and are about
-% to do the back matter. It is also true just before we do the back matter
-% chapters (really, only the index).
-%
-\def\backmatter{\write\tocfile{\noexpand\setback}\backtrue}
-\def\setback{\noalign{\bigskip\global\backtrue}}
-
-
-
-% Macros for the examples chapter.
-%
-% \doexamples is called with the name of the examples file
-% Each example is ended by ::: (including the last one)
-% A line starting with ~ is executed in the output (without the ~)
-% but dropped from the input.
-%
-% Within the input, ! is an escape character, but {} are not recognized.
-% This provides a limited control sequence capability, which is sufficient
-% for delimited macros and therefore for cross-references (see \xrefdelim).
-% !! stands for !.
-%
-\def\endmark{:::}
-
-\newif\ifnotatend \newif\ifnotatendfile \newif\iftildeline
-\newread\exfileA \newread\exfileB \newwrite\exfileC
-\newcount\examplenumber
-
-\def\doexamples#1{%
- % Here we assume that two read-only openings of the same file are OK.
- \immediate\openin\exfileA = #1
- \immediate\openin\exfileB = #1
- \loop
- \advance\examplenumber by 1
- \reader
- \ifx\holder\empty \notatendfilefalse \else \notatendfiletrue \fi
- \ifnotatendfile
- \dooneexample
- \repeat
-}
-
-
-% We want control sequences to be executed as the input of each example
-% is formatted, but we don't want to execute them for the output of each
-% example until we generate that output with an \input command.
-% Therefore, we treat ! differently for \holder, which produces example
-% input, and \holderA, which produces example output.
-%
-% We can't say \global\immediate\read, but \immediate is implied with \read.
-%
-\def\reader{{\deactivate
- \catcode`\! = \other % To execute control sequences on \input.
- \catcode`\^^M = 9 \global\read\exfileA to \holder
- %
- \catcode`\! = 0 % To execute control sequences right away.
- \obeyspaces \global\read\exfileB to \holderA
- }%
-}
-
-\def\dooneexample{{%
- % We want to mention \! in one of the examples:
- \edef\examplenum{\numbername\examplenumber}%
-
- \immediate\openout\exfileC = \tempfile
-
- \catcode`\| = \other % No literal code in these examples.
- \chardef\! = `\! % !! means a literal ! character.
-
-
- % Collect the input page, as it is to be printed, in a box
- % At the same time, write out each line to \exfileC
- % We make the box 0pt tall to avoid problems with overfull pages.
- \setbox\xmpinput = \vbox to 0pt{%
- %
- \baselineskip = \codebaselineskip
- \loop
- \ifx\endmark\holder \notatendfalse \else\notatendtrue \fi
- \ifnotatend
- \expandafter\tildecheck\holder \empty \marker
- \iftildeline\else
- \leftline{\tt\frenchspacing \holderA \thinspace}%
- \immediate\write\exfileC{\holder}%
- \fi
- \reader
- \repeat
- \vss % reduce height to 0pt
- }% end \vtop
-
- \immediate\closeout\exfileC
-
- {%
- \maxdepth = \maxdimen % allow long input
- \vfill\eject
- \catcode`\! = 0
- \restoreplainTeX
- {%
- \let\eject = \relax \input\tempfile
- % Every example ends with \bye, but \bye is disabled in the main text.
- \vfill\par\penalty-10000
- \global\footline = {\hfil}%
- }%
- \box\xmpinput
- }%
-}}
-
-{
- \catcode `\~ = \other % So the \ifx works.
- \gdef\tildecheck#1#2\marker{%
- \ifx #1~%
- \immediate\write\exfileC {#2}\tildelinetrue
- \else
- \tildelinefalse
- \fi
- }
-}
-
-% This definition is more or less repeated verbatim in the first example
-% in xmptext.tex.
-%
-\def\xmpheader #1/#2{%
- {\exampletitlefonts \leftline{Exemple #1~:\quad \bi#2}}%
- \vglue .5\baselineskip
- \count255 = \pageno
- \xdef\examplepage{\number\count255}%
- \markinfo{Exemple #1~: #2}
- \ifrewritetocfile
- \write\tocfile{\string\tocsectionentry{#2}{}{\examplepage}}%
- \fi
-}
-% Let's number examples automatically; it makes it easier to move them
-% around and add new ones.
-
-\def\xmpnum{\number\examplenumber}
-
-\newbox\xmpinput
-
-
-% \negthin lets us put `\!' in examples.
-
-\def\negthin{\ifmmode \mskip-\thinmuskip \else \char`\\ \char`\! \fi}
-
-\def\xmpheaddef{voir \xref{xmphead}}
-
-\def\restoreplainTeX{%
- % Restore plain TeX's parameters (except for \hsize and \hoffset).
- \parindent = 20pt
- \parskip = 0pt plus 1pt
- \parfillskip = 0pt plus 1fil
- \hfuzz = 0.1pt
- \hbadness = 1000
- \abovedisplayskip=12pt plus 3pt minus 9pt
- \abovedisplayshortskip=0pt plus 3pt
- \belowdisplayskip=12pt plus 3pt minus 9pt
- \belowdisplayshortskip=7pt plus 3pt minus 4pt
- \everymath = {}%
- \everydisplay = {}%
- \centereddisplays
- \let\vfootnote = \@plainvfootnote
- \let\footnote = \@plainfootnote
- \let\tenrm = \oldtenrm
- \textfont0 = \tenrm
- \rm
- \ignorespaces
-}%
-
-
-
-% Macros for the concepts chapter.
-%
-%
-% Start off the chapter.
-%
-\def\beginconcepts{\openout\conceptfile = \jobname.ccs }
-\def\endconcepts{\closeout\conceptfile}
-
-\newwrite\conceptfile
-
-% \concept produces a concept heading and also generates a crossreference
-% suitable for the mini-index. It even works for concepts with several words
-% or containing control sequences like `\ascii'.
-%
-\def\concept#1 \par{%
- \par%\vfill\eject
- %k \cmdbreak
- \penalty\conceptpenalty\vskip\aboveconceptskip
- %k \vskip 0pt plus 1pt % allow a little more stretch
- \noindent
- % generate the index entry
- \ifconceptindex \else \global\indextoks = {\idxref{#1}}\fi
- \conceptindexfalse
- \pix\bix\the\indextoks
- %
- {\bt \let\it=\bti \unskip\null \RawSienna\bf #1.\Black\hskip1em plus.2em minus.2em }%
- \markinfo{#1}%
- \xrdef{#1}%
- \write\conceptfile{\string\doconcept{#1}{\number\pageno}}%
- \beginit{CONCEPT}%
- \nobreak
- \ignorespaces
-}
-
-\def\endconcept{%
- \par % always go to vertical mode here
- \eix\the\indextoks
- \endit{CONCEPT}%
- \ignorespaces
-}
-
-\def\doconcept#1#2{\hbox{#1\quad #2}}
-
-% Sometimes we want to index a concept under some other name than the
-% concept name, e.g., indexing `delimiter' as `delimiters'. The
-% \conceptindex macro lets us do this.
-%
-\newif\ifconceptindex
-\newtoks\indextoks
-\def\conceptindex#1{%
- \conceptindextrue
- \global\indextoks = {\idxref{#1}}%
- \ignorespaces
-}
-
-
-% Commands for cross-referencing within the concepts chapter.
-% Each refterm has the form {a} or {a:b}, where b is the term to
-% actually reference (e.g., \refterm{\PlainTeX:\plainTeX}).
-%
-\def\refterm#1{%
- \reftermA #1:\endmark % Parse the stuff.
- \expandafter\minrefsdelim\termtoref\endmark
- \relax % Cancel the \ignorespaces.
-}%
-\def\reftermA#1:{\reftermfirst{#1}\futurelet\next\reftermB}
-\def\reftermB#1\endmark{\ifx\endmark \next \else \reftermsecond#1\fi}
-
-\def\reftermfirst#1{#1\def\termtoref{#1}}
-\def\reftermsecond#1:{\def\termtoref{#1}}%
-
-% The defining sentence for a concept.
-%
-\def\defterm#1{{\it #1\/}}
-
-
-% This macro prints the single page that will go on the back cover.
-%
-\def\printconceptpage{%
- % Make sure this is considered an odd page.
- \ifodd\pageno\else\blankpage\fi
- \noheadlinetrue
- \advance\hsize by 2pc
- \vglue2pc % Plus a \topskip of 2pc.
- {\sectionfonts \leftline{Liste des concepts}}%
- \vskip\belowsectionskip
- {\conceptpagefonts
- \parindent=0pt
- \makecolumns 94/3:
- \input \jobname.ccs
- \vfil
- % Put the `logo' at the bottom of the page.
- \rightline{\thisbook}%
- }%
- \eject
-}
-
-
-
-% Macros for the commands chapters.
-%
-% \ifcommands is true when we're within \begindescriptions ...
-
-\newif\ifcommands
-
-
-% \begindescriptions should be called to start the actual control sequences.
-%
-\outer\def\begindescriptions{\beginit{DESCRIPTIONS}%
- % The following definitions are local to this chapter.
- %
- \let\example = \commandexample
- \let\endexample = \endcommandexample
- \interlinepenalty = 50
- %
- \commandstrue
- \ignorespaces
-}
-
-% The \endgroup that \enddescriptions does must come after the page
-% break, so the last page of descriptions will get a mini-index.
-%
-\def\enddescriptions{%
- \vskip -\lastskip % undo the skip created by \enddesc
- \endit{DESCRIPTIONS}%
- \ignorespaces
-}
-
-
-% Begin or end the description of a control sequence or group thereof.
-%
-\def\begindesc{%
- \par % force vertical mode
- \saveskip = \lastskip % will be 0 if no skip
- \ifheading % Did we just have \section or \subsection?
- \nobreak
- \else
- \cmdbreak
- \fi
- \combineskips\abovedescriptionskip
- \headingfalse
- \beginit{DESCRIPTION}%
- \beginit{COMMANDS}%
- % Each command name is set as a paragraph (for reasons I don't
- % remember, \leftline doesn't work because of the way the manuscript
- % was typed), and so \clubpenalty will be the penalty at the
- % interline glue (see p.96).
- \clubpenalty = \intercmdnamepenalty
- \parfillskip = 0pt plus 1fil
- \ignorespaces
-}
-
-\def\enddesc{%
- \nobreak % if we need a break, we'll get it from the next group opener
- \vskip\belowdescriptionskip
- \endit{DESCRIPTION}%
- \ignorespaces
-}
-
-% Begin the explanation of a control sequence. Don't break at the
-% space above the explanation, or the interline glue before the first line.
-%
-\def\explain{%
- \par
- \endit{COMMANDS}%
- \nobreak \vskip\explainskip
- \interlinepenalty = 50
- \nobreak \noindent
- \ignorespaces
-}
-
-% Here is how \example looks in the text:
-% \example
-% ...
-% |
-% \produces
-% ...
-% \endexample
-%
-% repeated an indefinite number of times.
-%
-% We want to set the code of an example in a box so as to prevent it from
-% being broken across pages. By using \vtop we assure that the code is the
-% right distance from the `Example:' line. In order to keep the `produces:'
-% the right distance from the last code line, we save the depth of that code
-% line and then fool TeX into thinking that the \vtop has that depth by
-% assigning it to \prevdepth. If we didn't do this, the last line of the code
-% would be too close to the `produces:' (as indeed it was in earlier versions
-% of the book.
-%
-\newdimen\savedepth
-
-{\makeactive|
-\gdef\commandexample{% a.k.a. \example, inside \begindescriptions.
- \cmdbreak\vskip\exampleskip
- \leftline{\it Exemple~:}%
- \nobreak % At the interline glue.
- \beginit{EXAMPLE}%
- \parfillskip = 0pt plus 1fil
- \hbox\bgroup\hskip\parindent\vtop\bgroup
- \begincs
- \let | = \endcode
- \advance\hsize by -\parindent
- \parindent = 0pt
- \bgroup\obeywhitespace
-}}%
-
-\def\endcode{%
- \egroup % end \obeywhitespace group
- \par\global\savedepth=\prevdepth
- \egroup % end inner \vbox
- \egroup % end outer \hbox
- \prevdepth = \savedepth
- \ignorespaces
-}
-
-% \dproduces should be used when the following material is a math
-% display.
-%
-\newif\ifexampledisplay
-\def\dproduces{\global\exampledisplaytrue \produces}
-
-\newif\ifproduces
-
-% \produces puts its material into a vbox so it won't be broken.
-% The material starts in VERTICAL MODE! It uses the plainTeX conventions
-% except that \parindent is 0pt.
-
-\def\produces{%
- \producestrue
- \ifodd\pageno \par \nobreak \else \cmdbreak\fi
- \vskip\tinyskipamount
- \noindent {\it produit\ifexamplelog\ dans la log\examplelogfalse\fi~:}%
- \vadjust{\nobreak}% At the interline glue.
- \ifexampledisplay
- \centereddisplays
- \else
- \par\nobreak
- \advance\hsize by -\parindent
- \savedepth = \prevdepth
- \nointerlineskip
- \hbox\bgroup\hskip\normalindent
- \vtop\bgroup \restoreplainTeX \parindent = 0pt
- \prevdepth = \savedepth
- \fi
-}%
-
-% we need another ``produces'' form for when a command puts things in
-% the log. In this case, the produces text also ends with a |.
-%
-\newif\ifexamplelog
-{\makeactive|
-\gdef\logproduces{\examplelogtrue\produces
- \begincs
- \def |{\endcode\producesfalse}%
- % Every line is set as a paragraph, so we get one \parindent for free.
- % But we also did \advance\leftskip in \produces, so now we have two.
- % We only want one.
- \advance\leftskip by -\parindent
- \bgroup\obeywhitespace
-}}%
-
-\def\nextexample{\endexample\interexampleskip\example}
-
-\def\endcommandexample{%
- \par % force vertical mode, set previous paragraph
- \ifproduces \ifexampledisplay \global\exampledisplayfalse \else
- \global\savedepth = \prevdepth
- \egroup % Matches the \vtop in either the \produces or the \example.
- \egroup % Matches the \hbox in \producesbox.
- \global\producesfalse
- \par
- \prevdepth = \savedepth
- \fi\fi
- \endit{EXAMPLE}%
- \ignorespaces
-}
-
-\def\see{%
- \ifodd\pageno\nobreak\fi % don't put at the top of a verso page
- \vskip -\lastskip % should be \belowdescriptionskip
- \bigskip
- \noindent
- {\tenbi \spaceskip = 3.33pt plus 2pt minus 1.1pt
- \parfillskip = 0pt plus 1fil
- Voir aussi~: %k \hskip 1em plus .5em minus .25em
- }%
- \ignorespaces
-}%
-
-
-\newif\ifxref \xreftrue
-
-% \aux acts as a prefix to a \cts command, specifying that a
-% cross-reference should not be generated.
-%
-\def\aux{\xreffalse}
-
-% So does \easy, which prints a hand, pointing at the control sequence.
-% (The hand font doesn't define an em.)
-%
-\newif\ifeasy
-\let\easy = \easytrue
-\def\testeasy{\ifeasy\llap{\hand\ \kern 6pt}\easyfalse\fi}
-
-% \cts typesets the beginning of a control sequence description, and
-% generates an index entry and cross-reference definition for it. The
-% control sequence name must be delimited by a blank, since there may be
-% parameters that follow. The control sequence name can contain special
-% characters; they are deactivated. The initial \ must be omitted.
-%
-\def\cts{\begingroup \deactivate \ctsA}
-\def\ctsA#1 {\endgroup \ctsB{#1}}
-\def\ctsB#1#2{%
- \ctsbasic{\\#1}{#2}%
- \ifxref \ctsxrdef{#1}\else \xreftrue \fi
- \pix\ctsidxref{#1}%
-}
-
-% \ctsx is like \cts, but separates the control sequence name and the
-% text by more space. (`x' for `extra')
-%
-\def\ctsx{\begingroup \deactivate \ctsxA}
-\def\ctsxA#1 {\endgroup \ctsxB{#1}}
-\def\ctsxB#1#2{%
- \ctsbasic{\\#1}{\quad #2}%
- \ifxref \ctsxrdef{#1}\else \xreftrue \fi
- \pix\ctsidxref{#1}%
-}
-
-
-% \ctscol is like \cts, but doesn't start a new paragraph. It's used in
-% in columns of cs's and their explanations.
-%
-\def\ctscol#1 #2{%
- {\bt \\#1}\quad #2%
- \ifxref \ctsxrdef{#1}\else \xreftrue \fi
- \pix\ctsidxref{#1}%
-}
-
-% \ctsbasic does the actual printing of a cs name. It's needed on its
-% own for `\ '. It does not generate any index or cross-reference
-% entries. #1 is the command name, #2 some (possibly empty) text to go
-% next to it.
-%
-\def\ctsbasic#1#2{%
- \par
- \nobreak % At the \parskip glue the \noindent will produce.
- \noindent\testeasy {{\bt #1}\space #2}%
-}
-
-% \ctsxrdef generates a control sequence cross-reference definition.
-% For example, `\ctsxrdef{@star}' generates a cross-reference definition
-% for `\@star'.
-%
-\def\ctsxrdef#1{\expandafter\xrdef\csname#1\endcsname}
-
-% \ctsact prints an active character #1 and generates an index entry
-% for it. #1 is blank-delimited. \ctsact does not generate a
-% cross-reference definition.
-%
-\def\ctsact{\begingroup \deactivate \ctsactA}
-\def\ctsactA#1 {\endgroup
- \ctsbasic{#1}{}%
- \pix\ttidxref{#1}}
-
-% \ctspecial prints a control sequence #1 and generates an index
-% entry for it. #1 is blank-delimited. \ctspecial does not
-% automatically generate a cross-reference definition, and so it's used
-% for things like \newbox and \%.
-%
-\def\ctspecial{\begingroup \deactivate \ctspecialA}
-\def\ctspecialA#1 {\endgroup
- \ctsbasic{\\#1}{}%
- \pix\ctsidxref{#1}%
-}
-
-% \ctspecialx is like \ctspecial, but leaves more space after its
-% argument. We want ` and ' to come from cmtt, instead of Optima, so we
-% call \mapquotes before reading the argument. This only affects the \`
-% and \' descriptions.
-%
-\def\ctspecialx{\begingroup \deactivate \mapquotes \ctspecialxA}
-\def\ctspecialxA#1 {\endgroup
- \ctsbasic{\\#1}{}\quad
- \pix\ctsidxref{#1}%
-}
-
-% \ctsdisplay has a blank-delimited argument consisting of a control
-% sequence such as alpha. It produces $\alpha$ followed by \alpha.
-%
-\def\ctsdisplay#1 {\basicdisplay {$\csname #1\endcsname$}{\\#1}%
- \ifxref\ctsxrdef{#1}\else\xreftrue\fi \pix\ctsidxref {#1}}
-
-% \ctsdoubledisplay has a blank-delimited argument consisting of a
-% control sequence such as bigvee. It produces $\bigvee$ and
-% $\big\bigvee$ followed by \bigvee.
-%
-\def\ctsdoubledisplay#1 {
- {%
- \symbolspace = 42pt
- \basicdisplay{$\csname #1\endcsname\quad
- \displaystyle\csname #1\endcsname$\ddstrut}%
- {\\#1}%
- }%
- \ifxref\ctsxrdef{#1}\else\xreftrue\fi
- \pix\ctsidxref{#1}%
-}
-\def\ddstrut{\vrule width0pt height15pt depth11pt}
-
-% \ctsydisplay displays a control symbol. #1 is a single character,
-% which may be active. #2 is the cross-reference label,
-% blank-delimited.
-%
-\def\ctsydisplay{\begingroup \deactivate\catcode`\|=\other \ctsydisplayA}
-\def\ctsydisplayA#1 #2 {\endgroup
- \basicdisplay{$\csname\string#1\endcsname$}{\\#1}%
- \ifxref \ctsxrdef{#2}\else \xreftrue \fi
- \pix\ctsidxref{#1}%
-}
-
-% \actdisplay displays an active character. #1 is the character, and
-% #2 is the cross-reference label, blank-delimited.
-%
-\def\actdisplay{\begingroup\catcode `\|=\other\actdisplayA}
-\def\actdisplayA#1 #2 {\endgroup
- \basicdisplay{$#1$}{\string#1}%
- \ifxref \xrdef{#2}\else \xreftrue \fi
- \pix\ttidxref{#1}%
-}
-
-% \basicdisplay does the actual typesetting of a control sequence name.
-% for inside displays.
-%
-\def\basicdisplay#1#2{\testeasy\hbox to \symbolspace{#1\hfil}{\bt #2}}
-
-% Printing parameter and table entry headings.
-%
-\def\param#1{\printparam{#1}{param\`etre}}
-\def\tblentry#1{\printparam{#1}{\'el\'ement de table}}
-\def\printparam#1#2{\hskip1.5em [\kern3pt \<#1> #2\kern2pt]}
-
-% Required braces.
-%
-\def\rqbraces#1{\{\hskip2pt#1\hskip2pt\}}
-
-% Printing rulers.
-%
-\def\1{\vrule height 0pt depth 2pt}
-\def\2{\vrule height 0pt depth 4pt}
-\def\3{\vrule height 0pt depth 6pt}
-\def\4{\vrule height 0pt depth 8pt}
-\def\ruler#1#2#3{{$\vcenter{\hrule\hbox{\4#1}}\,\,\rm#2\,{#3}$}}
-\def\doruler{\par \noindent\ruler}
-\def\tick#1{\hbox to .125in{\hfil#1}}
-\def\8{\tick\1\tick\2\tick\1\tick\3\tick\1\tick\2\tick\1\tick\4}
-
-% Macros for the capsule summary chapter.
-%
-\def\begincapsum{\beginit{CAPSULE SUMMARY}%
- \let\bt = \tentt
- \bigskip
-}
-
-\def\endcapsum{\endit{CAPSULE SUMMARY}}
-
-\newbox\@primitivebox \setbox\@primitivebox = \hbox{\tt *}
-\newif\ifcs
-
-\def\capline{\begingroup \deactivate\catcode `\| = \other \caplineA}
-\def\caplineA#1 {\endgroup
- \begingroup
- \catcode `@ = \letter % for constructing labels
- \caplineB{#1}%
-}
-
-% Parameters of \caplineB:
-% #1 name of control sequence
-% #2 description
-% #3 * or empty
-% #4 xref or xref1:xref2 or empty
-
-\def\caplineB#1#2#3#4{%
- \ifempty {#4}\temptrue\else\tempfalse\fi
- % \iftemp needed to avoid \if ... \else ... \fi nesting problems
- \ifcs
- \toks0 = {\caplineout{\\#1}{#2}{#3}}%
- \iftemp
- \toks1 = \expandafter{\csname #1\endcsname}%
- \else
- \toks1 = {#4}%
- \fi
- \edef\nextaction{\the\toks0 {\the\toks1}}%
- \nextaction
- \ctsidxref {#1}%
- \else
- % The \space makes one-character entries line up nicely.
- \caplineout{\space #1}{#2}{#3}{#4}%
- \ttidxref {#1}%
- \fi
- \endgroup
-}
-
-\newif\iftemp
-
-
-% In a few cases we have two cross-references for a single control
-% sequence.
-%
-\newif\ifcstwo
-
-\def\capac{\cstwofalse\csfalse\capline}
-\def\capactwo{\cstwotrue\csfalse\capline}
-\def\capcs{\cstwofalse\cstrue\capline}
-\def\capcstwo{\cstwotrue\cstrue\capline}
-
-% \caplineout produces an output line (or several lines) for the capsule
-% summary. #1 is the command text, #2 is the description, #3 is either * or
-% empty, and #4 is the cross-reference label.
-%
-\def\caplineout#1#2#3#4{%
- \setbox0 = \ifempty {#3}\box\voidb@x \else \copy\@primitivebox\fi
- \vskip\intercapsuleskip
- % If we use \vbox here, a multi-line summary at the top of a page
- % will cause \topskip to disappear.
- %
- \vtop{\noindent \hangindent = \capsulehangindent
- \spaceskip = 3.33pt plus 2pt minus 1.5pt
- \rightskip = 0pt plus 4em % a little more stretch
- \parfillskip = 0pt plus 1fil
- \llap{\box0}{\bt #1}% Bold typewriter for the cs name.
- \quad \hskip 0pt plus 1pt minus 1pt
- #2\unskip\
- (\ifcstwo \tworefs #4:\else \xref{#4}\fi)%
- }%
- \par
-}
-
-\def\tworefs#1:#2:{\xref{#1}, \xref{#2}}
-
-
-
-% Macros for printing the index.
-%
-% Set up to print it.
-%
-\def\beginindex{%
- \doublecolumns
- \beginit{THE INDEX}
- \markinfo{\chaptername}%
- \indexfonts
- \parindent = 0pt
- \def\pp##1{{\it ##1}} % Principal entry.
- \def\c{,\thinspace\allowbreak}%
-% \def\ic{,\quad}
- \def\ic{\quad}
- \def\see##1{.\quad{\it Voir} ##1 }
- \def\seealso##1{\hfil\break{\it Voir aussi} ##1 }
- \let\r = \romannumeral
-
- \raggedright
-}
-
-\def\endindex{\endit{THE INDEX}\singlecolumn}
-
-
-% #1 is the level of this index entry minus 1 (i.e., 0 for a main
-% entry), #2 is the index term, #3 is the kind of term
-% (T for ttfont, C for control sequence, N for normal), and
-% #4 is the list of pages. The page list can have \pp (principal
-% entry)in it, and each page is separated by \c.
-%
-\def\indexentry#1#2#3#4{%
- \beginit{INDEX ENTRY}%
- \leftskip = #1\indexpageindent
- \par
- \leavevmode
- \hangindent = \indexlevelindent
- \ifx #3T%
- {\tt #2}% Typewriter.
- \else \ifx #3C%
- {\tt \llap{\\}#2}% Control sequence.
- \else
- % in normal entries, \b and \e enclose a group. ({ and } don't work.)
- {\let \b = \bgroup \let \e = \egroup #2}%
- \fi\fi
- #4% The list of pages.
- \par
- \endit{INDEX ENTRY}%
-}
-
-% Nah, let's forget printing the initial.
-%
-\def\indexgroup#1{%
- \bigskip
-}
-
-
-
-% Code formatting.
-%
-%
-% Turn off normally special characters.
-%
-\def\deactivate{%
- \catcode`\\ = \other \catcode`\{ = \other \catcode`\} = \other
- \catcode`\$ = \other \catcode`\& = \other \catcode`\# = \other
- \catcode`\% = \other \catcode`\~ = \other \catcode`\^ = \other
- \catcode`\_ = \other
-}
-
-% It is convenient to have |...| mean print the ... verbatim, except for !.
-% (But | should just be a vertical bar in math mode.) This should be
-% used only for inline code; returns inside |...| become spaces.
-%
-\catcode`\| = \active
-\def|{%
- \ifmmode
- \vert
- \else
- \begingroup
- \obeyspaces
- \begincs
- \let| = \endgroup
- \fi
-}
-
-% \csdisplay is similar, but it inserts glue before and after.
-% It also is ended by |, so we have to redefine that.
-%
-\def\csdisplay{%
- \par
- \nobreak % don't break above displays
- \vskip\abovedisplayskip
- \begingroup
- \interlinepenalty = 10000
- \obeywhitespace
- \begincs
- \def|{\endgroup\vskip\belowdisplayskip \noindent\ignorespaces}%
-}
-
-% \begincs does the setup for verbatim printing. It does not confine
-% its effects to a group.
-%
-\def\begincs{%
- \hfuzz = \codefuzz
- \parfillskip = 0pt plus 1fil
- \parskip = 0pt % don't stretch interparagraph space within code displays
- \catcode`\! = 0
- \let\! = \exclam
- \let\| = \verticalbar
- \let\$ = $%
- \let\. = \empty % Use !. to end a control sequence to be executed.
- \def\-{\discretionary{-}{}{}}% but allow explicit discretionary hyphens
- \tt \deactivate
-}
-
-
-\chardef\exclam = `\!
-\chardef\verticalbar = `\|
-
-% In math mode we want vertical bars and exclamation points to be
-% regular characters again.
-%
-\everymath = {\setmathchars}
-\everydisplay = {\setmathchars}
-\leftdisplays
-
-\def\setmathchars{%
- \catcode`\| = \other \catcode`\! = \other
- \let\{ = \lbrace \let\} = \rbrace
-}
-
-
-
-
-% Some miscellanous macros.
-%
-\def\anatomy{Anato\-mie de \TeX}
-\def\ascii{{\ninerm ASCII}}
-\def\asciichar#1{$\langle \rm #1\rangle$}
-\def\bblfile{fichier~{\tt .bbl}}
-\def\bblfiles{fichiers~{\tt .bbl}}
-\def\bibfile{fichier~{\tt .bib}}
-\def\bibfiles{fichiers~{\tt .bib}}
-\def\boite{bo\^\i te}
-\def\boites{bo\^\i tes}
-\def\bstfile{fichier~{\tt .bst}}
-\def\bstfiles{fichiers~{\tt .bst}}
-\def\didotpt{point did\^ot}
-\def\dvifile{fi\-chier~{\tt .dvi}}
-\def\dvifiles{fi\-chiers~{\tt .dvi}}
-\def\ecrire{\'ecrire} % pour le tri de l'index
-\def\editeur{\'editeur de texte} % pour le tri de l'index
-\def\elements{\'el\'ements} % pour le tri de l'index
-\def\elementextra{\'el\'ement extraordinaire} % pour le tri de l'index
-\def\enumerations{\'enum\'erations} % pour le tri de l'index
-\def\equations{\'equations} % pour le tri de l'index
-\def\etirement{\'etirement} % pour le tri de l'index
-\def\em{\thinspace {\rm em}}
-\def\emph#1{{\it #1}\itcorr} % Emphasize.
-\def\ftp{{\tt ftp}}
-\def\gffile{fichier~{\tt .gf}}
-\def\gffiles{fichiers~{\tt .gf}}
-\def\hand{{\handfont +}}
-\def\ifatest{{\tt \\if} test}
-\chardef\inches = "7D
-\def\knuth#1#2{#1 de \texbook\ et
-\def\tempa{#2}% Merci Joss !
-\ifx\tempa\empty\else
-#2
-\fi
-de la tra\-duc\-tion fran\-\c caise}
-\def\logfile{fichier~{\tt .log}}
-\let\Metafont = \MF
-\def\Mperiod.{$M$\kern-1.6pt.}
-\def\Mprimecomma,{$M'$\kern-3.5pt,}
-\def\Mprimeperiod.{$M'$\kern-2.5pt.}
-\def\mud{\thinspace {\rm mu}} % can't use \mu; it'a a Greek letter!
-\def\newTeX{nou\-veau \TeX}
-\def\oesophage{\oe sophage}
-\def\p{p.\thinspace}
-\def\pkfile{fichier~{\tt .pk}}
-\def\pkfiles{fichiers~{\tt .pk}}
-\def\plainTeX{plain \TeX}
-\def\PlainTeX{Plain \TeX}
-\def\pp{p\p}
-\def\pt{\thinspace {\rm pt}}
-\def\pxlfile{fichier~{\tt .pxl}}
-\def\pxlfiles{fichiers~{\tt .pxl}}
-\def\tequiv{\unskip $\>\equiv\>$} % equivalence in text
-\def\texbook{{\sl The \TeX book}\itcorr}
-\let\tex@ = \TeX
-\def\TeX{\tex@\null}
-\def\TeXMeX{\TeX\ M\kern-.11em\lower .5ex\hbox{E}\kern-.125em X\null}%
-\def\tfmfile{fichier~{\tt .tfm}}
-\def\tfmfiles{fichiers~{\tt .tfm}}
-\def\thisbook{{\sl\TeX\ pour l'Impatient\/}}
-\let\ths = \thinspace
-\def\tminus{\unskip\allowbreak $\>-\>$\allowbreak} % minus in text
-\def\tplus{\unskip\allowbreak $\>+\>$\allowbreak} % plus in text
-\def\TUG{\TeX{} Users Group}
-\def\Vcomma,{$V$\kern-2pt,}
-\def\visiblespace{{\tentt \char'040}}
-\def\Vperiod.{$V$\kern-2pt.}
-\let\vs=\visiblespace
-\def\xrefpg#1{page~\xrefn{#1}}
-
-% \tighten attempts to shorten the number of lines occupied by a paragraph.
-\def\tighten{\looseness=-1
- \spaceskip = .9\fontdimen2\font plus \fontdimen3\font
- minus 1.1\fontdimen4\font
-}
-
-% \itcorr can be used at the end of a macro that puts its argument in
-% italics in order to produce an italic correction just when it's needed.
-% It won't look inside a following macro call, however.
-
-\def\itcorr{\futurelet\next\itcorrA}
-\def\itcorrA{\ifx.\next\else\ifx,\next\else\/\fi\fi}
-
-
-% Arrange N items in three columns.
-% A right brace is needed at the end of the list to match the \bgroup.
-%
-\def\threecolumns{\nobreak\vskip\abovedisplayskip\dothreecolumns}
-
-\def\dothreecolumns#1 {\bgroup
- \parindent = 0pt
- \makecolumns #1/3:
-}
-
-% We don't want to make < an active character because then it cannot be used
-% in \ifnum tests. So, \<foo> denotes a nonterminal `foo'.
-%
-\def\<#1>{$\langle${\rm\it \kern-.2pt #1\kern.65pt}$\rangle$}
-
-\let\beginit = \environment
-\let\endit = \endenvironment
-
-\def\eatpar#1\par{}
-
-% \needspace breaks out the page if there's less than #1 left on it.
-
-\def\needspace#1{%
- \saveskip = \lastskip
- \par % force vertical mode
- \vfil
- \penalty 1000
- \vskip #1
- \penalty9999
- \par % exercise the page builder
- \vskip -#1 plus -1fil
- \vskip -\saveskip \vskip \saveskip % to restore \lastskip
-}
-
-
-
-
-% Expanded cross-referencing for various parts of the books.
-%
-
-% Sometimes it is clearer to refer to a cross-reference as a control
-% sequence.
-%
-\def\ctsref{\begingroup \catcode`\@ = \letter \@ctsref}
-\def\@ctsref#1{(\xref{#1})\endgroup}
-
-\def\xrefdelim[#1]{page~\xrefn{#1}} % this form doesn't need braces
-
-% This command comes at the beginning of chapters, after the \chapter
-% command and before the text. Hence the \par in the template
-% and the \noindent
-%
-\def\chapterdef#1#2\par{%
- \@writeaux{%
- \string\gdef\expandafter\string
- \csname#1_C\endcsname{\the\chapterno}}%
- \noindent
-}
-
-\def\chapternum#1{%
- \def\csn{#1_C}%
- \expandafter\ifx\csname\csn\endcsname \relax
- \expandafter\def\csname\csn\endcsname{`#1'}%
- \ifxrefwarning
- \message{Chapitre `#1' indéfini.}%
- \fi
- \fi
- \csname\csn\endcsname
-}
-
-\def\chapterref#1{section~\chapternum{#1}}
-
-\def\headcit#1#2{``{\rm #1}'' (\xref{#2})}
-
-\def\conceptcit#1{\headcit{#1}{#1}}
-
-\def\seeconcept#1{(voir ``{\rm #1}'', \xref{#1})}
-
-%\def\seeheadcon#1#2{(voir ``{\rm #1}'', \xref{#2})}
-
-
-
-
-% Special types of pictures.
-%
-% Glue pictures:
-%
-\newdimen\glueboxwidth
-\newdimen\boxdepth \boxdepth = 3.5pc
-\newskip\underlabel \underlabel= .1\boxdepth % space under `width n'.
-\def\squeezeglue{\glueboxwidth = .725\glueboxwidth}
-
-\def\labelledbox#1 #2 #3{\vtop{%
- \hrule
- \hbox{%
- \vrule
- \hbox to #1{\hfil \vbox to #2{\vfil#3\vskip\underlabel}\hfil}%
- \vrule
- }%
- \hrule
-}}%
-
-% Make a picture of a box.
-%
-\def\picbox#1 {%
- \glueboxwidth = #1pc \squeezeglue
- \vtop{%
- \hbox to \glueboxwidth{\strut \hfil {\it box}\hfil}%
- \labelledbox % Have to have spaces after the arguments.
- {\glueboxwidth}
- {\boxdepth}
- {\halign{\hfil##\hfil\cr width #1\cr}}%
- }%
-}
-
-% And of glue.
-%
-\def\gluebox#1 #2 #3 #4 {\vtop{%
- \glueboxwidth = #4pc \squeezeglue
- \hbox to \glueboxwidth{\strut \hfil {\it glue}\hfil}%
- \nointerlineskip
- \kern2pt % to move the brace down a bit
- \hbox{$\overbrace{\hbox{\hskip\glueboxwidth}}$}%
- \kern-3pt % The \overbrace puts in 3pt below itself.
- \nointerlineskip
- \vbox to \boxdepth{%
- \hsize = \glueboxwidth
- \vskip 2pt
- \advance\baselineskip by -2pt
- \centerline{\strut size #1}%
- \centerline{stretch #2}%
- \centerline{shrink #3}%
- \centerline{width #4}%
- \vss
- }%
- \kern 1.5pt % I don't know why this is needed.
- \nointerlineskip
- \hbox{$\underbrace{\hbox{\hskip\glueboxwidth}}$}%
-}}
-
-\def\gluepicture#1 #2{{\ninerm
- \medskip
- \vtop{%
- \setbox0 = \hbox{#2}% The glue and box pictures.
- \glueboxwidth = \wd0
- \leftline{\box0}%
- \kern 6pt
- \hbox to \glueboxwidth{\leftarrowfill{ width #1 }\rightarrowfill}%
- }%
- \medskip
-}}
-
-% Box pictures.
-%
-% Set up a `reference point' and the macro for a labelled height, for use
-% in forming pictures of boxes.
-%
-\newbox\refpoint
-
-\setbox\refpoint = \vbox to 0pt{%
- \kern-2.6pt
- \hbox to 0pt{\kern-2.2pt $\bullet$\hss}
- \vss
-}%
-
-\def\labelledheight#1#2{%
-\vtop to #1{\offinterlineskip
- \setbox0=\hbox{#2}\skip0=\wd0
- \hbox to \skip0{\hss\tenex\char"78\hss}\kern-4pt
- {\cleaders\hbox to \skip0{\hss\tenex\char"3F\hss}\vfil}%
- \vskip1pt\box0\vskip1pt
- {\cleaders\hbox to \skip0{\hss\tenex\char"3F\hss}\vfil}%
- \kern -6pt\boxmaxdepth 0pt\hbox to \skip0{\hss\tenex\char"79\hss}}}
-
-
-
-% Paul's updates -- no longer needed; we have converged.
-%
-%\input paulmacs
-
-% Read the cross-reference definitions.
-%
-\readauxfile
-
-\catcode`\@ = \other % Make @ an `other' character again.
-\catcode`\^ = \active % Make ^'s do indexing outside of math mode.
+% 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.
+%
+% Macros for typesetting TeX for the Impatient.
+%
+% These macros are being distributed without any warranty whatsoever.
+% The level of commentary is that which we, the authors, found necessary
+% for our own purposes.
+%
+% ==========================================================================
+%
+% The macros use the term `chapter' for what in the book is called
+% a `section', `section' for the book's `subsection', etc. For purposes of
+% defining macros it's convenient to think of the book as divided into
+% chapters, but because of the nonsequential nature of the book we don't
+% want to tell the readers that they are reading chapters.
+%\language2
+% An embedded file should end with \byebye.
+%
+%%%%%%%%%%%%%%% COULEUR %%%%%%%%%%%%%%%%%%%%%%
+\input ifpdf.sty
+\ifpdf
+\def\Red{\pdfliteral{0 1 1 0 k}}
+\def\Blue{\pdfliteral{1 1 0 0 k}}
+\def\Green{\pdfliteral{1 0 1 0 k}}
+\def\RawSienna{\pdfliteral{0 0.72 1 0.45 k}}
+\def\Black{\pdfliteral{0 0 0 1 k}}
+\else
+\def\Red{\special{color rgb 1. 0 0}}
+\def\Blue{\special{color rgb 0 0 1.}}
+\def\Green{\special{color rgb 0 1. 0}}
+\def\RawSienna{\special{color rgb 0.63 0.32 0.18}}
+\def\Black{\special{color rgb 0 0 0}}
+\fi
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begingroup
+\ifx \macsin\relax
+ % In frontm.tex, we do \input macros several times, and we still want
+ % the \byebye at the end to end the job.
+ % So we \input inside a group in frontm, and make the assignment to
+ % \endinput local.
+ \aftergroup\let\aftergroup\byebye\aftergroup\endinput
+ \aftergroup\endinput % Don't read this file again.
+\else
+ \global\let\byebye = \end
+ \global\let\macsin = \relax
+\fi
+\endgroup
+
+% This must come before config.tex.
+\input eplain
+
+% Define configuration switches and then read their values.
+%
+\newif\ifcenterpage \centerpagetrue
+\newif\ifcompletebook
+\newif\iffinal % true for the 2000dpi copy
+\newif\ifmsdos
+\newif\ifedgetabs \edgetabstrue
+\newif\ifdvi \dvitrue % true if we want a .dvi file
+
+%\xrefwarningfalse
+
+% The config file contains settings for flags, e.g.,
+% \completebookfalse
+% It can be empty as long as it exists.
+\input config
+\ifcompletebook \else\rewritetocfilefalse \fi
+\edef\tempfile{\ifmsdos g:temp \else x \fi}
+\ifx\setmodes\undefined\else\setmodes\fi % modify from command line input
+
+% Certain defaults are forced by certain others.
+%
+\iffinal \centerpagetrue \edgetabstrue\fi
+
+% Initial definitions. (These should come before \input fonts.)
+%
+\catcode`\@ = \letter % For the macro file only.
+
+% We don't want register allocation information in the log,
+% so we redefine the relevant macro from plain.tex.
+
+\def\alloc@#1#2#3#4#5{\global\advance\count1#1 by 1
+ \ch@ck#1#4#2%
+ \allocationnumber=\count1#1 \global#3#5=\allocationnumber
+}
+
+% The fonts. This should come before defining the new character control
+% sequences that follow.
+%
+\input fonts
+
+\hyphenation{script-script base-line-skip no-base-line-skip line-skip
+ line-skip-limit max-dead-cycles output-penalty no-inter-line-skip
+ show-box-depth show-box-breadth if-hmode if-vmode if-mmode
+ back-spaces back-space par-indent tracing-on-line}
+
+{
+ \catcode`\| = 0
+ \catcode`\\ = \other
+ |global|let|bsc = \ % \bsc is a true backslash character.
+}
+
+\let\\ = \bsc
+
+\def\bslash{$\backslash$} % backslash suitable for printing
+\let\shriek = !
+\let\vbar = |
+{
+ \catcode `\[ = 1 \catcode `\] = 2
+ \catcode `\{ = \other \catcode `\} = \other
+ \global\let\lbracechar = {
+ \global\let\rbracechar = }
+]
+\def\blbrace{{\bt \{}}
+\def\brbrace{{\bt \}}}
+
+{
+ \catcode`\ =\other% Notice no spaces at beginning of next line.
+\gdef\otherspace{ }
+}
+
+\let\mathlbrace = \{ \let\mathrbrace = \}
+{
+ \catcode `\[ = 1 \catcode `\] = 2
+ \catcode `\{ = \other \catcode `\} = \other
+ \gdef\{[\ifmmode\mathlbrace\else [\bt {]\fi]
+ \gdef\}[\ifmmode\mathrbrace\else [\bt }]\fi]
+]
+
+
+% These are for debugging (less drastically than \tracingall or \loggingall).
+%
+\def\tron{\tracingmacros=2 \tracingcommands=2 \tracingonline=1}
+\def\troff{\tracingmacros=0 \tracingcommands=0}
+
+% \pagebreak should always cause a break, even if the resulting
+% page is empty.
+%
+\def\pagebreak{\null\vfill\eject}
+
+% \linebreak causes a line break in chapter headings, but outside of that
+% context we don't want it to do anything.
+%
+\let\linebreak = \relax
+
+
+% Parameters.
+%
+\parskip = 0pt plus 0.3pt
+\newdimen\codefuzz \codefuzz = 10pt % for \csdisplay, \example
+\hbadness = 4000
+\vbadness = 8000
+\hfuzz = 0.1pt % as in plain TeX
+\vfuzz = 0.1pt % as in plain TeX
+\exhyphenpenalty = 0 % we don't mind these
+\widowpenalty = 10000 % these are very bad
+\clubpenalty = 10000 % these are very bad too
+
+% Page margins.
+%
+% Note that the \newdimens can't be within an \if or a \def
+% because \newdimen is an \outer macro (thanks to DEK).
+%
+\newdimen\insidemargin \newdimen\outsidemargin
+\newdimen\topmargin \newdimen\bottommargin
+\newdimen\headmargin
+\newdimen\totalwidth \newdimen\totalheight
+\newdimen\oddoffset \newdimen\evenoffset
+\newif\ifnoheadline
+
+% \totalwidth and \totalheight are the actual trim size of the book.
+% \insidemargin, \outsidemargin, \topmargin, and \bottommargin are margins
+% with respect to the pages of the book, not the draft 8 1/2 x 11 pages.
+%
+
+% This makes it so that we only have to cut twice on a page.
+% 8.5" = 51.19125pc exactly.
+% \totalwidth should = \outsidemargin + \insidemargin + \hsize.
+%
+%\totalwidth = 7.375in % 44.4159375pc = 7 3/8".
+\totalwidth = 18.7325cm % 44.4159375pc = 7 3/8".
+\outsidemargin = 8pc
+\insidemargin = 10pc
+\hsize = \totalwidth
+\advance \hsize by -\outsidemargin
+\advance \hsize by -\insidemargin
+% \hsize should now be 26.4159375pc
+
+% Now that we know \hsize, we can set \parfillskip to eliminate (most)
+% widows.
+%
+\parfillskip = .75\hsize plus .06\hsize minus .75\hsize
+
+
+% \oddoffset and \evenoffset are the \hoffset values needed to
+% align the left edge of the virtual page with the left edge of the
+% draft paper (not the left edge of the book pages).
+%
+% The -1in below comes from the default margin, which the DVI driver must
+% set at 1in. Odd pages are on the left, even on the right.
+%
+% First, align the left edge of the virtual page with the left edge of the
+% draft page.
+%
+\oddoffset = -1in
+\advance\oddoffset by \insidemargin
+%
+\evenoffset = -1in
+\advance\evenoffset by \outsidemargin
+
+% For centered pages, move the virtual page right by half the trim width.
+%
+\ifcenterpage
+% \dimen0 = 8.5in
+ \dimen0 = 21cm
+ \advance\dimen0 by -\totalwidth
+ \divide\dimen0 by 2
+ \advance\oddoffset by \dimen0
+ \advance\evenoffset by \dimen0
+
+% For uncentered even-numbered pages, align the right edge of the virtual
+% page with the right edge of the draft paper so that we can remove the trim
+% of two-sided pages with a single cut.
+%
+\else
+% \advance\evenoffset by 8.5in
+ \advance\evenoffset by 21cm
+ \advance\evenoffset by -\totalwidth
+\fi
+
+\hoffset = \oddoffset % First page is numbered one.
+
+% Now for the vertical, which is simpler, since it doesn't vary from
+% page to page.
+% 11" = 66.2475pc exactly.
+% \totalheight should = \topmargin + \bottommargin + \vsize.
+%
+%\totalheight = 9.25in % 9 1/4" = 55.708125pc
+\totalheight = 24.39cm % 9 1/4" = 55.708125pc
+\topmargin = 6pc % Distance from top of page to baseline of text line 1
+\bottommargin = 6pc % Distance from last line to bottom of page.
+\topskip = 2pc % Distance from top of \box255 to baseline of text line 1
+% \vsize Distance from top of \box255 to last line of text.
+% \headmargin Distance from top of \box255 to top of page
+% We'll place the headline just above \box255
+
+\headmargin = \topmargin \advance \headmargin by -\topskip
+
+\vsize = \totalheight
+\advance \vsize by -\headmargin
+\advance \vsize by -\bottommargin
+% \vsize should now be 46.708125pc
+
+\voffset = -1in % align top of logical page with top of physical page
+\advance \voffset by \headmargin
+\ifcenterpage
+% \dimen0 = 11in
+ \dimen0 = 29cm
+ \advance\dimen0 by -\totalheight
+ \divide\dimen0 by 2
+ \advance\voffset by \dimen0
+\fi
+
+\topskip = 2pc % Distance from headline to first line of text.
+
+
+% Other formatting parameters.
+%
+% The basic increments we'll use in the layout.
+%
+\def\setskip#1 = #2 {%
+ \dimen0 = #2\baselineskip
+ \csname #1skipamount\endcsname =
+ \dimen0 plus .33\dimen0 minus .25\dimen0
+ \ignorespaces
+}
+\newskip\greaterskipamount
+\newskip\greatskipamount
+\newskip\biggerskipamount
+\newskip\medbigskipamount
+\newskip\medsmallskipamount
+\newskip\tinyskipamount
+
+\setskip greater = 2.5
+\setskip great = 2.0
+\setskip bigger = 1.5
+\setskip big = 1.0
+\setskip medbig = .75
+\setskip med = .5
+\setskip medsmall = .375
+\setskip small = .25
+\setskip tiny = .125
+
+\parindent = 1em
+\newdimen\normalindent \normalindent = \parindent
+
+\footnotemarkseparation = .16666em
+
+\abovelistskip = \smallskipamount
+\interitemskip = \tinyskipamount
+\belowlistskip = \smallskipamount
+\listleftindent = \parindent
+
+% Displays involve text and math. We don't want as much flexibility in
+% the glue as plain.tex sets.
+%
+\abovedisplayskip = \medsmallskipamount
+\abovedisplayshortskip = 0pt plus 2pt
+\belowdisplayskip = \medsmallskipamount
+\belowdisplayshortskip = \belowdisplayskip
+
+\newskip\intercapsuleskip \intercapsuleskip = .75\tinyskipamount plus 0.4pt
+\newdimen\capsulehangindent \capsulehangindent = 2pc
+
+\newskip\aboveconceptskip \aboveconceptskip = \bigskipamount
+
+
+\newskip\abovesectionskip \abovesectionskip = \greaterskipamount
+% No stretch or shrink below heads, according to A-W.
+\newskip\belowsectionskip \belowsectionskip = 1\biggerskipamount
+
+\newskip\abovesubsectionskip \abovesubsectionskip = \greatskipamount
+\newskip\belowsubsectionskip \belowsubsectionskip = 1\bigskipamount
+
+\newskip\abovedescriptionskip \abovedescriptionskip = \biggerskipamount
+\newskip\belowdescriptionskip \belowdescriptionskip = \medskipamount
+
+\newskip\explainskip \explainskip = \tinyskipamount
+\newskip\exampleskip \exampleskip = \smallskipamount
+
+\def\interexampleskip{\vskip\medsmallskipamount}
+\def\tinyskip{\vskip\tinyskipamount}
+
+% Space in which a symbol is shown in a columnated list of commands.
+\newdimen\symbolspace \symbolspace = 14pt
+
+% \colsindent is the indentation before material arranged in columns and
+% displayed, as in the list of Greek letters.
+\newskip\colsindent \colsindent = \parindent
+
+% The indentation for page lists in the index that don't fit on one line.
+\newdimen\indexpageindent \indexpageindent = 1pc
+
+% The indentation for subsidiary entries in the index. (Should be less
+% than \indexpageindent.)
+\newdimen\indexlevelindent \indexlevelindent = .5pc
+
+\newskip\codebaselineskip \codebaselineskip = \baselineskip
+
+% Fill the previous page with blank space before a command.
+%
+\def\cmdbreak{\par\nobreak\vfil\penalty 1000\vfilneg\par}
+
+% Penalties.
+%
+\newcount\conceptpenalty \conceptpenalty = -1500
+\newcount\intercmdnamepenalty \intercmdnamepenalty = 300
+\newcount\@intercmdnamepenalty \@intercmdnamepenalty = \intercmdnamepenalty
+
+
+
+% The output routine.
+%
+\output = {%
+ \onepageout
+ %
+ % Odd pages are right-hand pages.
+ %
+ % Note \pageno has been incremented when we get here -- it now refers
+ % to the page number of the page about to be typeset, not the page
+ % that we just shipped out.
+ %
+ \ifodd\pageno % \onepageout advances \pageno.
+ \global\hoffset = \oddoffset
+ \global\intercmdnamepenalty = 10000
+ \else
+ \global\hoffset = \evenoffset
+ \global\intercmdnamepenalty = \@intercmdnamepenalty
+ \fi
+}
+
+\ifdvi\else\output={%
+ \setbox0=\box255\deadcycles=0
+ \advancepageno
+ \global\advance \truepage by 1
+ \ifnum\outputpenalty>-20000\else \dosupereject \fi
+ }
+\fi
+
+\def\onepageout{%
+ \shipout\vbox{%
+ \offinterlineskip % The page should have vertically abutting boxes.
+ \ifodd\pageno
+ \cropmargin = \insidemargin
+ \else
+ \cropmargin = \outsidemargin
+ \fi
+ \addcropmarks % Does not affect the position.
+ \ifcenterpage \addtruepage \fi
+ %
+ \ifedgetabs \ifodd\pageno \ifnoheadline\else
+ \edgetabs % Does not affect the position.
+ \fi\fi\fi
+ %
+ \vbox to 0pt{\vskip-\headmargin \vskip-3.5pc
+ \rightline{\sevenrm\timestamp}\vss}%
+ %
+ \smash{\line{\the\headline}}% Simplified \makeheadline.
+ \pagebody
+ \vskip 2\normalbaselineskip
+ % The footline is needed on one page (for an example).
+ \line{\the\footline}%
+ }%
+ % Now the rest from \plainoutput:
+ \advancepageno
+ \global\advance\truepage by 1
+ \ifnum\outputpenalty>-20000\else \dosupereject \fi
+}
+
+\footline = {\hfil}
+
+% The headline always includes the name of the current chapter. This
+% goes on the inside. If more information, such as the concept we're
+% explaining, is included, it goes on the outside.
+%
+\headline = {%
+ % Produce the timestamp
+ \ifnoheadline
+ \hfil
+ \global\noheadlinefalse
+ \else
+ \let\\ = \ignorespaces
+ \ifodd \pageno % Right-hand page.
+ {\tenit \firstmark}\hfil {\tenbf \folio}%
+ \else % Left-hand page.
+ {\tenbf \folio}%
+ \hfil
+ {\tenit
+ \chaptername
+ \ifnum\pageno>0\ifback\else
+ \quad $\backslash$\quad\S\the\chapterno
+ \fi\fi
+ }%
+ \fi
+ \fi
+}
+
+% Sizes for cropmarks:
+%
+\newdimen\cropthick \cropthick = 0.4pt
+\newdimen\crophsize \crophsize = 1pc
+\newdimen\cropvsize \cropvsize = 1pc
+\newdimen\cropoffset \cropoffset = .0625in
+
+% Each of the following macros generates a quarter of a cropmark as
+% a zero-size box at the center point of the cropmark.
+% We want the cropmarks to be centered with respect to their thicknesses.
+
+\def\vcropdown {\hbox to 0pt{%
+ \kern -.5\cropthick
+ \vbox to 0pt{%
+ \vskip \cropoffset
+ \hrule width\cropthick depth\cropvsize height0pt
+ \vss}%
+ \kern -.5\cropthick}%
+}
+
+\def\vcropup {\hbox to 0pt{%
+ \kern -.5\cropthick
+ \vbox to 0pt{%
+ \vss
+ \hrule width\cropthick depth\cropvsize height0pt
+ \vskip \cropoffset}%
+ \kern -.5\cropthick}%
+}
+
+\def\hcropright{\rlap{\kern\cropoffset\smash{%
+ \vrule width\crophsize depth .5\cropthick height .5\cropthick}}}
+
+\def\hcropleft{\llap{\smash{%
+ \vrule width\crophsize depth .5\cropthick height .5\cropthick}%
+ \kern\cropoffset}}
+
+% \cropmargin will be set to the left margin on the current page.
+%
+\newdimen\cropmargin
+\def\cropline#1{\moveleft\cropmargin\hbox to \totalwidth{#1}}
+
+% \addcropmarks adds the cropmarks to a page while leaving everything else
+% alone. It assumes we're positioned at the top of the page.
+
+\def\addcropmarks{%
+ \vbox to 0pt{%
+ \offinterlineskip % contextually redundant but precautionary
+ \vskip -\headmargin % to get to logical top of page
+ \ifcenterpage
+ \cropline{\hcropleft\vcropup \hfil \vcropup\hcropright}
+ \else
+ \cropline{\hfil \vcropdown}%
+ \fi
+ \vskip\totalheight
+ \ifcenterpage
+ \cropline{\hcropleft\vcropdown \hfil \vcropdown\hcropright}%
+ \else
+ \cropline{\hcropright\hfil\hcropleft\vcropup\vcropdown\hcropright}%
+ \fi
+ \vss
+}}
+
+% \addtruepage adds a small page number near the upper right cropmark.
+%
+\newcount\truepage \truepage = 1
+\def\addtruepage{%
+ \vbox to 0pt{\vskip -\headmargin\vskip -2pc
+ \moveleft\cropmargin\hbox to \totalwidth{%
+ \twelvebf
+ \quad\TeX\ pour l'Impatient\hss
+ N\raise 3.3pt\hbox{o} \the\truepage\quad}%
+ \vss}%
+}
+
+
+% The mark information is output by \markinfo.
+%
+% We can use a different mark, e.g., a shorter heading, by calling
+% \changemark.
+%
+\newtoks\shortmark \shortmark = {}
+\newif\ifchangemark
+
+\def\markinfo#1{%
+ \ifchangemark
+ \mark{\the\shortmark}\changemarkfalse
+ \else
+ \mark{#1}%
+ \fi
+}
+
+\def\changemark#1{\shortmark = {#1}\changemarktrue}
+
+
+% ``Tabs'' down the side of the book.
+% Say \nextedgetab to move the thing down to the next.
+% Say \edgetabsfalse to turn them off.
+%
+\newcount\numtabs \numtabs = 7
+\newdimen\edgetabjump \edgetabjump = 0pt
+\def\nextedgetab{%
+ \advance\edgetabjump by \edgetabdepth
+}
+
+\def\settabdepth#1{%
+ \edgetabdepth = #1
+ \setbox\tabbox = \vbox to \edgetabdepth{%
+ \leaders
+ \vbox{\vskip \edgespacing
+ \hrule width\edgetabwidth height0pt depth\edgethick}%
+ \vfil}
+}
+
+\newskip\bigtab \newskip\smalltab
+\newskip\edgetabdepth
+\newbox\tabbox
+
+\bigtab = \totalheight \divide\bigtab by \numtabs
+\smalltab = .4\bigtab % five smalls make two bigs
+
+\newdimen\edgetabin \edgetabin = .25in
+\newdimen\edgetabbleed \edgetabbleed = .25in
+\newdimen\edgetabwidth
+ \edgetabwidth = \edgetabin
+ \advance \edgetabwidth by \edgetabbleed
+\newdimen\edgethick \edgethick = 1.2pt % line thickness
+\newdimen\edgespacing \edgespacing = .0pt % line spacing
+
+
+\def\edgetabs{\vbox to 0pt{%
+ \vskip-\headmargin
+ \vskip\edgetabjump
+ \hbox{%
+ \hskip \hsize
+ \hskip\outsidemargin
+ \hskip-\edgetabin
+ \copy\tabbox
+ }%
+ \vss
+}}
+
+
+% We can simplify \pagecontents (which is called by \pagebody) somewhat,
+% since we don't have \topinserts.
+%
+\def\pagecontents{%
+ \unvbox255 % The main page contents.
+ %
+ \ifvoid\footins\else % Footnotes are present.
+ \vskip\skip\footins
+ \footnoterule
+ \unvbox\footins
+ \fi
+}
+
+
+% The command chapters had a mini-index at the bottom of right-hand
+% pages. These definitions are the way to put entries into it.
+%
+% \minref generates a reference for the mini-index, and prints the
+% reference on the page, also.
+%
+\def\minref#1{%
+ #1% Print it on the page.
+ % That's it, now.
+}
+
+% Mini-index entry without printing the argument on the page.
+% Just ignore the argument now.
+%
+\def\minrefs#1{%
+ \ignorespaces
+}
+
+% This is used for producing the concept mini-index.
+%
+\def\minrefsdelim#1\endmark{\minrefs{#1}}
+
+% One last insertion-oriented thing:
+% we always want numbered footnotes, as defined in eplain.
+% We'll do them in 8-point type.
+%
+\let\@plainfootnote = \footnote
+\let\footnote = \numberedfootnote
+\everyfootnote = {\footnotefonts}
+
+
+% The \margin macro produces a marginal note at the same level as its call.
+% It should only be used in a paragraph or in the main vertical list.
+% It is nullified when we're printing the final copy.
+%
+\def\margin#1{%
+ \ifhmode
+ \vadjust{\printmarginnote{#1}}%
+ \else
+ \dimen0 = \prevdepth
+ \prevdepth = -1000pt
+ \printmarginnote{#1}%
+ \prevdepth = \dimen0
+ \fi
+ \ignorespaces
+}
+
+\def\printmarginnote#1{%
+ \hbox to 0pt{%
+ \hskip 1.1\hsize
+ \vbox to 0pt{%
+ \everypar = {}% Don't inherit hanging indentation.
+ \hsize = 1in \rightskip = 0pt plus 1fil \noindent \sevenrm
+ \let\tt = \eighttt
+ \parfillskip = 0pt plus 1fil
+ \baselineskip = 8pt #1%
+ \vss
+ }%
+ \hss
+ }%
+}
+
+%\iffinal
+\iftrue
+ \def\margin#1{\ignorespaces}
+\fi
+
+
+% Stuff to preserve page breaks inserted for the 2nd printing.
+% This macro takes one ``argument''.
+%
+\def\secondprinting{\afterassignment\finishsecondprinting \toks0 = }
+\def\finishsecondprinting{\the\toks0}
+
+
+
+% Parts of the book.
+%
+%
+% Chapters.
+%
+\let\chaptername = \empty
+\newcount\chapterno
+
+\def\chaprule{\vrule depth3\baselineskip height1.5pc width1pt}
+
+% Chapter openings should not have headlines.
+% The text of each chapter starts on a right-hand page in the final
+% book. The facing page has an illustration. This means that if the
+% previous chapter ended on a left-hand (i.e., even) page, we have to
+% eject an extra blank page.
+%
+\outer\def\chapter#1 \par{%
+ \ifcompletebook % Don't do the blank pages for proof copies.
+ \blankpage % the illustration page
+ % The first real chapter starts on page 1.
+ \ifnum\pageno < 0 \pageno = 1 \fi
+ \fi
+ %
+ \def\chaptername{ #1\Black}%
+ \advance\chapterno by 1
+ %
+ \setbox0 = \hbox{\Blue\chapternumeralfont
+ \kern1pt
+ \expandafter\kernchapno\the\chapterno\empty
+ \kern3pt}%
+ \vglue 0pt % But we get a \topskip of 2pc now.
+ \nointerlineskip
+ \leftline{%
+ \ifback\else
+ \vtop{%
+ \copy0
+ \vskip6pt
+ \hrule width\wd0 height2.2pc
+ }%
+ \kern 16pt
+ \fi
+ \chapterfonts % to get \baselineskip now
+ \chaprule
+ \kern 6pt
+ \vtop{%
+ \def\linebreak{\hfil\break}%
+ \noindent \chaptername}%
+ }%
+ \vskip 6pc plus.5pc minus.5pc
+ \noheadlinetrue
+ \toks0=\expandafter{\chaptername}
+ \edef\writechaptertoc{%
+ \noexpand\writenumberedtocentry{chapter}{\the\toks0}{\the\chapterno}%
+ }%
+ \writechaptertoc
+ %
+ % Use chaptername as first A-head (or only one).
+ \mark{\chaptername}%
+ \footnotenumber = 0 % Number footnotes from 1 in each chapter.
+ \beginit{CHAPTER}%
+ \noindent
+ \ignorespaces
+}
+
+\def\endchapter{%
+ \mark{\chaptername}% Use chapter name on last blank recto page
+ \vfil\eject % be sure everything's out before testing for recto
+ \ifodd\pageno
+ \message{Le chapitre se termine sur une page paire.}%
+ \blankpage
+ \fi
+ \endit{CHAPTER}%
+}
+%
+% \blankpage creates a blank page with no headline.
+% In the final book, it just advances the page number.
+% For the web edition, the blank pages serve no purpose except to keep
+% the indexing correct. I didn't want to rerun the index.
+%
+\def\blankpage{%
+ \iffinal
+ \advancepageno
+ \global \advance \truepage by 1
+ \else
+ \noheadlinetrue\pagebreak
+ \fi
+}
+
+% This hokey little macro kerns between the numerals in the chapter
+% number. We want to kern more between `11' then otherwise; also, we
+% want to remove the extra space before the chapter number, and after
+% `11'.
+%
+\def\kernchapno#1#2{%
+ \ifx\empty#2\else \kern-3pt \fi
+ #1%
+ \ifx\empty#2\else
+ \if1#2%
+ \kern-.1em
+ \else
+ \kern-.05em
+ \fi
+ \fi
+ #2%
+ \if 1#2\kern-.1em\fi
+}
+
+% Sections.
+%
+\newif\ifheading % Avoid breaking after a heading.
+
+% get section numbers for the fdl only, since it has internal references.
+\let\fdlkludge=\empty
+
+% The heading flag is turned on by headings and turned off
+% at the start of a description.
+%
+\outer\def\section#1 \par{%
+ \par % be sure we're in vertical mode
+ \saveskip = \lastskip % will be 0 if no skip
+ \cmdbreak
+ \combineskips\abovesectionskip
+ \dimen0 = 2.5\baselineskip \advance\dimen0 by -\topskip
+ \vskip -\dimen0
+ \vglue \dimen0
+ %
+ {\sectionfonts \leftline{\fdlkludge\Red #1\Black}}%
+ %
+ \markinfo{#1}%
+ \writetocentry{section}{#1}%
+ \nobreak
+ % Don't go into horizontal mode within the command descriptions.
+ %
+ \vskip\belowsectionskip
+ \ifcommands \else \noindent \fi
+ \headingtrue
+ \everypar = {\headingfalse \global\everypar = {}}%
+ % only gets executed for \par in horizontal mode
+ \ignorespaces
+}
+
+
+% Subsections. We don't want a break at the glue if we were preceded by
+% a \nobreak.
+%
+\def\subsection#1 \par{%
+ \par % be sure we're in vertical mode
+ \saveskip = \lastskip % will be 0 if no skip
+ \ifheading % Did we just have \section?
+ \nobreak
+ \fi
+ \combineskips\abovesubsectionskip
+ \dimen0 = 2.5\baselineskip \advance\dimen0 by -\topskip
+ \vskip -\dimen0
+ \vglue \dimen0
+ %
+ {\subsectionfonts
+ \leftline{\vrule width.5em height1.2ex depth.2ex \enspace \RawSienna #1\Black}}%
+ \writetocentry{subsection}{#1}%
+ \nobreak
+ % Don't go into horizontal mode within the command descriptions.
+ \vskip\belowsubsectionskip
+ \ifcommands \else \noindent \fi
+ \headingtrue
+ \everypar = {\headingfalse \global\everypar = {}}%
+ % only gets executed for \par in horizontal mode
+ \ignorespaces
+}
+
+% \combineskips combines the current skip (#1) with the previous skip
+% (which must be in \saveskip), and effectively skips by the larger of
+% the two.
+%
+\newskip\saveskip
+\def\combineskips#1{\ifdim\saveskip<#1\vskip-\saveskip \vskip#1\fi}
+
+
+
+% List macros.
+%
+
+% We want to use different names than eplain.
+%
+\let\ulist = \unorderedlist
+\let\endulist = \endunorderedlist
+%
+\let\olist = \numberedlist
+\let\endolist = \endnumberedlist
+
+\let\compact = \listcompact
+
+% The \noindent here keeps us from getting indentation on the first line.
+% It also makes the display into a `short' display, FYI.
+% The \belowdisplayskip and \abovedisplayskip glue are inserted by the
+% display.
+%
+\long\def\display#1{%
+ \ifvmode \noindent \fi
+ $$\vtop{\everypar = {}\hsize = \displaywidth
+ \parfillskip = 0pt plus 1fil % don't worry about widows
+ \noindent #1\par\global\savedepth = \prevdepth}$$%
+ \endgraf
+ \prevdepth = \savedepth
+}
+
+% \vdisplay is like \display, except it's for vertical mode material. Use it
+% to avoid an unwanted initial lineskip.
+%
+\long\def\vdisplay#1{%
+ \ifvmode \noindent \fi
+ $$\vtop{\everypar = {}\hsize = \displaywidth
+ \parfillskip = 0pt plus 1fil % don't worry about widows
+ #1\par\global\savedepth = \prevdepth}$$%
+ \endgraf
+ \prevdepth = \savedepth
+}
+
+
+
+% Indexing.
+% Derived from Knuth's manmac macros.
+%
+\newwrite\index
+
+\immediate\openout\index = \jobname.idx
+\newif\ifsilent
+
+% We need ^ to be active temporarily, while we define it.
+%
+{ \catcode`\^ = \active
+%
+\gdef^{%
+ \ifmmode
+ \let \nextaction = \sp
+ \else
+ \let \nextaction = \beginindexref
+ \begingroup
+ \catcode `| = \other \catcode `^ = \other
+ \fi
+ \nextaction
+}}
+
+\def\beginindexref{\futurelet\next\checksilence}
+
+{% And for here, we need ^ to be deactivated
+\catcode `^ = \other
+
+\gdef\checksilence{%
+ \if ^\next
+ \silenttrue \let\nextaction = \secondhat
+ \else
+ \silentfalse \let\nextaction = \checkbar
+ \fi
+ \nextaction
+}
+
+% Eat the `^' that we saw would be the next token.
+%
+\gdef\secondhat^{\checkbar}
+
+} % end scope where ^ is \other
+
+\def\checkbar{\futurelet\next\iswitch}
+
+% Here we start reading the text of the actual index entry;
+% we've determined whether it's silent or not.
+%
+% We handle the following cases:
+% ^{alpha} and ^^{alpha}
+% ^|alpha| and ^^|alpha|
+% ^|\alpha| and ^^|\alpha|
+%
+% When this is called, \next is either `|' or `{'.
+%
+\def\iswitch{%
+ \ifx |\next
+ \let \nextaction = \checkbackslash
+ \else
+ \let \nextaction = \normalidx
+ \fi
+ \nextaction
+}
+
+\def\checkbackslash|{%
+ % within |...| we allow anything (but another |)
+ \deactivate \catcode `\ = \other
+ \futurelet\next\litidx
+}
+
+% The thing after the ^ is a |. We have further checking to do -- is
+% the next character a \?
+%
+{ % reverse \ and /
+\catcode`\/ = 0
+\catcode`\\ = \other
+/gdef/litidx{%
+ /if \/next
+ /expandafter/litidxA
+ /else
+ /expandafter/litidxB
+ /fi
+}
+
+% The thing being indexed starts with a \.
+%
+/gdef/litidxA \#1|{%
+ /ctsidxref{#1}%
+ /litidxswitch{/\#1}%
+}
+
+% The thing being indexed is just a word.
+%
+/gdef/litidxB #1|{%
+ /ttidxref{#1}%
+ /litidxswitch{#1}%
+}
+}% end reversal of \ and /
+
+% The thing after the ^ is not a |.
+%
+\def\normalidx#1{%
+ \ifsilent
+ \aftergroup\ignorespaces
+ \else
+ #1%
+ \fi
+ \idxref{#1}%
+ \endgroup % group started by \iswitch.
+}
+
+\def\litidxswitch#1{%
+ \ifsilent
+ \aftergroup\ignorespaces
+ \else
+ {\tt #1}%
+ \fi
+ \endgroup % group started by \iswitch.
+}
+
+
+
+% Indexing macros for external use.
+
+% \idxref generates an index entry for #1. If #1 contains any control
+% sequences, they are treated literally.
+%
+\def\idxref#1{\indexwrite{#1}N\ignorespaces}
+
+
+% For creating an index entry for control space.
+{\catcode `\ =\other
+\gdef\blankidxref{\ctsidxref{ }}
+}
+
+% I removed this macro from eplain because \csname works as well, but
+% since the macros below are already written to use it ...
+\def\@tokstostring#1{\@ttsA#1 \@ttsmarkA}%
+\let\tokstostring=\@tokstostring
+\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{+}%
+\let\spacesub = \@spacesub
+%
+\def\@ifempty#1{\@@ifempty #1\@emptymarkA\@emptymarkB}%
+\def\@@ifempty#1#2\@emptymarkB{\ifx #1\@emptymarkA}%
+\def\@emptymarkA{\@emptymarkA}% Again, so \ifx won't complain.
+
+% #1 is the index term, #2 is the reference as in
+% Diacritical mark, see accent.
+
+\def\idxsee#1#2{%
+ \begingroup
+ \def\spacesub{\otherspace}%
+ \edef\nextaction{\write\index{\tokstostring{#1}::N::*\tokstostring{#2}}}%
+ \nextaction
+ \ignorespaces
+\endgroup}
+
+
+% \ttidxref generates an index entry for #1 in the program font.
+% If #1 contains any control sequences, they are treated literally.
+%
+\def\ttidxref#1{\indexwrite{#1}T\ignorespaces}
+
+
+% \ctsidxref generates an index entry for a control sequence. #1
+% should not have a preceding backslash, so that the proper call for
+% indexing \alpha is \ctsidxref{alpha}.
+%
+\def\ctsidxref #1{\indexwrite{#1}C\ignorespaces}
+
+% \indexchar is needed to generate index entries for three especially
+% difficult single characters: {, }, and \. They are blank-delimited.
+%
+\def\indexchar{\begingroup \deactivate \indexcharA}
+\def\indexcharA#1 {\indexwrite{#1}T\endgroup}
+
+% \pix indicates that the next index entry is a principal one.
+%
+\newif\ifpix
+\def\pix{\global\pixtrue}
+
+% \bix and \eix indicate that the next index entry begins or ends a
+% range of pages.
+%
+\newif\ifbix \def\bix{\bixtrue}
+\newif\ifeix \def\eix{\eixtrue}
+
+% #1 is the text of the entry, #2 is N (normal), T (typewriter) or
+% C (control sequence) or `cs' for now.
+%
+\def\indexwrite#1#2{\begingroup
+ \def\spacesub{\otherspace}%
+ \edef\tts{\tokstostring{#1}}%
+ \edef\nextaction{\write\index{\tts::#2::\noexpand\number\noexpand\pageno
+ \ifbix B\fi\ifeix E\fi\ifpix P\fi}}%
+ \nextaction
+ \global\pixfalse \global\bixfalse \global\eixfalse
+\endgroup}
+
+{\catcode `\^ = \other \gdef\twocarets{^^}}
+
+
+% For generating index entries with weird characters, we need to deactivate
+% them: { } blank \ and substitute [ ] ! for { } \ . \recat does this.
+% It should be enclosed in a group (which must end in `]').
+\def\recat{%
+ \aftergroup\ignorespaces
+ \catcode `\! = 0 \catcode `[ = 1 \catcode `] = 2
+ \catcode `\ = \other \deactivate
+}
+
+
+
+% Macros for the front matter.
+%
+% Space at the top of the frontmatter pages.
+%
+\def\sinkage{\vglue 7pc \relax}
+
+% And at the top of the backmatter pages.
+%
+\def\backsinkage{\vglue 2pc \relax}
+
+% \frontchapter doesn't care if we're on an even page or an odd page.
+%
+\def\frontchapter#1 \par{%
+ \def\chaptername{ #1}%
+ \leftline{%
+ \chapterfonts
+ \chaprule
+ \kern 6pt
+ \vtop{%
+ \def\linebreak{\hfil\break}%
+ \noindent \Blue\chaptername\Black}%
+ }%
+ \vskip 4pc
+ \noheadlinetrue
+ % Use chaptername as first A-head (or only one)
+ \mark{\chaptername}%
+ \noheadlinetrue
+ \noindent \ignorespaces
+}
+
+
+% We are called from inside a group, so we can redefine the \toc... macros.
+%
+\def\shortcontents{{%
+ \firsttoctrue
+ \backfalse
+ \shorttocfonts
+ \let\tocchapterentry = \shorttocchapter
+ \let\tocsectionentry = \gobblethree
+ \let\tocsubsectionentry = \gobblethree
+ \halign{\hfil\strut##&\strut ##\hfil\cr
+ \readtocfile
+ \crcr}}%
+ \pagebreak
+ \global\backfalse
+}
+
+% #1 is the chapter name, #2 the chapter number, #3 the page number.
+%
+\def\shorttocchapter#1#2#3{%
+ \ifback\else#2\quad $\backslash$\quad\fi&#1\qquad
+ \raise3pt\hbox{\vrule height2pt width4pt depth2pt}$\,\,$#3\cr
+}
+
+% Yes, we read the entire contents (several pages) as one alignment.
+%
+\def\contents{{%
+ \firsttoctrue
+ \backfalse
+ \tocfonts
+ \interlinepenalty = 100
+ \halign{\hfil\strut##&\strut ##\hfil\cr
+ \readtocfile
+ \crcr}}%
+ \pagebreak
+ % We want to end the contents on a recto page, even if it's blank
+ \ifodd\pageno\pagebreak\fi % leaves us on an even page.
+ \global\backfalse
+}
+
+\newif\iffirsttoc
+
+\def\tocchapterentry#1#2#3{%
+ \iffirsttoc
+ \global\firsttocfalse
+ \else
+ \noalign{\penalty-1000 \bigskip\smallskip}%
+ \fi
+ %
+ \ifback\else\bf#2\quad $\backslash$\quad\fi
+ &\bf#1\qquad\raise3pt\hbox{\vrule height2pt width4pt depth2pt}%
+ $\,\,$#3\cr
+ \noalign{\nobreak\vskip2pt}%
+}
+
+\def\tocsectionentry#1#2#3{%
+ \noalign{\penalty-500 \vskip\medsmallskipamount}%
+ &\it #1\quad \openbox$\,\,$\rm #3\cr
+}
+
+\def\tocsubsectionentry#1#2#3{%
+ &\qquad #1\quad $\cdot\,$#3\cr
+}
+
+\def\openbox{\ht0 = 1.75pt \dp0 = 1.75pt \wd0 = 3.5pt
+ \raise 2.75pt \makeblankbox{.2pt}{.2pt}%
+}
+
+\newif\ifback
+% \ifback is true when we're doing the table of contents and are about
+% to do the back matter. It is also true just before we do the back matter
+% chapters (really, only the index).
+%
+\def\backmatter{\write\tocfile{\noexpand\setback}\backtrue}
+\def\setback{\noalign{\bigskip\global\backtrue}}
+
+
+
+% Macros for the examples chapter.
+%
+% \doexamples is called with the name of the examples file
+% Each example is ended by ::: (including the last one)
+% A line starting with ~ is executed in the output (without the ~)
+% but dropped from the input.
+%
+% Within the input, ! is an escape character, but {} are not recognized.
+% This provides a limited control sequence capability, which is sufficient
+% for delimited macros and therefore for cross-references (see \xrefdelim).
+% !! stands for !.
+%
+\def\endmark{:::}
+
+\newif\ifnotatend \newif\ifnotatendfile \newif\iftildeline
+\newread\exfileA \newread\exfileB \newwrite\exfileC
+\newcount\examplenumber
+
+\def\doexamples#1{%
+ % Here we assume that two read-only openings of the same file are OK.
+ \immediate\openin\exfileA = #1
+ \immediate\openin\exfileB = #1
+ \loop
+ \advance\examplenumber by 1
+ \reader
+ \ifx\holder\empty \notatendfilefalse \else \notatendfiletrue \fi
+ \ifnotatendfile
+ \dooneexample
+ \repeat
+}
+
+
+% We want control sequences to be executed as the input of each example
+% is formatted, but we don't want to execute them for the output of each
+% example until we generate that output with an \input command.
+% Therefore, we treat ! differently for \holder, which produces example
+% input, and \holderA, which produces example output.
+%
+% We can't say \global\immediate\read, but \immediate is implied with \read.
+%
+\def\reader{{\deactivate
+ \catcode`\! = \other % To execute control sequences on \input.
+ \catcode`\^^M = 9 \global\read\exfileA to \holder
+ %
+ \catcode`\! = 0 % To execute control sequences right away.
+ \obeyspaces \global\read\exfileB to \holderA
+ }%
+}
+
+\def\dooneexample{{%
+ % We want to mention \! in one of the examples:
+ \edef\examplenum{\numbername\examplenumber}%
+
+ \immediate\openout\exfileC = \tempfile
+
+ \catcode`\| = \other % No literal code in these examples.
+ \chardef\! = `\! % !! means a literal ! character.
+
+
+ % Collect the input page, as it is to be printed, in a box
+ % At the same time, write out each line to \exfileC
+ % We make the box 0pt tall to avoid problems with overfull pages.
+ \setbox\xmpinput = \vbox to 0pt{%
+ %
+ \baselineskip = \codebaselineskip
+ \loop
+ \ifx\endmark\holder \notatendfalse \else\notatendtrue \fi
+ \ifnotatend
+ \expandafter\tildecheck\holder \empty \marker
+ \iftildeline\else
+ \leftline{\tt\frenchspacing \holderA \thinspace}%
+ \immediate\write\exfileC{\holder}%
+ \fi
+ \reader
+ \repeat
+ \vss % reduce height to 0pt
+ }% end \vtop
+
+ \immediate\closeout\exfileC
+
+ {%
+ \maxdepth = \maxdimen % allow long input
+ \vfill\eject
+ \catcode`\! = 0
+ \restoreplainTeX
+ {%
+ \let\eject = \relax \input\tempfile
+ % Every example ends with \bye, but \bye is disabled in the main text.
+ \vfill\par\penalty-10000
+ \global\footline = {\hfil}%
+ }%
+ \box\xmpinput
+ }%
+}}
+
+{
+ \catcode `\~ = \other % So the \ifx works.
+ \gdef\tildecheck#1#2\marker{%
+ \ifx #1~%
+ \immediate\write\exfileC {#2}\tildelinetrue
+ \else
+ \tildelinefalse
+ \fi
+ }
+}
+
+% This definition is more or less repeated verbatim in the first example
+% in xmptext.tex.
+%
+\def\xmpheader #1/#2{%
+ {\exampletitlefonts \leftline{Exemple #1~:\quad \bi#2}}%
+ \vglue .5\baselineskip
+ \count255 = \pageno
+ \xdef\examplepage{\number\count255}%
+ \markinfo{Exemple #1~: #2}
+ \ifrewritetocfile
+ \write\tocfile{\string\tocsectionentry{#2}{}{\examplepage}}%
+ \fi
+}
+% Let's number examples automatically; it makes it easier to move them
+% around and add new ones.
+
+\def\xmpnum{\number\examplenumber}
+
+\newbox\xmpinput
+
+
+% \negthin lets us put `\!' in examples.
+
+\def\negthin{\ifmmode \mskip-\thinmuskip \else \char`\\ \char`\! \fi}
+
+\def\xmpheaddef{voir \xref{xmphead}}
+
+\def\restoreplainTeX{%
+ % Restore plain TeX's parameters (except for \hsize and \hoffset).
+ \parindent = 20pt
+ \parskip = 0pt plus 1pt
+ \parfillskip = 0pt plus 1fil
+ \hfuzz = 0.1pt
+ \hbadness = 1000
+ \abovedisplayskip=12pt plus 3pt minus 9pt
+ \abovedisplayshortskip=0pt plus 3pt
+ \belowdisplayskip=12pt plus 3pt minus 9pt
+ \belowdisplayshortskip=7pt plus 3pt minus 4pt
+ \everymath = {}%
+ \everydisplay = {}%
+ \centereddisplays
+ \let\vfootnote = \@plainvfootnote
+ \let\footnote = \@plainfootnote
+ \let\tenrm = \oldtenrm
+ \textfont0 = \tenrm
+ \rm
+ \ignorespaces
+}%
+
+
+
+% Macros for the concepts chapter.
+%
+%
+% Start off the chapter.
+%
+\def\beginconcepts{\openout\conceptfile = \jobname.ccs }
+\def\endconcepts{\closeout\conceptfile}
+
+\newwrite\conceptfile
+
+% \concept produces a concept heading and also generates a crossreference
+% suitable for the mini-index. It even works for concepts with several words
+% or containing control sequences like `\ascii'.
+%
+\def\concept#1 \par{%
+ \par%\vfill\eject
+ %k \cmdbreak
+ \penalty\conceptpenalty\vskip\aboveconceptskip
+ %k \vskip 0pt plus 1pt % allow a little more stretch
+ \noindent
+ % generate the index entry
+ \ifconceptindex \else \global\indextoks = {\idxref{#1}}\fi
+ \conceptindexfalse
+ \pix\bix\the\indextoks
+ %
+ {\bt \let\it=\bti \unskip\null \RawSienna\bf #1.\Black\hskip1em plus.2em minus.2em }%
+ \markinfo{#1}%
+ \xrdef{#1}%
+ \write\conceptfile{\string\doconcept{#1}{\number\pageno}}%
+ \beginit{CONCEPT}%
+ \nobreak
+ \ignorespaces
+}
+
+\def\endconcept{%
+ \par % always go to vertical mode here
+ \eix\the\indextoks
+ \endit{CONCEPT}%
+ \ignorespaces
+}
+
+\def\doconcept#1#2{\hbox{#1\quad #2}}
+
+% Sometimes we want to index a concept under some other name than the
+% concept name, e.g., indexing `delimiter' as `delimiters'. The
+% \conceptindex macro lets us do this.
+%
+\newif\ifconceptindex
+\newtoks\indextoks
+\def\conceptindex#1{%
+ \conceptindextrue
+ \global\indextoks = {\idxref{#1}}%
+ \ignorespaces
+}
+
+
+% Commands for cross-referencing within the concepts chapter.
+% Each refterm has the form {a} or {a:b}, where b is the term to
+% actually reference (e.g., \refterm{\PlainTeX:\plainTeX}).
+%
+\def\refterm#1{%
+ \reftermA #1:\endmark % Parse the stuff.
+ \expandafter\minrefsdelim\termtoref\endmark
+ \relax % Cancel the \ignorespaces.
+}%
+\def\reftermA#1:{\reftermfirst{#1}\futurelet\next\reftermB}
+\def\reftermB#1\endmark{\ifx\endmark \next \else \reftermsecond#1\fi}
+
+\def\reftermfirst#1{#1\def\termtoref{#1}}
+\def\reftermsecond#1:{\def\termtoref{#1}}%
+
+% The defining sentence for a concept.
+%
+\def\defterm#1{{\it #1\/}}
+
+
+% This macro prints the single page that will go on the back cover.
+%
+\def\printconceptpage{%
+ % Make sure this is considered an odd page.
+ \ifodd\pageno\else\blankpage\fi
+ \noheadlinetrue
+ \advance\hsize by 2pc
+ \vglue2pc % Plus a \topskip of 2pc.
+ {\sectionfonts \leftline{Liste des concepts}}%
+ \vskip\belowsectionskip
+ {\conceptpagefonts
+ \parindent=0pt
+ \makecolumns 94/3:
+ \input \jobname.ccs
+ \vfil
+ % Put the `logo' at the bottom of the page.
+ \rightline{\thisbook}%
+ }%
+ \eject
+}
+
+
+
+% Macros for the commands chapters.
+%
+% \ifcommands is true when we're within \begindescriptions ...
+
+\newif\ifcommands
+
+
+% \begindescriptions should be called to start the actual control sequences.
+%
+\outer\def\begindescriptions{\beginit{DESCRIPTIONS}%
+ % The following definitions are local to this chapter.
+ %
+ \let\example = \commandexample
+ \let\endexample = \endcommandexample
+ \interlinepenalty = 50
+ %
+ \commandstrue
+ \ignorespaces
+}
+
+% The \endgroup that \enddescriptions does must come after the page
+% break, so the last page of descriptions will get a mini-index.
+%
+\def\enddescriptions{%
+ \vskip -\lastskip % undo the skip created by \enddesc
+ \endit{DESCRIPTIONS}%
+ \ignorespaces
+}
+
+
+% Begin or end the description of a control sequence or group thereof.
+%
+\def\begindesc{%
+ \par % force vertical mode
+ \saveskip = \lastskip % will be 0 if no skip
+ \ifheading % Did we just have \section or \subsection?
+ \nobreak
+ \else
+ \cmdbreak
+ \fi
+ \combineskips\abovedescriptionskip
+ \headingfalse
+ \beginit{DESCRIPTION}%
+ \beginit{COMMANDS}%
+ % Each command name is set as a paragraph (for reasons I don't
+ % remember, \leftline doesn't work because of the way the manuscript
+ % was typed), and so \clubpenalty will be the penalty at the
+ % interline glue (see p.96).
+ \clubpenalty = \intercmdnamepenalty
+ \parfillskip = 0pt plus 1fil
+ \ignorespaces
+}
+
+\def\enddesc{%
+ \nobreak % if we need a break, we'll get it from the next group opener
+ \vskip\belowdescriptionskip
+ \endit{DESCRIPTION}%
+ \ignorespaces
+}
+
+% Begin the explanation of a control sequence. Don't break at the
+% space above the explanation, or the interline glue before the first line.
+%
+\def\explain{%
+ \par
+ \endit{COMMANDS}%
+ \nobreak \vskip\explainskip
+ \interlinepenalty = 50
+ \nobreak \noindent
+ \ignorespaces
+}
+
+% Here is how \example looks in the text:
+% \example
+% ...
+% |
+% \produces
+% ...
+% \endexample
+%
+% repeated an indefinite number of times.
+%
+% We want to set the code of an example in a box so as to prevent it from
+% being broken across pages. By using \vtop we assure that the code is the
+% right distance from the `Example:' line. In order to keep the `produces:'
+% the right distance from the last code line, we save the depth of that code
+% line and then fool TeX into thinking that the \vtop has that depth by
+% assigning it to \prevdepth. If we didn't do this, the last line of the code
+% would be too close to the `produces:' (as indeed it was in earlier versions
+% of the book.
+%
+\newdimen\savedepth
+
+{\makeactive|
+\gdef\commandexample{% a.k.a. \example, inside \begindescriptions.
+ \cmdbreak\vskip\exampleskip
+ \leftline{\it Exemple~:}%
+ \nobreak % At the interline glue.
+ \beginit{EXAMPLE}%
+ \parfillskip = 0pt plus 1fil
+ \hbox\bgroup\hskip\parindent\vtop\bgroup
+ \begincs
+ \let | = \endcode
+ \advance\hsize by -\parindent
+ \parindent = 0pt
+ \bgroup\obeywhitespace
+}}%
+
+\def\endcode{%
+ \egroup % end \obeywhitespace group
+ \par\global\savedepth=\prevdepth
+ \egroup % end inner \vbox
+ \egroup % end outer \hbox
+ \prevdepth = \savedepth
+ \ignorespaces
+}
+
+% \dproduces should be used when the following material is a math
+% display.
+%
+\newif\ifexampledisplay
+\def\dproduces{\global\exampledisplaytrue \produces}
+
+\newif\ifproduces
+
+% \produces puts its material into a vbox so it won't be broken.
+% The material starts in VERTICAL MODE! It uses the plainTeX conventions
+% except that \parindent is 0pt.
+
+\def\produces{%
+ \producestrue
+ \ifodd\pageno \par \nobreak \else \cmdbreak\fi
+ \vskip\tinyskipamount
+ \noindent {\it produit\ifexamplelog\ dans la log\examplelogfalse\fi~:}%
+ \vadjust{\nobreak}% At the interline glue.
+ \ifexampledisplay
+ \centereddisplays
+ \else
+ \par\nobreak
+ \advance\hsize by -\parindent
+ \savedepth = \prevdepth
+ \nointerlineskip
+ \hbox\bgroup\hskip\normalindent
+ \vtop\bgroup \restoreplainTeX \parindent = 0pt
+ \prevdepth = \savedepth
+ \fi
+}%
+
+% we need another ``produces'' form for when a command puts things in
+% the log. In this case, the produces text also ends with a |.
+%
+\newif\ifexamplelog
+{\makeactive|
+\gdef\logproduces{\examplelogtrue\produces
+ \begincs
+ \def |{\endcode\producesfalse}%
+ % Every line is set as a paragraph, so we get one \parindent for free.
+ % But we also did \advance\leftskip in \produces, so now we have two.
+ % We only want one.
+ \advance\leftskip by -\parindent
+ \bgroup\obeywhitespace
+}}%
+
+\def\nextexample{\endexample\interexampleskip\example}
+
+\def\endcommandexample{%
+ \par % force vertical mode, set previous paragraph
+ \ifproduces \ifexampledisplay \global\exampledisplayfalse \else
+ \global\savedepth = \prevdepth
+ \egroup % Matches the \vtop in either the \produces or the \example.
+ \egroup % Matches the \hbox in \producesbox.
+ \global\producesfalse
+ \par
+ \prevdepth = \savedepth
+ \fi\fi
+ \endit{EXAMPLE}%
+ \ignorespaces
+}
+
+\def\see{%
+ \ifodd\pageno\nobreak\fi % don't put at the top of a verso page
+ \vskip -\lastskip % should be \belowdescriptionskip
+ \bigskip
+ \noindent
+ {\tenbi \spaceskip = 3.33pt plus 2pt minus 1.1pt
+ \parfillskip = 0pt plus 1fil
+ Voir aussi~: %k \hskip 1em plus .5em minus .25em
+ }%
+ \ignorespaces
+}%
+
+
+\newif\ifxref \xreftrue
+
+% \aux acts as a prefix to a \cts command, specifying that a
+% cross-reference should not be generated.
+%
+\def\aux{\xreffalse}
+
+% So does \easy, which prints a hand, pointing at the control sequence.
+% (The hand font doesn't define an em.)
+%
+\newif\ifeasy
+\let\easy = \easytrue
+\def\testeasy{\ifeasy\llap{\hand\ \kern 6pt}\easyfalse\fi}
+
+% \cts typesets the beginning of a control sequence description, and
+% generates an index entry and cross-reference definition for it. The
+% control sequence name must be delimited by a blank, since there may be
+% parameters that follow. The control sequence name can contain special
+% characters; they are deactivated. The initial \ must be omitted.
+%
+\def\cts{\begingroup \deactivate \ctsA}
+\def\ctsA#1 {\endgroup \ctsB{#1}}
+\def\ctsB#1#2{%
+ \ctsbasic{\\#1}{#2}%
+ \ifxref \ctsxrdef{#1}\else \xreftrue \fi
+ \pix\ctsidxref{#1}%
+}
+
+% \ctsx is like \cts, but separates the control sequence name and the
+% text by more space. (`x' for `extra')
+%
+\def\ctsx{\begingroup \deactivate \ctsxA}
+\def\ctsxA#1 {\endgroup \ctsxB{#1}}
+\def\ctsxB#1#2{%
+ \ctsbasic{\\#1}{\quad #2}%
+ \ifxref \ctsxrdef{#1}\else \xreftrue \fi
+ \pix\ctsidxref{#1}%
+}
+
+
+% \ctscol is like \cts, but doesn't start a new paragraph. It's used in
+% in columns of cs's and their explanations.
+%
+\def\ctscol#1 #2{%
+ {\bt \\#1}\quad #2%
+ \ifxref \ctsxrdef{#1}\else \xreftrue \fi
+ \pix\ctsidxref{#1}%
+}
+
+% \ctsbasic does the actual printing of a cs name. It's needed on its
+% own for `\ '. It does not generate any index or cross-reference
+% entries. #1 is the command name, #2 some (possibly empty) text to go
+% next to it.
+%
+\def\ctsbasic#1#2{%
+ \par
+ \nobreak % At the \parskip glue the \noindent will produce.
+ \noindent\testeasy {{\bt #1}\space #2}%
+}
+
+% \ctsxrdef generates a control sequence cross-reference definition.
+% For example, `\ctsxrdef{@star}' generates a cross-reference definition
+% for `\@star'.
+%
+\def\ctsxrdef#1{\expandafter\xrdef\csname#1\endcsname}
+
+% \ctsact prints an active character #1 and generates an index entry
+% for it. #1 is blank-delimited. \ctsact does not generate a
+% cross-reference definition.
+%
+\def\ctsact{\begingroup \deactivate \ctsactA}
+\def\ctsactA#1 {\endgroup
+ \ctsbasic{#1}{}%
+ \pix\ttidxref{#1}}
+
+% \ctspecial prints a control sequence #1 and generates an index
+% entry for it. #1 is blank-delimited. \ctspecial does not
+% automatically generate a cross-reference definition, and so it's used
+% for things like \newbox and \%.
+%
+\def\ctspecial{\begingroup \deactivate \ctspecialA}
+\def\ctspecialA#1 {\endgroup
+ \ctsbasic{\\#1}{}%
+ \pix\ctsidxref{#1}%
+}
+
+% \ctspecialx is like \ctspecial, but leaves more space after its
+% argument. We want ` and ' to come from cmtt, instead of Optima, so we
+% call \mapquotes before reading the argument. This only affects the \`
+% and \' descriptions.
+%
+\def\ctspecialx{\begingroup \deactivate \mapquotes \ctspecialxA}
+\def\ctspecialxA#1 {\endgroup
+ \ctsbasic{\\#1}{}\quad
+ \pix\ctsidxref{#1}%
+}
+
+% \ctsdisplay has a blank-delimited argument consisting of a control
+% sequence such as alpha. It produces $\alpha$ followed by \alpha.
+%
+\def\ctsdisplay#1 {\basicdisplay {$\csname #1\endcsname$}{\\#1}%
+ \ifxref\ctsxrdef{#1}\else\xreftrue\fi \pix\ctsidxref {#1}}
+
+% \ctsdoubledisplay has a blank-delimited argument consisting of a
+% control sequence such as bigvee. It produces $\bigvee$ and
+% $\big\bigvee$ followed by \bigvee.
+%
+\def\ctsdoubledisplay#1 {
+ {%
+ \symbolspace = 42pt
+ \basicdisplay{$\csname #1\endcsname\quad
+ \displaystyle\csname #1\endcsname$\ddstrut}%
+ {\\#1}%
+ }%
+ \ifxref\ctsxrdef{#1}\else\xreftrue\fi
+ \pix\ctsidxref{#1}%
+}
+\def\ddstrut{\vrule width0pt height15pt depth11pt}
+
+% \ctsydisplay displays a control symbol. #1 is a single character,
+% which may be active. #2 is the cross-reference label,
+% blank-delimited.
+%
+\def\ctsydisplay{\begingroup \deactivate\catcode`\|=\other \ctsydisplayA}
+\def\ctsydisplayA#1 #2 {\endgroup
+ \basicdisplay{$\csname\string#1\endcsname$}{\\#1}%
+ \ifxref \ctsxrdef{#2}\else \xreftrue \fi
+ \pix\ctsidxref{#1}%
+}
+
+% \actdisplay displays an active character. #1 is the character, and
+% #2 is the cross-reference label, blank-delimited.
+%
+\def\actdisplay{\begingroup\catcode `\|=\other\actdisplayA}
+\def\actdisplayA#1 #2 {\endgroup
+ \basicdisplay{$#1$}{\string#1}%
+ \ifxref \xrdef{#2}\else \xreftrue \fi
+ \pix\ttidxref{#1}%
+}
+
+% \basicdisplay does the actual typesetting of a control sequence name.
+% for inside displays.
+%
+\def\basicdisplay#1#2{\testeasy\hbox to \symbolspace{#1\hfil}{\bt #2}}
+
+% Printing parameter and table entry headings.
+%
+\def\param#1{\printparam{#1}{param\`etre}}
+\def\tblentry#1{\printparam{#1}{\'el\'ement de table}}
+\def\printparam#1#2{\hskip1.5em [\kern3pt \<#1> #2\kern2pt]}
+
+% Required braces.
+%
+\def\rqbraces#1{\{\hskip2pt#1\hskip2pt\}}
+
+% Printing rulers.
+%
+\def\1{\vrule height 0pt depth 2pt}
+\def\2{\vrule height 0pt depth 4pt}
+\def\3{\vrule height 0pt depth 6pt}
+\def\4{\vrule height 0pt depth 8pt}
+\def\ruler#1#2#3{{$\vcenter{\hrule\hbox{\4#1}}\,\,\rm#2\,{#3}$}}
+\def\doruler{\par \noindent\ruler}
+\def\tick#1{\hbox to .125in{\hfil#1}}
+\def\8{\tick\1\tick\2\tick\1\tick\3\tick\1\tick\2\tick\1\tick\4}
+
+% Macros for the capsule summary chapter.
+%
+\def\begincapsum{\beginit{CAPSULE SUMMARY}%
+ \let\bt = \tentt
+ \bigskip
+}
+
+\def\endcapsum{\endit{CAPSULE SUMMARY}}
+
+\newbox\@primitivebox \setbox\@primitivebox = \hbox{\tt *}
+\newif\ifcs
+
+\def\capline{\begingroup \deactivate\catcode `\| = \other \caplineA}
+\def\caplineA#1 {\endgroup
+ \begingroup
+ \catcode `@ = \letter % for constructing labels
+ \caplineB{#1}%
+}
+
+% Parameters of \caplineB:
+% #1 name of control sequence
+% #2 description
+% #3 * or empty
+% #4 xref or xref1:xref2 or empty
+
+\def\caplineB#1#2#3#4{%
+ \ifempty {#4}\temptrue\else\tempfalse\fi
+ % \iftemp needed to avoid \if ... \else ... \fi nesting problems
+ \ifcs
+ \toks0 = {\caplineout{\\#1}{#2}{#3}}%
+ \iftemp
+ \toks1 = \expandafter{\csname #1\endcsname}%
+ \else
+ \toks1 = {#4}%
+ \fi
+ \edef\nextaction{\the\toks0 {\the\toks1}}%
+ \nextaction
+ \ctsidxref {#1}%
+ \else
+ % The \space makes one-character entries line up nicely.
+ \caplineout{\space #1}{#2}{#3}{#4}%
+ \ttidxref {#1}%
+ \fi
+ \endgroup
+}
+
+\newif\iftemp
+
+
+% In a few cases we have two cross-references for a single control
+% sequence.
+%
+\newif\ifcstwo
+
+\def\capac{\cstwofalse\csfalse\capline}
+\def\capactwo{\cstwotrue\csfalse\capline}
+\def\capcs{\cstwofalse\cstrue\capline}
+\def\capcstwo{\cstwotrue\cstrue\capline}
+
+% \caplineout produces an output line (or several lines) for the capsule
+% summary. #1 is the command text, #2 is the description, #3 is either * or
+% empty, and #4 is the cross-reference label.
+%
+\def\caplineout#1#2#3#4{%
+ \setbox0 = \ifempty {#3}\box\voidb@x \else \copy\@primitivebox\fi
+ \vskip\intercapsuleskip
+ % If we use \vbox here, a multi-line summary at the top of a page
+ % will cause \topskip to disappear.
+ %
+ \vtop{\noindent \hangindent = \capsulehangindent
+ \spaceskip = 3.33pt plus 2pt minus 1.5pt
+ \rightskip = 0pt plus 4em % a little more stretch
+ \parfillskip = 0pt plus 1fil
+ \llap{\box0}{\bt #1}% Bold typewriter for the cs name.
+ \quad \hskip 0pt plus 1pt minus 1pt
+ #2\unskip\
+ (\ifcstwo \tworefs #4:\else \xref{#4}\fi)%
+ }%
+ \par
+}
+
+\def\tworefs#1:#2:{\xref{#1}, \xref{#2}}
+
+
+
+% Macros for printing the index.
+%
+% Set up to print it.
+%
+\def\beginindex{%
+ \doublecolumns
+ \beginit{THE INDEX}
+ \markinfo{\chaptername}%
+ \indexfonts
+ \parindent = 0pt
+ \def\pp##1{{\it ##1}} % Principal entry.
+ \def\c{,\thinspace\allowbreak}%
+% \def\ic{,\quad}
+ \def\ic{\quad}
+ \def\see##1{.\quad{\it Voir} ##1 }
+ \def\seealso##1{\hfil\break{\it Voir aussi} ##1 }
+ \let\r = \romannumeral
+
+ \raggedright
+}
+
+\def\endindex{\endit{THE INDEX}\singlecolumn}
+
+
+% #1 is the level of this index entry minus 1 (i.e., 0 for a main
+% entry), #2 is the index term, #3 is the kind of term
+% (T for ttfont, C for control sequence, N for normal), and
+% #4 is the list of pages. The page list can have \pp (principal
+% entry)in it, and each page is separated by \c.
+%
+\def\indexentry#1#2#3#4{%
+ \beginit{INDEX ENTRY}%
+ \leftskip = #1\indexpageindent
+ \par
+ \leavevmode
+ \hangindent = \indexlevelindent
+ \ifx #3T%
+ {\tt #2}% Typewriter.
+ \else \ifx #3C%
+ {\tt \llap{\\}#2}% Control sequence.
+ \else
+ % in normal entries, \b and \e enclose a group. ({ and } don't work.)
+ {\let \b = \bgroup \let \e = \egroup #2}%
+ \fi\fi
+ #4% The list of pages.
+ \par
+ \endit{INDEX ENTRY}%
+}
+
+% Nah, let's forget printing the initial.
+%
+\def\indexgroup#1{%
+ \bigskip
+}
+
+
+
+% Code formatting.
+%
+%
+% Turn off normally special characters.
+%
+\def\deactivate{%
+ \catcode`\\ = \other \catcode`\{ = \other \catcode`\} = \other
+ \catcode`\$ = \other \catcode`\& = \other \catcode`\# = \other
+ \catcode`\% = \other \catcode`\~ = \other \catcode`\^ = \other
+ \catcode`\_ = \other
+}
+
+% It is convenient to have |...| mean print the ... verbatim, except for !.
+% (But | should just be a vertical bar in math mode.) This should be
+% used only for inline code; returns inside |...| become spaces.
+%
+\catcode`\| = \active
+\def|{%
+ \ifmmode
+ \vert
+ \else
+ \begingroup
+ \obeyspaces
+ \begincs
+ \let| = \endgroup
+ \fi
+}
+
+% \csdisplay is similar, but it inserts glue before and after.
+% It also is ended by |, so we have to redefine that.
+%
+\def\csdisplay{%
+ \par
+ \nobreak % don't break above displays
+ \vskip\abovedisplayskip
+ \begingroup
+ \interlinepenalty = 10000
+ \obeywhitespace
+ \begincs
+ \def|{\endgroup\vskip\belowdisplayskip \noindent\ignorespaces}%
+}
+
+% \begincs does the setup for verbatim printing. It does not confine
+% its effects to a group.
+%
+\def\begincs{%
+ \hfuzz = \codefuzz
+ \parfillskip = 0pt plus 1fil
+ \parskip = 0pt % don't stretch interparagraph space within code displays
+ \catcode`\! = 0
+ \let\! = \exclam
+ \let\| = \verticalbar
+ \let\$ = $%
+ \let\. = \empty % Use !. to end a control sequence to be executed.
+ \def\-{\discretionary{-}{}{}}% but allow explicit discretionary hyphens
+ \tt \deactivate
+}
+
+
+\chardef\exclam = `\!
+\chardef\verticalbar = `\|
+
+% In math mode we want vertical bars and exclamation points to be
+% regular characters again.
+%
+\everymath = {\setmathchars}
+\everydisplay = {\setmathchars}
+\leftdisplays
+
+\def\setmathchars{%
+ \catcode`\| = \other \catcode`\! = \other
+ \let\{ = \lbrace \let\} = \rbrace
+}
+
+
+
+
+% Some miscellanous macros.
+%
+\def\anatomy{Anato\-mie de \TeX}
+\def\ascii{{\ninerm ASCII}}
+\def\asciichar#1{$\langle \rm #1\rangle$}
+\def\bblfile{fichier~{\tt .bbl}}
+\def\bblfiles{fichiers~{\tt .bbl}}
+\def\bibfile{fichier~{\tt .bib}}
+\def\bibfiles{fichiers~{\tt .bib}}
+\def\boite{bo\^\i te}
+\def\boites{bo\^\i tes}
+\def\bstfile{fichier~{\tt .bst}}
+\def\bstfiles{fichiers~{\tt .bst}}
+\def\didotpt{point did\^ot}
+\def\dvifile{fi\-chier~{\tt .dvi}}
+\def\dvifiles{fi\-chiers~{\tt .dvi}}
+\def\ecrire{\'ecrire} % pour le tri de l'index
+\def\editeur{\'editeur de texte} % pour le tri de l'index
+\def\elements{\'el\'ements} % pour le tri de l'index
+\def\elementextra{\'el\'ement extraordinaire} % pour le tri de l'index
+\def\enumerations{\'enum\'erations} % pour le tri de l'index
+\def\equations{\'equations} % pour le tri de l'index
+\def\etirement{\'etirement} % pour le tri de l'index
+\def\em{\thinspace {\rm em}}
+\def\emph#1{{\it #1}\itcorr} % Emphasize.
+\def\ftp{{\tt ftp}}
+\def\gffile{fichier~{\tt .gf}}
+\def\gffiles{fichiers~{\tt .gf}}
+\def\hand{{\handfont +}}
+\def\ifatest{{\tt \\if} test}
+\chardef\inches = "7D
+\def\knuth#1#2{#1 de \texbook\ et
+\def\tempa{#2}% Merci Joss !
+\ifx\tempa\empty\else
+#2
+\fi
+de la tra\-duc\-tion fran\-\c caise}
+\def\logfile{fichier~{\tt .log}}
+\let\Metafont = \MF
+\def\Mperiod.{$M$\kern-1.6pt.}
+\def\Mprimecomma,{$M'$\kern-3.5pt,}
+\def\Mprimeperiod.{$M'$\kern-2.5pt.}
+\def\mud{\thinspace {\rm mu}} % can't use \mu; it'a a Greek letter!
+\def\newTeX{nou\-veau \TeX}
+\def\oesophage{\oe sophage}
+\def\p{p.\thinspace}
+\def\pkfile{fichier~{\tt .pk}}
+\def\pkfiles{fichiers~{\tt .pk}}
+\def\plainTeX{plain \TeX}
+\def\PlainTeX{Plain \TeX}
+\def\pp{p\p}
+\def\pt{\thinspace {\rm pt}}
+\def\pxlfile{fichier~{\tt .pxl}}
+\def\pxlfiles{fichiers~{\tt .pxl}}
+\def\tequiv{\unskip $\>\equiv\>$} % equivalence in text
+\def\texbook{{\sl The \TeX book}\itcorr}
+\let\tex@ = \TeX
+\def\TeX{\tex@\null}
+\def\TeXMeX{\TeX\ M\kern-.11em\lower .5ex\hbox{E}\kern-.125em X\null}%
+\def\tfmfile{fichier~{\tt .tfm}}
+\def\tfmfiles{fichiers~{\tt .tfm}}
+\def\thisbook{{\sl\TeX\ pour l'Impatient\/}}
+\let\ths = \thinspace
+\def\tminus{\unskip\allowbreak $\>-\>$\allowbreak} % minus in text
+\def\tplus{\unskip\allowbreak $\>+\>$\allowbreak} % plus in text
+\def\TUG{\TeX{} Users Group}
+\def\Vcomma,{$V$\kern-2pt,}
+\def\visiblespace{{\tentt \char'040}}
+\def\Vperiod.{$V$\kern-2pt.}
+\let\vs=\visiblespace
+\def\xrefpg#1{page~\xrefn{#1}}
+
+% \tighten attempts to shorten the number of lines occupied by a paragraph.
+\def\tighten{\looseness=-1
+ \spaceskip = .9\fontdimen2\font plus \fontdimen3\font
+ minus 1.1\fontdimen4\font
+}
+
+% \itcorr can be used at the end of a macro that puts its argument in
+% italics in order to produce an italic correction just when it's needed.
+% It won't look inside a following macro call, however.
+
+\def\itcorr{\futurelet\next\itcorrA}
+\def\itcorrA{\ifx.\next\else\ifx,\next\else\/\fi\fi}
+
+
+% Arrange N items in three columns.
+% A right brace is needed at the end of the list to match the \bgroup.
+%
+\def\threecolumns{\nobreak\vskip\abovedisplayskip\dothreecolumns}
+
+\def\dothreecolumns#1 {\bgroup
+ \parindent = 0pt
+ \makecolumns #1/3:
+}
+
+% We don't want to make < an active character because then it cannot be used
+% in \ifnum tests. So, \<foo> denotes a nonterminal `foo'.
+%
+\def\<#1>{$\langle${\rm\it \kern-.2pt #1\kern.65pt}$\rangle$}
+
+\let\beginit = \environment
+\let\endit = \endenvironment
+
+\def\eatpar#1\par{}
+
+% \needspace breaks out the page if there's less than #1 left on it.
+
+\def\needspace#1{%
+ \saveskip = \lastskip
+ \par % force vertical mode
+ \vfil
+ \penalty 1000
+ \vskip #1
+ \penalty9999
+ \par % exercise the page builder
+ \vskip -#1 plus -1fil
+ \vskip -\saveskip \vskip \saveskip % to restore \lastskip
+}
+
+
+
+
+% Expanded cross-referencing for various parts of the books.
+%
+
+% Sometimes it is clearer to refer to a cross-reference as a control
+% sequence.
+%
+\def\ctsref{\begingroup \catcode`\@ = \letter \@ctsref}
+\def\@ctsref#1{(\xref{#1})\endgroup}
+
+\def\xrefdelim[#1]{page~\xrefn{#1}} % this form doesn't need braces
+
+% This command comes at the beginning of chapters, after the \chapter
+% command and before the text. Hence the \par in the template
+% and the \noindent
+%
+\def\chapterdef#1#2\par{%
+ \@writeaux{%
+ \string\gdef\expandafter\string
+ \csname#1_C\endcsname{\the\chapterno}}%
+ \noindent
+}
+
+\def\chapternum#1{%
+ \def\csn{#1_C}%
+ \expandafter\ifx\csname\csn\endcsname \relax
+ \expandafter\def\csname\csn\endcsname{`#1'}%
+ \ifxrefwarning
+ \message{Chapitre `#1' indéfini.}%
+ \fi
+ \fi
+ \csname\csn\endcsname
+}
+
+\def\chapterref#1{section~\chapternum{#1}}
+
+\def\headcit#1#2{``{\rm #1}'' (\xref{#2})}
+
+\def\conceptcit#1{\headcit{#1}{#1}}
+
+\def\seeconcept#1{(voir ``{\rm #1}'', \xref{#1})}
+
+%\def\seeheadcon#1#2{(voir ``{\rm #1}'', \xref{#2})}
+
+
+
+
+% Special types of pictures.
+%
+% Glue pictures:
+%
+\newdimen\glueboxwidth
+\newdimen\boxdepth \boxdepth = 3.5pc
+\newskip\underlabel \underlabel= .1\boxdepth % space under `width n'.
+\def\squeezeglue{\glueboxwidth = .725\glueboxwidth}
+
+\def\labelledbox#1 #2 #3{\vtop{%
+ \hrule
+ \hbox{%
+ \vrule
+ \hbox to #1{\hfil \vbox to #2{\vfil#3\vskip\underlabel}\hfil}%
+ \vrule
+ }%
+ \hrule
+}}%
+
+% Make a picture of a box.
+%
+\def\picbox#1 {%
+ \glueboxwidth = #1pc \squeezeglue
+ \vtop{%
+ \hbox to \glueboxwidth{\strut \hfil {\it box}\hfil}%
+ \labelledbox % Have to have spaces after the arguments.
+ {\glueboxwidth}
+ {\boxdepth}
+ {\halign{\hfil##\hfil\cr width #1\cr}}%
+ }%
+}
+
+% And of glue.
+%
+\def\gluebox#1 #2 #3 #4 {\vtop{%
+ \glueboxwidth = #4pc \squeezeglue
+ \hbox to \glueboxwidth{\strut \hfil {\it glue}\hfil}%
+ \nointerlineskip
+ \kern2pt % to move the brace down a bit
+ \hbox{$\overbrace{\hbox{\hskip\glueboxwidth}}$}%
+ \kern-3pt % The \overbrace puts in 3pt below itself.
+ \nointerlineskip
+ \vbox to \boxdepth{%
+ \hsize = \glueboxwidth
+ \vskip 2pt
+ \advance\baselineskip by -2pt
+ \centerline{\strut size #1}%
+ \centerline{stretch #2}%
+ \centerline{shrink #3}%
+ \centerline{width #4}%
+ \vss
+ }%
+ \kern 1.5pt % I don't know why this is needed.
+ \nointerlineskip
+ \hbox{$\underbrace{\hbox{\hskip\glueboxwidth}}$}%
+}}
+
+\def\gluepicture#1 #2{{\ninerm
+ \medskip
+ \vtop{%
+ \setbox0 = \hbox{#2}% The glue and box pictures.
+ \glueboxwidth = \wd0
+ \leftline{\box0}%
+ \kern 6pt
+ \hbox to \glueboxwidth{\leftarrowfill{ width #1 }\rightarrowfill}%
+ }%
+ \medskip
+}}
+
+% Box pictures.
+%
+% Set up a `reference point' and the macro for a labelled height, for use
+% in forming pictures of boxes.
+%
+\newbox\refpoint
+
+\setbox\refpoint = \vbox to 0pt{%
+ \kern-2.6pt
+ \hbox to 0pt{\kern-2.2pt $\bullet$\hss}
+ \vss
+}%
+
+\def\labelledheight#1#2{%
+\vtop to #1{\offinterlineskip
+ \setbox0=\hbox{#2}\skip0=\wd0
+ \hbox to \skip0{\hss\tenex\char"78\hss}\kern-4pt
+ {\cleaders\hbox to \skip0{\hss\tenex\char"3F\hss}\vfil}%
+ \vskip1pt\box0\vskip1pt
+ {\cleaders\hbox to \skip0{\hss\tenex\char"3F\hss}\vfil}%
+ \kern -6pt\boxmaxdepth 0pt\hbox to \skip0{\hss\tenex\char"79\hss}}}
+
+
+
+% Paul's updates -- no longer needed; we have converged.
+%
+%\input paulmacs
+
+% Read the cross-reference definitions.
+%
+\readauxfile
+
+\catcode`\@ = \other % Make @ an `other' character again.
+\catcode`\^ = \active % Make ^'s do indexing outside of math mode.
\def\np{\vfill\eject} \ No newline at end of file