\tracingpages=1 % TEMPORARY! % Macros for `Concrete Mathematics' \ifx\gkpmac\fmtversion\endinput\else\let\gkpmac=\fmtversion\fi % Fonts for regular text \font\textrm=ccr10 % roman \font\textit=ccti10 % italic (emphasis) \font\textsl=ccsl10 % slanted (titles) \font\textbf=cmbx10 % bold \font\textcsc=cccsc10 % caps and small caps \font\oldsty=ccmi10 % equation numbers \font\twelvett=cmtt12 % Fonts for regular math % I'm setting \fontdimen2 to zero because AMS forgot to do it; % they may have fixed the problem in the meantime, but no harm is done \font\mathtext=ccr10 \font\mathsubtext=ccr7 \font\mathsubsubtext=ccr5 \font\mathlet=eurm10 \fontdimen2\mathlet=0pt \font\mathsublet=eurm7 \fontdimen2\mathsublet=0pt \font\mathsubsublet=eurm5 \fontdimen2\mathsubsublet=0pt \skewchar\mathlet='177 \skewchar\mathsublet='177 \skewchar\mathsubsublet='177 \font\mathsym=cmsy10 \font\mathsubsym=cmsy7 \font\mathsubsubsym=cmsy5 \skewchar\mathsym='60 \skewchar\mathsubsym='60 \skewchar\mathsubsubsym='60 \font\mathext=cmex10 \font\mathsubext=cmex10 \font\mathsubsubext=cmex10 \font\mathscr=euxm10\fontdimen2\mathscr=0pt \font\mathsubscr=euxm7 \fontdimen2\mathsubscr=0pt \font\mathsubsubscr=euxm5 \fontdimen2\mathsubsubscr=0pt \skewchar\mathscr='60 \skewchar\mathsubscr='60 \skewchar\mathsubsubscr='60 \font\mathfr=eufm10\fontdimen2\mathfr=0pt \font\mathsubfr=eufm7 \fontdimen2\mathsubfr=0pt \font\mathsubsubfr=eufm5 \fontdimen2\mathsubsubfr=0pt \font\matheuex=euex10\fontdimen2\matheuex=0pt \font\eulerbf=eurb10 \fontdimen2\eulerbf=0pt % not hooked in to these macros % Fonts for graffiti \font\gtext=ccslc9 \font\goldstyle=ccmic9 \fontdimen3\gtext=0pt \fontdimen4\gtext=0pt % no stretch or shrink \font\gmathtext=ccr9 \font\gmathsubtext=ccr6 \font\gmathsubsubtext=ccr5 \font\gmathlet=eurm10 scaled 900 \fontdimen2\gmathlet=0pt \font\gmathsublet=eurm7 scaled 857 \fontdimen2\gmathsublet=0pt \font\gmathsubsublet=eurm5 \fontdimen2\gmathsubsublet=0pt \skewchar\gmathlet='177 \skewchar\gmathsublet='177 \skewchar\gmathsubsublet='177 \font\gmathsym=cmsy9 \font\gmathsubsym=cmsy6 \font\gmathsubsubsym=cmsy5 \skewchar\gmathsym='60 \skewchar\gmathsubsym='60 \skewchar\gmathsubsubsym='60 \font\gmathext=cmex9 \font\gmathsubext=cmex9 \font\gmathsubsubext=cmex9 \font\gmathscr=euxm10 scaled 900 \fontdimen2\gmathscr=0pt \font\gmathsubscr=euxm7 scaled 857 \fontdimen2\gmathsubscr=0pt \font\gmathsubsubscr=euxm5 \fontdimen2\gmathsubsubscr=0pt \skewchar\gmathscr='60 \skewchar\gmathsubscr='60 \skewchar\gmathsubsubscr='60 \font\gmathfr=eufm10 scaled 900 \fontdimen2\gmathfr=0pt \font\gmathsubfr=eufm7 scaled 857 \fontdimen2\gmathsubfr=0pt \font\gmathsubsubfr=eufm5 \fontdimen2\gmathsubsubfr=0pt \font\gmatheuex=euex9 \fontdimen2\gmatheuex=0pt % Fonts for headings, etc. \font\chapfont=cmbxcd10 scaled 8000 \font\title=cmbx10 scaled \magstep5 \font\subtitle=cmbx10 scaled 1315 % that's magstep 1.5 \font\subsubtitle=cmbxsl10 \font\runhead=cmbx9 \font\foliofont=cmr9 \font\gtfont=cmmi9 % for the \t accent \font\ninesl=ccsl9 % used in the index only % Normal text conventions \catcode`@=11 % borrow the private macros of PLAIN (with care) \def\wlog#1{} % don't put allocation info into the log \hsize=28pc \vsize=45.25pc \parindent=20pt \baselineskip=13pt \let\sc=\textcsc \let\bf=\textbf \def\textindent#1{\noindent\hbox to\parindent{\bf#1\hfil}\ignorespaces} \def\exitem{\hangindent2\parindent \textindent} \textfont0=\mathtext \scriptfont0=\mathsubtext \scriptscriptfont0=\mathsubsubtext \textfont1=\mathlet \let\tfont=\teni \scriptfont1=\mathsublet \scriptscriptfont1=\mathsubsublet \textfont2=\mathsym \scriptfont2=\mathsubsym \scriptscriptfont2=\mathsubsubsym \textfont3=\mathext \scriptfont3=\mathsubext \scriptscriptfont3=\mathsubsubext \def\rm{\fam\z@\textrm} \def\it{\fam\itfam\textit} % \it is family 4, defined in PLAIN \def\sl{\textsl} \textfont\itfam=\textit \newfam\scrfam \ifnum\scrfam=8\relax\else\error\fi % family 8, script \textfont\scrfam=\mathscr \scriptfont\scrfam=\mathsubscr \scriptscriptfont\scrfam=\mathsubsubscr \def\scr{\fam8 } \mathcode`0="7130 \mathcode`1="7131 \mathcode`2="7132 \mathcode`3="7133 \mathcode`4="7134 \mathcode`5="7135 \mathcode`6="7136 \mathcode`7="7137 \mathcode`8="7138 \mathcode`9="7139 \newfam\frfam % family 9, fraktur \textfont\frfam=\mathfr \scriptfont\frfam=\mathsubfr \scriptscriptfont\frfam=\mathsubsubfr \def\frak{\fam9 } \newfam\euexfam % family 10, substitions for euler symbols \newfam\eqfam % family 11, cmr equal signs for Relbar (!) \font\teneq=cmr10 \textfont\eqfam=\teneq \font\nineeq=cmr9 % I'm not using Relbar except in 9&10pt, so this family is very incomplete... \mathchardef\intop="1A52 \mathchardef\ointop="1A48 \mathchardef\coprod="1A60 \mathchardef\prod="1A51 \mathchardef\sum="1A50 \mathchardef\braceld="A7A \mathchardef\bracerd="A7B \mathchardef\bracelu="A7C \mathchardef\braceru="A7D \mathchardef\infty="0A31 \mathchardef\nearrow="3A25 \mathchardef\searrow="3A26 \mathchardef\nwarrow="3A2D \mathchardef\swarrow="3A2E \mathchardef\Leftrightarrow="3A2C \mathchardef\Leftarrow="3A28 \mathchardef\Rightarrow="3A29 \mathchardef\leftrightarrow="3A24 \mathcode`\^^W="3A24 \mathchardef\leftarrow="3A20 \let\gets=\leftarrow \mathcode`\^^X="3A20 \mathchardef\rightarrow="3A21 \let\to=\rightarrow \mathcode`\^^Y="3A21 \def\uparrow{\delimiter"3A22378 } \mathcode`\^^K="3A22 \def\downarrow{\delimiter"3A23379 } \mathcode`\^^A="3A23 \def\updownarrow{\delimiter"3A6C33F } \def\Uparrow{\delimiter"3A2A37E } \def\Downarrow{\delimiter"3A2B37F } \def\Updownarrow{\delimiter"3A6D377 } \mathchardef\leftharpoonup="3A18 \mathchardef\leftharpoondown="3A19 \mathchardef\rightharpoonup="3A1A \mathchardef\rightharpoondown="3A1B \textfont\euexfam=\matheuex \scriptfont\euexfam=\mathsubsym % this is OK since I don't use all characters % of euex in subscripts/superscripts; otherwise I'd have to make euex7 and euex6 \scriptscriptfont\euexfam=\mathsubsym % only for \mathchoice, not really chosen \mathcode`+="292B \mathcode`-="292D \mathcode`!="0921 \mathcode`(="4928 \delcode`(="928300 \mathcode`)="5929 \delcode`)="929301 \mathcode`[="495B \delcode`[="95B302 \mathcode`]="595D \delcode`]="95D303 \mathcode`=="393D \mathchardef\Relbar="3B3D % we need the old = to match \Arrows \mathchardef\Gamma="7100 \mathchardef\Delta="7101 \mathchardef\Theta="7102 \mathchardef\Lambda="7103 \mathchardef\Xi="7104 \mathchardef\Pi="7105 \mathchardef\Sigma="7106 \mathchardef\Upsilon="7107 \mathchardef\Phi="7108 \mathchardef\Psi="7109 \mathchardef\Omega="710A \let\varsigma=\sigma \let\varrho=\rho % Euler doesn't have these \mathchardef\aleph="0840 \def\rbrace{\delimiter"5867A09 } \let\}=\rbrace \def\lbrace{\delimiter"4866A08 } \let\{=\lbrace %\mathchardef\equiv="3811 \let\cong=\equiv % lowres bars weren't spaced right \mathchardef\leq="3814 \let\le=\leq \mathchardef\geq="3815 \let\ge=\geq \mathchardef\Re="083C \mathchardef\Im="083D \def\vert{\delimiter"86A30C } \def\backslash{\delimiter"86E30F } \setbox\strutbox=\hbox{\vrule height9pt depth4pt width\z@}% \newbox\bigstrutbox \newbox\biggstrutbox \setbox\bigstrutbox=\hbox{\vrule height11pt depth4pt width\z@}% \def\bigstrut{\relax\ifmmode\copy\bigstrutbox\else\unhcopy\bigstrutbox\fi} \setbox\biggstrutbox=\hbox{\vrule height17pt depth10pt width\z@}% \def\biggstrut{\relax\ifmmode\copy\biggstrutbox\else\unhcopy\biggstrutbox\fi} \rm \newmuskip\normalthick \normalthick=5mu plus 5mu \newmuskip\normalmedmu \normalmedmu=\medmuskip \newmuskip\displaythick \displaythick=10mu minus 3mu \everymath{\thickmuskip=\normalthick} \abovedisplayskip=8pt plus 3pt minus 2pt % there's 2pt more (opened up) \belowdisplayskip=10pt plus 3pt minus 2pt % displays not centered; all have capability of \eqalign \outer\def\begindisplay{\obeylines\startdisplay} {\obeylines\gdef\startdisplay#1 {\catcode`\^^M=5$$% \advance\displayindent\parindent\advance\displaywidth-\parindent% \openup2pt #1\halign\bgroup\span\preamble\cr}} \outer\def\enddisplay{\crcr\egroup$$} \jot=\z@ % we do our own opening up \def\displaymath{$\thickmuskip=\displaythick\displaystyle} \def\preamble{\hfil\displaymath{##}$&&\displaymath{{}##}$\hfil} \def\tablepreamble{\bigstrut\hfil$##$\hfil\ &\vrule##&&\quad\hfil$##$\hfil} \def\xbox{\qquad\hbox} % for third column of explanation \newcount\eqcount \def\equ(#1.#2){{\rm({\oldsty#1}.{\oldsty#2})}} \def\eq(#1){\equ(\chapno.#1)} \def\thiseq{\xdef\next{(\chapno.\number\eqcount)}\expandafter\equ\next} \def\eqno{\global\advance\eqcount 1 \global\everycr{\makeeqno\thiseq}} \newdimen\backup \def\makeeqno#1{\noalign{\global\everycr{}% \advance\displaywidth\displayindent \setbox0=\hbox to\displaywidth{\hfil#1}% \backup=\prevdepth \advance\backup\ht0 \setbox0=\vbox{\kern-\backup\box0}\ht0=\z@ \dp0=\z@ \setbox0=\vbox{\box0}\unvbox0}} % that puts equation number on prev line! \newif\iftitle \newskip\chaptopspace \chaptopspace=1in minus 5pt \def\beginchapter#1 #2 \par{ % we should be at top of a page \titletrue \eqcount=0 \ifodd\pageno \rightline{\chapfont#1\kern-.05em} \vskip\chaptopspace \rightline{\title#2} \moveleft7pc % this applies to the \vbox after the \fi \else % left-hand page \leftline{\kern-.05em\chapfont#1} \vskip\chaptopspace \leftline{\title#2} \fi \vbox{\hrule width 35pc} \def\chapno{#1} \edef\chaptitle{#2} \mark{#1\enspace #2} \smallskip\noindent} \def\beginsection#1 #2 \par{ % should not be first in the chapter \backup=\lastskip % but should come on first or second page of chapter \mark{#1\enspace #2} % because the mark gives running head on right page \nobreak\vskip-\backup\penalty-200 {\subtitle\baselineskip=34pt \noindent\hbox to2\parindent{#1\hfil}\uppercase{\kern-.05em#2}\par} \nobreak\vskip5pt\noindent\hbox to2\parindent{}} \newcount\excount \def\beginexercises{\backup=\lastskip \excount=0 \mark{\chapno\enspace Exercises} \nobreak\vskip-\backup\penalty-200 {\subtitle\baselineskip=34pt\noindent Exercises\par}\nobreak} {\catcode`\|=\active \gdef\table#1\tabref|#2|{\hrule height1pt width\hsize \kern2pt \noindent\strut{\bf Table |#2|\enspace}#1\par \hrule height.5pt width\hsize\tabref|#2|}} \def\medbr{\ifnum\lastpenalty>9999 \medskip \else\medbreak\fi} \def\subhead#1\par{\medbr {\subsubtitle\noindent#1\par}\nobreak} \def\ex:{\par{\advance\medskipamount-1pt\medbr}% \advance\excount 1 \item{\number\excount}} \def\dash---{\thinspace---\hskip.16667em\relax} \def\qback{\kern-.15em} % between , or . and '' \def\undertext#1{$\underline{\smash{\hbox{#1}}}$} \def\newline{\hfil\break} \def\Hint:{{\it Hint:\/}} \let\macron=\= % we will use \= for congruence relation \def\t#1{{\edef\next{\the\font}\tfont\accent"7F\next#1}} % Here's a definition that was corrected in plain.tex version 3.14159; % I'm keeping the old version here, because I had already been compensating % for its deficiencies in script and scriptscript styles; without this % buggy version, it would be hard for me to match the old pages precisely \def\bmod{\mskip-\medmuskip\mkern5mu \mathbin{\rm mod}\penalty900\mkern5mu\mskip-\medmuskip} % Graffiti macros \chardef\other=12 \newread\grfi \openin\grfi=\jobname.grf %\newwrite\grfo \immediate\openout\grfo=\jobname.grf % let's hope no conflict %% Hmmm...; that doesn't work on Unix. %% Here's my first solution, a kludge where I alternated between .grf and .gr %\newif\ifgrf \newwrite\grfo \newwrite\grfempty %\ifeof\grfi \grffalse %\else\read\grfi to\grfitest \ifeof\grfi \grffalse \else \grftrue \fi\fi %\ifgrf\else \openin\grfi=\jobname.gr % \ifeof\grfi\else\read\grfi to\grfitest \fi\fi %\immediate\openout\grfo=\jobname.gr\ifgrf\else f\fi %\immediate\write\grfo{} % an empty line will start a nonempty file (Unix only) %% and then at the end I said % \immediate\openout\grfempty=\jobname.gr\ifgrf f\fi % clear the input file %% That solution worked with the following original macros %\def\testnextgrf{{\def\do##1{\catcode`##1=\other}\dospecials % \global\read\grfi to\next}\expandafter\testgrf\meaning\next\testgrf} %\expandafter\def\expandafter\testgrf\meaning\empty#1 #2\testgrf{% % \setup#2!!!!!$\ifx\thisone\thatone\if#1R\Rtrue\else\Rfalse\fi\else\Rguess\fi} %% Anyway, here's my second approach to Unix: (order n^2 algorithm) \def\\{{\def\do##1{\catcode`##1=\other}\dospecials \endlinechar=-1 \let\eol=0 \gdef\grfmem{} \expandafter\def\expandafter\gbbl\meaning\empty{} \def\appgrf{\read\grfi to\g \ifx\g\empty\else\xdef\grfmem{\grfmem\expandafter\gbbl\meaning\g\eol}\fi} \def\next{\ifeof\grfi\let\next\relax\else\appgrf\fi\next}\next}} \\ % now \grfmem is "L aaaaa\eol R bbbbb\eol ... R zzzzz\eol". \def\testnextgrf#1 #2\eol#3\\{\gdef\grfmem{#3}\setup#2!!!!!$% \ifx\thisone\thatone\if#1R\Rtrue\else\Rfalse\fi\else\Rguess\fi} \newwrite\grfo \immediate\openout\grfo=\jobname.grf % no conflict now \def\graffiti{% set up graffiti style \hsize=6pc \baselineskip=10pt \lineskip=0pt \lineskiplimit=0pt \parindent=0pt \mathsurround=1pt \textfont0=\gmathtext \scriptfont0=\gmathsubtext \scriptscriptfont0=\gmathsubsubtext \textfont1=\gmathlet \let\tfont=\gtfont \scriptfont1=\gmathsublet \scriptscriptfont1=\gmathsubsublet \textfont2=\gmathsym \scriptfont2=\gmathsubsym \scriptscriptfont2=\gmathsubsubsym \textfont3=\gmathext \scriptfont3=\gmathsubext \scriptscriptfont3=\gmathsubsubext \textfont\scrfam=\gmathscr \scriptfont\scrfam=\gmathsubscr \scriptscriptfont\scrfam=\gmathsubsubscr \textfont\frfam=\gmathfr \scriptfont\frfam=\gmathsubfr \scriptscriptfont\frfam=\gmathsubsubfr \textfont\euexfam=\gmatheuex \scriptfont\euexfam=\gmathsubsym % OK since I don't use all chars in this size \textfont\eqfam=\nineeq \def\rm{\fam\z@\gtext}% \let\oldsty=\goldstyle \let\big=\ninebig \setbox\strutbox=\hbox{\vrule height7.25pt depth2.75pt width\z@}% \gtext \rightskip=\z@ plus2em % ragged right \tolerance=2000 \hyphenpenalty=300 \exhyphenpenalty=300 \doublehyphendemerits=100000 \finalhyphendemerits=\doublehyphendemerits } \def\ninebig#1{{\hbox{$\textfont0=\tenrm\textfont2=\tensy \left#1\vbox to7.25pt{}\right.\n@space$}}} \def\grafctr{\hbox to4.5pc{\hfil##\hfil}} \newif\ifR % does this entry go on a right-hand page? \def\Rguess{\def\ifR{\ifodd\pageno}} \long\def\g#1\g{\def\next{#1!!!!!}\expandafter\writegrf\meaning\next$% \ifx\grfmem\empty\Rguess\else\expandafter\testnextgrf\grfmem\\\fi % pre-Unix, that line was \ifeof\grfi\Rguess\else\testnextgrf\fi \setbox0=\vtop{\graffiti#1% \write\m@ne\ifR{\Rcheck}\else{\Lcheck}\fi}% log file records successes \ifvmode\kern-\prevdepth\kern-\ht0\dp0=\z@\nointerlineskip\bgroup \else\dp0=\dp\strutbox\strut\vadjust{\kern-\dp\strutbox\kern-\ht0\fi \ifR\moveleft7\else\moveright29\fi pc\box0}} \expandafter\def\expandafter\writegrf\meaning\empty#1#2#3#4#5#6${% \write\grfo{\LorR #1#2#3#4#5}\def\thisone{#1#2#3#4#5}} \def\setup#1#2#3#4#5#6${\def\thatone{#1#2#3#4#5}} \def\LorR{\ifodd\pageno R \else L \fi} \def\Lcheck{\ifodd\pageno Bad guess!\fi} \def\Rcheck{\ifodd\pageno\else Bad guess!\fi} % Page layout \newif\ifpreprint \preprinttrue % should be false when making the final copy \newdimen\pageheight \pageheight=\vsize \newdimen\totheight \totheight=49.5pc \newdimen\folioht \setbox0=\hbox{\foliofont0} \folioht=\ht0 \def\leftheadline{\hbox to35pc{\vbox to 10pt{}% strut to position the baseline \llap{\kern-2pc\iftitle\leftcorner\else\foliofont\folio\fi\hfil}% \iftitle\hfil\copyrite\else\runhead\uppercase\expandafter{\chaptitle}\hfil\fi}} \def\rightheadline{\hbox to35pc{\iftitle\copyrite\fi\hfil \vbox to 10pt{}% strut to position the baseline \iftitle\else\runhead\uppercase\expandafter{\topmark}\fi \rlap{\hfil\iftitle\rightcorner\else\foliofont\folio\fi\kern-2pc}}} \def\leftcorner{\iffinal\else\vrule\vbox to\folioht{\hrule width9pt\vfil}\fi} \def\rightcorner{\iffinal\else\vbox to\folioht{\hrule width9pt\vfil}\vrule\fi} \def\copyrite{\ifpreprint{\textfont2=\sevensy\sevenrm\copyright\ 1988 Addison-Wesley Publishing Company; all rights reserved}\fi} \newdimen\htrimsize \htrimsize=7.375in \newdimen\vtrimsize \vtrimsize=9.25in \newdimen\outermargin \outermargin=23mm \newdimen\topmargin \topmargin=10mm % plus height of the headline box \newbox\htrim \newbox\vtrim \newbox\trimmarks \setbox\htrim=\hbox to\htrimsize{\kern-.65in \vrule height .2pt depth .2pt width .4in\hfil\vrule width.4in\kern-.65in} \wd\htrim=0pt \setbox\vtrim=\vbox to\vtrimsize{\kern-.65in \moveleft.2pt\hbox{\vrule height .4in}\vfil \moveleft.2pt\hbox{\vrule height .4in}\kern-.65in} \wd\vtrim=0pt \setbox\trimmarks=\hbox to0pt{\raise\vtrimsize\copy\htrim \copy\htrim \copy\vtrim \kern\htrimsize \copy\vtrim\hss} \ht\trimmarks=0pt \dp\trimmarks=0pt \newif\iffinal % are we making the final copy? (pages.tex says "999") \def\onepageout#1{\escapechar=-1 % for writing \tabrefs \shipout % here we define one page of output \iffinal % add the trim marks \hbox to\htrimsize{\copy\trimmarks \ifodd\pageno\hss\else \hskip\outermargin\fi \vbox to\vtrimsize{\kern\topmargin\fi \vbox to\totheight{ \offinterlineskip % butt the boxes together \vskip2.5pt % adjustment at the top (10 Jan 2011) \vbox to 2pc{ % this part goes on top of the regular pages \ifodd\pageno \rightheadline\else\leftheadline\fi \vfill} % this completes the \vbox to 2pc \ifodd\pageno\moveright7pc\fi #1 \vfill \iftitle \global\titlefalse % reset the titlepage switch \ifodd\pageno \hbox to35pc{\hfil\foliofont\folio} \else\hbox{\foliofont\folio}\fi\fi \ifpreprint\ifinxmode\makeinxfooter\fi\fi \iffinal % finish the trimmed page }\vfill}\ifodd\pageno\hskip\outermargin\else\hss\fi \rlap{\smash{\lower30pt\hbox to.35in{\hss\twelvett\number\pageno}}}\fi } \advancepageno} \output{\onepageout{\pagebody}} \newbox\inxfootbanner \def\hours{\count0=\time \divide\count0 by60 % find the o'clock \multiply\count0 by40 \advance\count0\time % convert to hhmm \advance\count0 10000 \expandafter\gobbleone\number\count0\relax} \def\gobbleone1{} \setbox\inxfootbanner=\rlap{\hbox to 6.5in{\hrulefill\sevenrm\quad Author's page proof produced by \TeX\ at \hours\space on \ifcase\month\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi \space\number\day}} \def\makeinxfooter{\vbox to0pt{\kern10pt\copy\inxfootbanner\kern4pt \rlap{\vbadness=\maxdimen \inxcolumns}\vss}} \def\inxcolumns{\ifvoid\inxbox\let\next\relax\else\let\next\contribcol\fi\next} \def\contribcol{\setbox0=\vsplit\inxbox to54pt \vtop{\unvbox0}\kern20pt \inxcolumns} \def\inxstyle{\vrule height6pt depth2pt width\z@ \sevenrm} \splittopskip=6pt % Cross references % \ref{value}|name| gives value to |name| % \eqref|name| gives \eqcount to |name| % \exref|name| gives \excount to |name| % \tabref|name| gives appropriate page number to |name| % \refin foo inputs references from job foo (other than this job) % \showmissestrue if you want to see missing references \newif\ifshowmisses \def\vertical{|} \def\inref#1 #{\expandafter\def\csname\vertical#1\endcsname} \catcode`\|=\active \expandafter\def\expandafter\dospecials\expandafter{\dospecials\do\|} \newcount\defcount % number of old definitions not yet repeated \newcount\changecount % number of new definitions that are changed \newcount\miscount % number of unknown references \newread\tempin \def\refin#1 {\openin\tempin=#1.ref \ifeof\tempin\closein\tempin \else\closein\tempin \let|\inref \input#1.ref \let|\crossref \fi} {\let\|=\jobname \def\def{\global\advance\defcount1 \gdef}\expandafter\refin\| } \newwrite\refo \immediate\openout\refo=\jobname.ref \def\ref#1|#2|{\xdef\temp{#1}\expandafter\dordef\csname\vertical#2\endcsname} \def\dordef#1{\ifx#1\temp \global\advance\defcount-1 \else\global\advance\changecount1 \global\let#1\temp\fi {\escapechar=-1\immediate\write\refo{\noexpand#1{\temp}}}} \def\eqref{\ref{\number\eqcount}} \def\exref{\ref{\number\excount}} \def\tabref|#1|{\expandafter\pageref\csname\vertical#1\endcsname} \def\pageref#1{\ifx#1\relax\else\global\advance\defcount-1 \fi \write\refo{\noexpand#1{\number\pageno}}% \write\m@ne{\ifx#1\relax New Pageref!\else \ifnum#1=\pageno\else Changed Pageref!\fi\fi}} \def\crossref#1|{\expandafter\usedef\csname\vertical#1\endcsname} \def\usedef#1{\ifx#1\relax \ifshowmisses\showmiss#1\fi\global\advance\miscount1 ??\else #1\fi} \let|=\crossref \def\showmiss#1{{\escapechar=-1% \message{***** WARNING: Undefined reference #1\string|! *****}}} \def\cite#1.{\ifinxmode\write\bnx{[#1] \number\pageno.}\fi#1} {\catcode`\@=\active \gdef\newcite#1.{\ifinxmode\write\bnx{[#1'] \number\pageno.}\fi#1$'@$}} \outer\def\bye{ \ifnum\miscount>0 \message{(\the\miscount\space undefined references were present)}\fi \ifnum\changecount>0 \message{(\the\changecount\space new references written on \jobname.ref)}\fi \ifnum\defcount>0 \message{(\the\defcount\space old references dropped from \jobname.ref)}\fi \par\vfill\supereject \end} % Exercises \newwrite\ans \immediate\openout\ans=\jobname.ans \outer\def\answer{\par \immediate\write\ans{} \immediate\write\ans{\string\ansno\chapno.\the\excount:} \copytoblankline} \def\copytoblankline{\begingroup\setupcopy\copyans} \def\setupcopy{\def\do##1{\catcode`##1=\other}\dospecials \obeylines} {\obeylines \gdef\copyans#1 {\def\next{#1}% \ifx\next\empty\let\next=\endgroup % \else\immediate\write\ans{\next} \let\next=\copyans\fi\next}} \def\ansno#1:{\par\medbreak\def\thisansno{\source#1}% \noindent\hbox to\parindent{\bf #1\hfil}\ignorespaces} % Pictures (a subset of \LaTeX's conventions) \newskip\hsssglue \hsssglue=0pt plus 1fill minus 1fill \def\hsss{\hskip\hsssglue} \newdimen\unitlength \newdimen\linethickness \newdimen\@picheight \newdimen\@xdim \newdimen\@ydim \newdimen\@len \newdimen\@save \newcount\@multicount \newcount\@xarg \newcount\@yarg \newbox\@picbox \newbox\@mpbox \font\tenln=line10 \font\tenlnw=linew10 \font\tencirc=lcircle10 \font\tencircw=lcirclew10 \font\smallln=linew10 scaled 483 % that's magstep-4 \def\thinlines{\let\linefont=\tenln \let\circlefont=\tencirc \linethickness=\fontdimen8\linefont} \def\thicklines{\let\linefont=\tenlnw \let\circlefont=\tencircw \linethickness=\fontdimen8\linefont} \thinlines \def\beginpicture(#1,#2)(#3,#4){\@picheight=#2\unitlength \let\line=\@line \setbox\@picbox=\hbox to#1\unitlength\bgroup \kern-#3\unitlength \lower#4\unitlength\hbox\bgroup\ignorespaces} \def\endpicture{\egroup\hss\egroup \ht\@picbox=\@picheight \dp\@picbox=\z@ \leavevmode\box\@picbox} \def\put(#1,#2)#3{\raise#2\unitlength\rlap{\kern#1\unitlength #3}\ignorespaces} \def\multiput(#1,#2)(#3,#4)#5#6{\@multicount=#5 \@xdim=#1\unitlength \@ydim=#2\unitlength \setbox\@mpbox=\hbox{#6}% \loop\ifnum\@multicount>0 \raise\@ydim\rlap{\kern\@xdim \unhcopy\@mpbox}% \advance\@xdim#3\unitlength \advance\@ydim#4\unitlength \advance\@multicount\m@ne \repeat\ignorespaces} \def\makebox(#1,#2)#3{\setbox\@picbox=\hbox to#1\unitlength{\hss#3\hss}% \@ydim=\ht\@picbox \advance\@ydim-\dp\@picbox \ht\@picbox=#2\unitlength \dp\@picbox=\z@ \leavevmode\lower.5\@ydim\box\@picbox} \newif\ifneg \def\@line(#1,#2)#3{\@xarg=#1 \@yarg=#2 \@len=#3\unitlength \leavevmode \ifnum\@xarg<0 \reverseline \else \negfalse \@ydim=\z@\fi \ifnum\@xarg=0 \@vline \else\ifnum\@yarg=0 \@hline \else\@sline\fi\fi \ifneg\kern-\@len\else\@save=\@ydim\fi} \def\reverseline{\negtrue \kern-\@len \@xarg=-\@xarg \@ydim=\@len \multiply\@ydim\@yarg \divide\@ydim\@xarg \@yarg=-\@yarg} \def\@hline{\vrule height.5\linethickness depth.5\linethickness width\@len} \def\@vline{\kern-.5\linethickness\vrule width\linethickness \ifnum\@yarg<0 height\z@ depth\else depth\z@ height\fi\@len \kern-.5\linethickness} \def\@sline{\setbox\@picbox=\hbox{\linefont \count@=\@xarg \multiply\count@ 8 \ifnum\@yarg>0 \advance\count@\@yarg \advance\count@-9 \else \advance\count@-\@yarg \advance\count@ 55 \fi \char\count@}% \ifnum\@yarg<0 \@picheight=-\ht\@picbox \advance\@ydim\@picheight \else \@picheight=\ht\@picbox \fi \@xdim=\wd\@picbox \@save=\@ydim \loop\ifdim\@xdim<\@len \raise\@ydim\copy\@picbox \advance\@xdim\wd\@picbox \advance\@ydim\@picheight \repeat \advance\@xdim-\@len \kern-\@xdim \multiply\@xdim\@yarg \divide\@xdim\@xarg \advance\@ydim-\@xdim \raise\@ydim\box\@picbox} \def\vector(#1,#2)#3{\@line(#1,#2){#3}% \ifnum\@xarg=0 \@vvector \else\ifnum\@yarg=0 \@hvector \else\@svector\fi\fi} \def\@hvector{\ifneg\rlap{\linefont\char27}\else \smash{\llap{\linefont\char45}}\fi} % we have to smash because of font bug \def\@vvector{\ifnum\@yarg<0 \raise-\@len\rlap{\linefont\char63}% \else\setbox\@picbox=\rlap{\linefont\char54}\advance\@len-\ht\@picbox \raise\@len\box\@picbox\fi} \def\@svector{\setbox\@picbox=\hbox to\z@{\linefont \ifnum\@yarg<0 \count@=55 \@yarg=-\@yarg \else\count@=-9 \fi \ifneg\multiply\@xarg16 \multiply\@yarg2 \else\hss % \llap \ifnum\@xarg>2 \multiply\@xarg9 \multiply\@yarg2 \advance\count@29 \else\ifnum\@yarg>2 \multiply\@xarg16 \multiply\@yarg9 \advance\count@-20 \else\multiply\@xarg24 \multiply\@yarg3 \fi\fi\fi \advance\count@\@xarg \advance\count@\@yarg \char\count@ \ifneg\hss\fi}% \rlap \raise\@save\box\@picbox} \def\disk#1{\@len=#1\unitlength \count@='160 \@diskcirc} \def\circle#1{\@len=#1\unitlength \count@='140 \@diskcirc} \def\@diskcirc{\setbox\@picbox=\hbox{\circlefont\char\count@}\@xdim=\wd\@picbox \leavevmode \ifdim\@len>15.499\@xdim \@bigdc \else \@smalldc\fi} \def\@bigdc{\ifnum\count@<'160 \@bigcirc \else \@len=15\@xdim \@diskcirc\fi} \def\@smalldc{{\advance\@len-.5\@xdim \loop\ifdim\@xdim<\@len \advance\count@\@ne \advance\@xdim\wd\@picbox\repeat \hbox{\circlefont\char\count@}}} \def\@bigcirc{{\circlefont\count@=15 \setbox\@picbox=\hbox{\char\count@}\@xdim=\wd\@picbox \ifdim\@len>2.5\@xdim \@len=2.5\@xdim\fi \advance\@len-.125\wd\@picbox \loop\ifdim\@xdim<\@len \advance\count@ 4 \advance\@xdim.25\wd\@picbox\repeat \@ydim=.5\@xdim \advance\@ydim.5\linethickness \setbox\@picbox=\vbox{\hbox{\char\count@\advance\count@-3\char\count@}% \nointerlineskip \hbox{\advance\count@\m@ne\char\count@\advance\count@\m@ne\char\count@}}% \kern-\@ydim\lower\@ydim\box\@picbox}} \newif\ifovaltl \newif\ifovaltr \newif\ifovalbl \newif\ifovalbr \ovaltltrue \ovaltrtrue \ovalbltrue \ovalbrtrue \def\oval(#1,#2){\@xdim=#1\unitlength \@ydim=#2\unitlength {\circlefont \setbox\@picbox=\hbox{\char0} \ifdim\@xdim<\wd\@picbox \@xdim=\wd\@picbox\fi \ifdim\@ydim<\wd\@picbox \@ydim=\wd\@picbox\fi \@save=\@xdim \ifdim\@ydim<\@save \@save=\@ydim \fi \count@=39 \loop \setbox\@picbox=\hbox{\char\count@}\ifdim\@save<\wd\@picbox \advance\count@-4 \repeat \setbox\strutbox=\hbox{\vrule height\ht\@picbox depth\dp\@picbox width\z@ \kern\wd\@picbox}% \@save=.5\wd\@picbox \advance\@save-.5\linethickness \setbox0=\hbox to\@xdim{\ifovaltl\char\count@\else\strut\fi \kern-\@save\leaders\hrule height\ifovaltl\linethickness\else\z@\fi\hfil \leaders\hrule height\ifovaltr\linethickness\else\z@\fi\hfil\kern\@save \ifovaltr\advance\count@-3\char\count@\else\strut\fi\kern-\wd\@picbox}% \advance\count@\m@ne \setbox2=\hbox to\@xdim{\ifovalbl\char\count@\else\strut\fi \kern-\@save\leaders\hrule height\ifovalbl\linethickness\else\z@\fi\hfil \leaders\hrule height\ifovalbr\linethickness\else\z@\fi\hfil\kern\@save \ifovalbr\advance\count@\m@ne\char\count@\else\strut\fi\kern-\wd\@picbox}% \@save=\@ydim \advance\@save-\wd\@picbox \divide\@save 2 \setbox\@picbox=\vbox{\box0\nointerlineskip \hbox to\@xdim{\vrule height\@save width\ifovaltl\linethickness\else\z@\fi \hfil\ifovaltr\vrule width\linethickness\kern-\linethickness\fi}% \nointerlineskip \hbox to\@xdim{\vrule height\@save width\ifovalbl\linethickness\else\z@\fi \hfil\ifovalbr\vrule width\linethickness\kern-\linethickness\fi}% \nointerlineskip\box2}% \@save=.5\@ydim \advance\@save.5\linethickness \leavevmode \kern-.5\@xdim \kern-.5\linethickness \lower\@save\box\@picbox}} \def\cpic#1\endcpic{\vcenter{\hbox{\beginpicture#1\endpicture}}} % Squines (quadratic splines) % example of use: to plot f(x) between x0 and x1, you can say % \put(0,0){\squine(x0,xm,x1,y0,ym,y1)}, where y0=f(x0), y1=f(x1) % xm=(y0-y1+s1x1-s0x0)/(s1-s0), ym=(s0(s1x1-y1)-s1(s0x0-y0))/(s1-s0), % s0=f'(x0), and s1=f'(x1). \newdimen\@xi \newdimen\@xii \newdimen\@xiii \newdimen\@xiv \newdimen\@xpt \newdimen\@xoldpt \newdimen\@yi \newdimen\@yii \newdimen\@yiii \newdimen\@yiv \newdimen\@ypt \newdimen\@yoldpt \def\squine(#1,#2,#3,#4,#5,#6){\setbox\@picbox\hbox{\tencirc q}% \global\@xoldpt=#1\unitlength \global\@yoldpt=#4\unitlength \kern\@xoldpt \@xi=\@xoldpt \@xii=#2\unitlength \@xiii=#3\unitlength \@yi=\@yoldpt \@yii=#5\unitlength \@yiii=#6\unitlength \squinerec \@xpt=#3\unitlength \@ypt=#6\unitlength \@addpoint \raise\@ypt\copy\@picbox} \newif\iffar \def\squinerec{\farfalse \testnear\@xi\@xiii \testnear\@yi\@yiii \iffar \decast \fi} \def\testnear#1#2{\@save=#1\advance\@save-#2% \ifdim\@save<\z@ \@save=-\@save\fi \ifdim\@save>\p@ \fartrue \fi} \def\decast{\@xpt=\@xi \advance\@xpt\@xii \divide\@xpt2 \advance\@xii\@xiii \divide\@xii2 \@xiv=\@xpt \advance\@xiv\@xii \divide\@xiv2 \@ypt=\@yi \advance\@ypt\@yii \divide\@ypt2 \advance\@yii\@yiii \divide\@yii2 \@yiv=\@ypt \advance\@yiv\@yii \divide\@yiv2 \begingroup\@xii=\@xpt \@xiii=\@xiv \@yii=\@ypt \@yiii=\@yiv \squinerec\endgroup \@xpt=\@xiv \@ypt=\@yiv \@addpoint \@xi=\@xiv \@yi=\@yiv \squinerec} \def\@addpoint{%\message{(\the\@xpt,\the\@ypt)}% \global\advance\@xoldpt-\@xpt \wd\@picbox=-\@xoldpt \raise\@yoldpt\copy\@picbox \global\@xoldpt=\@xpt \global\@yoldpt=\@ypt} % Math operators \def\2{\mskip-.5mu2\mskip.5mu} \newmuskip\lessfortimes \lessfortimes=-2mu minus -2mu \def\cdt{\mskip\lessfortimes\cdot\mskip\lessfortimes} \def\nullnum{\phantom{0}} \def\twonullnum{\phantom{00}} \def\bex{\mskip-2mu} \def\twoconditions#1#2{_{\scriptstyle#1\atop\scriptstyle#2}} \def\tworestrictions#1#2{\vcenter{\offinterlineskip \halign{\strut\hfil##\hfil\cr#1\cr#2\cr}}} \def\dts{\mathinner{\ldotp\ldotp}} \def\[#1]{[\hbox{$\mskip1mu\thickmuskip=\thinmuskip#1\mskip1mu$}]} \def\bigi[#1\bigr]{\bigl[\hbox{$\thickmuskip=\thinmuskip#1$}\bigr]} \def\Bigi[#1\Bigr]{\Bigl[\hbox{$\thickmuskip=\thinmuskip#1$}\Bigr]} \def\prp(#1){(\hbox{$\thickmuskip=\thinmuskip#1$})} \def\pbigi(#1\bigr){\bigl(\hbox{$\thickmuskip=\thinmuskip#1$}\bigr)} \def\_#1{\def\next{#1}% \ifx\next\risingsign\expandafter\rising\else^{\underline{#1}}\fi} \def\risingsign{^} \def\rising#1{^{\overline{#1}}} \def\dotminus{\mathbin{\buildrel{\hbox{\runhead.}}\over{\smash{-}\vphantom{_2}}}} \let\divides=\backslash \def\edivides{\divides\mskip-4mu\divides} \def\ndivides{\mathpalette\notdiv\relax} \def\notdiv#1#2{\setbox0=\hbox{$#1\divides$}% \vcenter{\hbox to\wd0{$\hss\scriptscriptstyle/\hss$}}\kern-\wd0 \vcenter{\hbox to\wd0{$\hss\kern.5pt\scriptscriptstyle/\hss$}}\kern-\wd0 \box0\relax} \def\spec{\mathop{\rm Spec}} \def\half{{1\over2}} \def\rp{\mathchar"323F } % relatively prime \def\lcm{\mathop{\rm lcm}} \def\And{\quad{\rm and}\quad} \let\==\equiv \def\tmod#1{(mod~$#1$)} \def\pmod#1{\allowbreak\mkern18mu\hbox{(}{\rm mod}\,\,#1\hbox{)}} \let\implies=\Longrightarrow \def\?{\hbox{!`}} % subfactorial \def\hyp{\mathop{F{}}\nolimits\hyper} \def\tightplus{\medmuskip=1.5mu\relax} \def\hyper#1#2#3{\mathchoice{\tightplus \hbox{$\displaystyle\biggl({#1\atop#2}\Big\vert\,{#3}\!\biggr)$}}% {\bigl({#1\atop#2}\vert\mskip2mu#3\bigr)}% {}{}} % used only in D and T styles %\def\hypk_#1{\mathop{F{}}_{#1}\nolimits\hyper} % confl with mFn convention \def\hypk_#1#2#3#4{\mathop{F{}}\mathchoice{\tightplus \hbox{$\displaystyle\biggl({#2\atop#3}\Big\vert\,{#4}\!\biggr)$}% \lower\fontdimen11\mathsym\hbox{$\scriptstyle\!#1$}}% {\bigl({#2\atop#3}\vert\mskip2mu#4\bigr)\lower\fontdimen12\mathsym \hbox{$\scriptstyle\!#1$}}% {}{}} % used only in D and T styles \def\double(#1\choose#2){\mathchoice{\biggl(\!\!{#1\choose#2}\!\!\biggr)} {\bigl(\!{#1\choose#2}\!\bigr)}{}{}} % only D and T styles \def\hypstrut{\vphantom{_1\_^k}} % if there's another denominator with \_^k \def\deg{\mathop{\rm deg}} \def\Bscr{{\scr B}} \def\Escr{{\scr E}} \def\Fscr{{\scr F}} \def\Pscr{{\scr P}} \def\Sscr{{\scr S}} \def\adj{\relbar\joinrel\relbar} % adjacent in a graph \let\<=\langle \let \>=\rangle \def\Pr{\mathop{\rm Pr}\nolimits} \def\Mean{\mathop{\rm Mean}\nolimits} \def\Var{\mathop{\rm Var}\nolimits} \def\between{\big\vert\hbox{\vphantom)}} % \between_a^b {\catcode`\'=\active \gdef'{^\bgroup\mskip2mu\prim@s}} % more space before ' \def\array#1[#2]{\hbox{\tt#1[$#2$]}} \def\given{\mskip1mu\vert\mskip1mu} \def\euler{\atopwithdelims<>} \def\Euler#1#2{\mathchoice{\biggl<\mskip-7mu{#1\euler#2}\mskip-7mu\biggr>}% {\bigl<\!{#1\euler#2}\!\bigr>}{}{}} \newbox\phihatbox \newbox\scrphihatbox \setbox\phihatbox=\hbox{$\phi$} \ht\phihatbox=1ex \setbox\scrphihatbox=\hbox{$\scriptstyle\phi$} \ht\scrphihatbox=\fontdimen5\mathsublet \setbox\phihatbox=\hbox{$\widehat{\box\phihatbox}$} \setbox\scrphihatbox=\hbox{$\hat{\box\scrphihatbox}$} \def\phihat{\mathchoice{\copy\phihatbox}{\copy\phihatbox}% {\copy\scrphihatbox}{{\hat\phi}}} \newbox\mathsizebox \def\setmathsize#1{\global\setbox\mathsizebox=\hbox{\displaymath#1$}} \def\mathsize#1{\hbox to\wd\mathsizebox{\displaymath#1$\hss}} \newbox\sqrtstrutbox \setbox\sqrtstrutbox=\hbox{\vrule height10.5pt width\z@} \def\strutsqrt#1{\copy\sqrtstrutbox\sqrt{{}^{\mathstrut}#1}} \newbox\Sqbox % for sum of squares \setbox\Sqbox=\vbox{\tenrm\hrule height.6pt\kern-.6pt \hbox to1.5ex{\vrule height1.5ex width.6pt\hss\vrule width.6pt}\kern-.6pt \hrule height.3pt depth.3pt} \def\Sq{\mskip1.5mu\copy\Sqbox\mskip1.5mu} % primitive index macros % "stuff for index" will go into a file for sorting and into normal text % "!stuff for index" will go into the file only \expandafter\def\expandafter\dospecials\expandafter{\dospecials\do\"} \def\hexcode{"} \catcode`\"=\active \newif\ifinxmode \newwrite\inx \newwrite\bnx \newbox\inxbox \newif\ifsilent \def\beginxref{\futurelet\next\beginxrefswitch} \def\beginxrefswitch{\ifx\next!\let\next=\silentxref \else\silentfalse\let\next=\xref\fi \next} \def\silentxref!{\silenttrue\xref} \let"=\beginxref \def\xref#1"{\ifinxmode\edef\text{#1}\makexref\fi \ifsilent\ignorespaces\else#1\fi} \def\makexref{\global\setbox\inxbox=% \vbox{\unvbox\inxbox\allowbreak\hbox{\inxstyle\text}}% \xdef\writeit{\write\inx{\text\space!\space \noexpand\number\pageno.}}\writeit} % Final considerations \catcode`\@=\active \def@{\mskip1mu\relax} \expandafter\def\expandafter\dospecials\expandafter{\dospecials\do\@} \hyphenation{logical Mac-Mahon hyper-geo-metric hyper-geo-met-rics Ber-noulli} \preprintfalse % WE ARE MAKING THE REAL BOOK! \inxmodetrue % WE ARE PREPARING A ROUGH INDEX \showmissestrue % THE REFERENCES SHOULD ALL BE READY NOW \ifinxmode\immediate\openout\inx=\jobname.inx \fi % file for index reminders \ifinxmode\immediate\openout\bnx=\jobname.bnx \fi % file for bib reminders % To make the book: % First TeX BIB, to get BIB.REF correct. (Must have \cite entries.) % Then TeX CHAP1..CHAP9, PREF, ANS, CRED, FRONT, CONT. % Then make BNX file from individual *.BNX files including BIB.BNX. % Then reTeX BIB. % *.INX files are raw data only. Index and Contents are prepared by hand. % To produce only a subset of pages, put the page numbers on separate % lines in a file called pages.tex, ended by 999 % WARNING: This will screw up the .grf file! Save it, then restore it. % WARNING: This may screw up the .ref file (if there are \tabrefs). Ditto. \let\Shipout=\shipout \newread\pages \newcount\nxtpg \openin\pages=pages \def\getnxtpg{\ifeof\pages\else {\endlinechar=-1\read\pages to\next \ifx\next\empty % in this case we should have eof now \else\global\nxtpg=\next\fi}\fi} \ifeof\pages\finalfalse\else\finaltrue \getnxtpg \ifnum\nxtpg=999 \message{OK, I'm making final copy with trim marks!} \hoffset=-.5in \getnxtpg % this should ensure eof on the \pages file \else\message{OK, I'll ship only the requested pages!} \hoffset=-.5in\fi\fi \def\shipout{\ifeof\pages\let\next=\Shipout \else\ifnum\pageno=\nxtpg\getnxtpg\let\next=\Shipout \else\let\next=\Tosspage\fi\fi \next} \newbox\garbage \def\Tosspage{\deadcycles=0\setbox\garbage=}