home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / unixtex-6.1b-bin0.lha / lib / texmf / tex / plain / gkpmac.tex < prev    next >
Text File  |  1996-10-12  |  34KB  |  847 lines

  1. % Macros for `Concrete Mathematics'
  2. \ifx\gkpmac\fmtversion\endinput\else\let\gkpmac=\fmtversion\fi
  3.  
  4. % Fonts for regular text
  5.  
  6. \font\textrm=ccr10        % roman
  7. \font\textit=ccti10        % italic (emphasis)
  8. \font\textsl=ccsl10        % slanted (titles)
  9. \font\textbf=cmbx10            % bold
  10. \font\textcsc=cccsc10        % caps and small caps
  11. \font\oldsty=ccmi10        % equation numbers
  12.  
  13. % Fonts for regular math
  14.  
  15. \font\mathtext=ccr10
  16.  \font\mathsubtext=ccr7
  17.  \font\mathsubsubtext=ccr5
  18. \font\mathlet=eurm10
  19.  \font\mathsublet=eurm7
  20.  \font\mathsubsublet=eurm5
  21.  \skewchar\mathlet='177 \skewchar\mathsublet='177 \skewchar\mathsubsublet='177
  22. \font\mathsym=cmsy10
  23.  \font\mathsubsym=cmsy7
  24.  \font\mathsubsubsym=cmsy5
  25.  \skewchar\mathsym='60 \skewchar\mathsubsym='60 \skewchar\mathsubsubsym='60
  26. \font\mathext=cmex10
  27.  \font\mathsubext=cmex10
  28.  \font\mathsubsubext=cmex10
  29. \font\mathscr=euxm10
  30.  \font\mathsubscr=euxm7
  31.  \font\mathsubsubscr=euxm5
  32.  \skewchar\mathscr='60 \skewchar\mathsubscr='60 \skewchar\mathsubsubscr='60
  33. \font\mathfr=eufm10
  34.  \font\mathsubfr=eufm7
  35.  \font\mathsubsubfr=eufm5
  36. \font\matheuex=euex10
  37.  
  38. \font\eulerbf=eurb10 % not hooked in to these macros
  39.  
  40. % Fonts for graffiti
  41.  
  42. \font\gtext=ccslc9
  43. \font\goldstyle=ccmic9
  44.  \fontdimen3\gtext=0pt \fontdimen4\gtext=0pt % no stretch or shrink
  45. \font\gmathtext=ccr9
  46.  \font\gmathsubtext=ccr6
  47.  \font\gmathsubsubtext=ccr5
  48. \font\gmathlet=eurm10 scaled 900
  49.  \font\gmathsublet=eurm7 scaled 857
  50.  \font\gmathsubsublet=eurm5
  51.  \skewchar\gmathlet='177 \skewchar\gmathsublet='177
  52.    \skewchar\gmathsubsublet='177
  53. \font\gmathsym=cmsy9
  54.  \font\gmathsubsym=cmsy6
  55.  \font\gmathsubsubsym=cmsy5
  56.  \skewchar\gmathsym='60 \skewchar\gmathsubsym='60 \skewchar\gmathsubsubsym='60
  57. \font\gmathext=cmex9
  58.  \font\gmathsubext=cmex9
  59.  \font\gmathsubsubext=cmex9
  60. \font\gmathscr=euxm10 scaled 900
  61.  \font\gmathsubscr=euxm7 scaled 857
  62.  \font\gmathsubsubscr=euxm5
  63.  \skewchar\gmathscr='60 \skewchar\gmathsubscr='60 \skewchar\gmathsubsubscr='60
  64. \font\gmathfr=eufm10 scaled 900
  65.  \font\gmathsubfr=eufm7 scaled 857
  66.  \font\gmathsubsubfr=eufm5
  67. \font\gmatheuex=euex9
  68.  
  69. % Fonts for headings, etc.
  70.  
  71. \font\chapfont=cmbxcd10 scaled 8000
  72. \font\title=cmbx10 scaled \magstep5
  73. \font\subtitle=cmbx10 scaled 1315 % that's magstep 1.5
  74. \font\subsubtitle=cmbxsl10
  75. \font\runhead=cmbx9
  76. \font\foliofont=cmr9
  77. \font\gtfont=cmmi9 % for the \t accent
  78.  
  79. % Normal text conventions
  80.  
  81. \catcode`@=11 % borrow the private macros of PLAIN (with care)
  82. \def\wlog#1{} % don't put allocation info into the log
  83.  
  84. \hsize=28pc
  85. \vsize=45.25pc
  86. \parindent=20pt
  87. \baselineskip=13pt
  88.  
  89. \let\sc=\textcsc
  90. \let\bf=\textbf
  91. \def\textindent#1{\noindent\hbox to\parindent{\bf#1\hfil}\ignorespaces}
  92. \def\exitem{\hangindent2\parindent \textindent}
  93.  
  94. \textfont0=\mathtext
  95.  \scriptfont0=\mathsubtext
  96.  \scriptscriptfont0=\mathsubsubtext
  97. \textfont1=\mathlet \let\tfont=\teni
  98.  \scriptfont1=\mathsublet
  99.  \scriptscriptfont1=\mathsubsublet
  100. \textfont2=\mathsym
  101.  \scriptfont2=\mathsubsym
  102.  \scriptscriptfont2=\mathsubsubsym
  103. \textfont3=\mathext
  104.  \scriptfont3=\mathsubext
  105.  \scriptscriptfont3=\mathsubsubext
  106. \def\rm{\fam\z@\textrm}
  107. \def\it{\fam\itfam\textit} % \it is family 4, defined in PLAIN
  108. \def\sl{\textsl}
  109. \textfont\itfam=\textit
  110. \newfam\scrfam \ifnum\scrfam=8\relax\else\error\fi % family 8, script
  111. \textfont\scrfam=\mathscr
  112.  \scriptfont\scrfam=\mathsubscr
  113.  \scriptscriptfont\scrfam=\mathsubsubscr
  114. \def\scr{\fam8 }
  115. \mathcode`0="7130
  116. \mathcode`1="7131
  117. \mathcode`2="7132
  118. \mathcode`3="7133
  119. \mathcode`4="7134
  120. \mathcode`5="7135
  121. \mathcode`6="7136
  122. \mathcode`7="7137
  123. \mathcode`8="7138
  124. \mathcode`9="7139
  125. \newfam\frfam % family 9, fraktur
  126. \textfont\frfam=\mathfr
  127.  \scriptfont\frfam=\mathsubfr
  128.  \scriptscriptfont\frfam=\mathsubsubfr
  129. \def\frak{\fam9 }
  130. \newfam\euexfam % family 10, substitions for euler symbols
  131. \newfam\eqfam % family 11, cmr equal signs for Relbar (!)
  132. \font\teneq=cmr10 \textfont\eqfam=\teneq 
  133. % I'm not using Relbar except in 10pt, so this family is very incomplete...
  134.  
  135. \mathchardef\intop="1A52
  136. \mathchardef\ointop="1A48
  137. \mathchardef\coprod="1A60
  138. \mathchardef\prod="1A51
  139. \mathchardef\sum="1A50
  140. \mathchardef\braceld="A7A \mathchardef\bracerd="A7B
  141. \mathchardef\bracelu="A7C \mathchardef\braceru="A7D
  142. \mathchardef\infty="0A31
  143.  
  144. \mathchardef\nearrow="3A25
  145. \mathchardef\searrow="3A26
  146. \mathchardef\nwarrow="3A2D
  147. \mathchardef\swarrow="3A2E
  148. \mathchardef\Leftrightarrow="3A2C
  149. \mathchardef\Leftarrow="3A28
  150. \mathchardef\Rightarrow="3A29
  151. \mathchardef\leftrightarrow="3A24 \mathcode`\^^W="3A24
  152. \mathchardef\leftarrow="3A20 \let\gets=\leftarrow \mathcode`\^^X="3A20
  153. \mathchardef\rightarrow="3A21 \let\to=\rightarrow \mathcode`\^^Y="3A21
  154. \def\uparrow{\delimiter"3A22378 } \mathcode`\^^K="3A22
  155. \def\downarrow{\delimiter"3A23379 } \mathcode`\^^A="3A23
  156. \def\updownarrow{\delimiter"3A6C33F }
  157. \def\Uparrow{\delimiter"3A2A37E }
  158. \def\Downarrow{\delimiter"3A2B37F }
  159. \def\Updownarrow{\delimiter"3A6D377 }
  160. \mathchardef\leftharpoonup="3A18
  161. \mathchardef\leftharpoondown="3A19
  162. \mathchardef\rightharpoonup="3A1A
  163. \mathchardef\rightharpoondown="3A1B
  164.  
  165. \textfont\euexfam=\matheuex
  166. \scriptfont\euexfam=\mathsubsym % this is OK since I don't use all characters
  167. % of euex in subscripts/superscripts; otherwise I'd have to make euex7 and euex6
  168. \scriptscriptfont\euexfam=\mathsubsym % only for \mathchoice, not really chosen
  169. \mathcode`+="292B
  170. \mathcode`-="292D
  171. \mathcode`!="0921
  172. \mathcode`(="4928 \delcode`(="928300
  173. \mathcode`)="5929 \delcode`)="929301
  174. \mathcode`[="495B \delcode`[="95B302
  175. \mathcode`]="595D \delcode`]="95D303
  176. \mathcode`=="393D
  177. \mathchardef\Relbar="3B3D % we need the old = to match \Arrows
  178. \mathchardef\Gamma="7100
  179. \mathchardef\Delta="7101
  180. \mathchardef\Theta="7102
  181. \mathchardef\Lambda="7103
  182. \mathchardef\Xi="7104
  183. \mathchardef\Pi="7105
  184. \mathchardef\Sigma="7106
  185. \mathchardef\Upsilon="7107
  186. \mathchardef\Phi="7108
  187. \mathchardef\Psi="7109
  188. \mathchardef\Omega="710A
  189. \let\varsigma=\sigma \let\varrho=\rho % Euler doesn't have these
  190. \mathchardef\aleph="0840
  191. \def\rbrace{\delimiter"5867A09 } \let\}=\rbrace
  192. \def\lbrace{\delimiter"4866A08 } \let\{=\lbrace
  193. %\mathchardef\equiv="3811 \let\cong=\equiv % lowres bars weren't spaced right
  194. \mathchardef\leq="3814 \let\le=\leq
  195. \mathchardef\geq="3815 \let\ge=\geq
  196. \mathchardef\Re="083C
  197. \mathchardef\Im="083D
  198. \def\vert{\delimiter"86A30C }
  199. \def\backslash{\delimiter"86E30F }
  200.  
  201. \setbox\strutbox=\hbox{\vrule height9pt depth4pt width\z@}%
  202. \newbox\bigstrutbox \newbox\biggstrutbox
  203. \setbox\bigstrutbox=\hbox{\vrule height11pt depth4pt width\z@}%
  204. \def\bigstrut{\relax\ifmmode\copy\bigstrutbox\else\unhcopy\bigstrutbox\fi}
  205. \setbox\biggstrutbox=\hbox{\vrule height17pt depth10pt width\z@}%
  206. \def\biggstrut{\relax\ifmmode\copy\biggstrutbox\else\unhcopy\biggstrutbox\fi}
  207. \rm
  208.  
  209. \newmuskip\normalthick \normalthick=5mu plus 5mu
  210. \newmuskip\normalmedmu \normalmedmu=\medmuskip
  211. \newmuskip\displaythick \displaythick=10mu minus 3mu
  212. \everymath{\thickmuskip=\normalthick}
  213.  
  214. \abovedisplayskip=8pt plus 3pt minus 2pt % there's 2pt more (opened up)
  215. \belowdisplayskip=10pt plus 3pt minus 2pt
  216.  
  217. % displays not centered; all have capability of \eqalign
  218. \outer\def\begindisplay{\obeylines\startdisplay}
  219. {\obeylines\gdef\startdisplay#1
  220.   {\catcode`\^^M=5$$%
  221.    \advance\displayindent\parindent\advance\displaywidth-\parindent%
  222.    \openup2pt #1\halign\bgroup\span\preamble\cr}}
  223. \outer\def\enddisplay{\crcr\egroup$$}
  224. \jot=\z@  % we do our own opening up
  225.  
  226. \def\displaymath{$\thickmuskip=\displaythick\displaystyle}
  227. \def\preamble{\hfil\displaymath{##}$&&\displaymath{{}##}$\hfil}
  228. \def\tablepreamble{\bigstrut\hfil$##$\hfil\ &\vrule##&&\quad\hfil$##$\hfil}
  229. \def\xbox{\qquad\hbox} % for third column of explanation
  230.  
  231. \newcount\eqcount
  232. \def\equ(#1.#2){{\rm({\oldsty#1}.{\oldsty#2})}}
  233. \def\eq(#1){\equ(\chapno.#1)}
  234. \def\thiseq{\xdef\next{(\chapno.\number\eqcount)}\expandafter\equ\next}
  235. \def\eqno{\global\advance\eqcount 1 \global\everycr{\makeeqno\thiseq}}
  236. \newdimen\backup
  237. \def\makeeqno#1{\noalign{\global\everycr{}%
  238.   \advance\displaywidth\displayindent
  239.   \setbox0=\hbox to\displaywidth{\hfil#1}%
  240.   \backup=\prevdepth \advance\backup\ht0
  241.   \setbox0=\vbox{\kern-\backup\box0}\ht0=\z@ \dp0=\z@
  242.   \setbox0=\vbox{\box0}\unvbox0}} % that puts equation number on prev line!
  243.  
  244. \newif\iftitle
  245. \def\beginchapter#1 #2 \par{ % we should be at top of a page
  246.   \titletrue \eqcount=0
  247.   \ifodd\pageno
  248.    \rightline{\chapfont#1\kern-.05em}
  249.    \vskip 1in minus 5pt
  250.    \rightline{\title#2}
  251.    \moveleft7pc % this applies to the \vbox after the \fi
  252.   \else % left-hand page
  253.    \leftline{\kern-.05em\chapfont#1}
  254.    \vskip 1in minus 5pt
  255.    \leftline{\title#2} \fi
  256.   \vbox{\hrule width 35pc}
  257.   \def\chapno{#1} \edef\chaptitle{#2}
  258.   \mark{#1\enspace #2}
  259.   \smallskip\noindent}
  260.  
  261. \def\beginsection#1 #2 \par{ % should not be first in the chapter
  262.   \backup=\lastskip    % but should come on first or second page of chapter
  263.   \mark{#1\enspace #2}    % because the mark gives running head on right page
  264.   \nobreak\vskip-\backup\penalty-200
  265.   {\subtitle\baselineskip=34pt
  266.     \noindent\hbox to2\parindent{#1\hfil}\uppercase{\kern-.05em#2}\par}
  267.   \nobreak\vskip5pt\noindent\hbox to2\parindent{}}
  268.  
  269. \newcount\excount
  270. \def\beginexercises{\backup=\lastskip \excount=0
  271.   \mark{\chapno\enspace Exercises}
  272.   \nobreak\vskip-\backup\penalty-200
  273.   {\subtitle\baselineskip=34pt\noindent Exercises\par}\nobreak}
  274.  
  275. {\catcode`\|=\active
  276. \gdef\table#1\tabref|#2|{\hrule height1pt width\hsize \kern2pt
  277.  \noindent\strut{\bf Table |#2|\enspace}#1\par
  278.  \hrule height.5pt width\hsize\tabref|#2|}}
  279.  
  280. \def\medbr{\ifnum\lastpenalty>9999 \medskip \else\medbreak\fi}
  281. \def\subhead#1\par{\medbr
  282.   {\subsubtitle\noindent#1\par}\nobreak}
  283. \def\ex:{\par{\advance\medskipamount-1pt\medbr}%
  284.   \advance\excount 1 \item{\number\excount}}
  285.  
  286. \def\dash---{\thinspace---\hskip.16667em\relax}
  287. \def\qback{\kern-.15em} % between , or . and ''
  288. \def\undertext#1{$\underline{\smash{\hbox{#1}}}$}
  289. \def\newline{\hfil\break}
  290. \def\Hint:{{\it Hint:\/}}
  291. \let\macron=\= % we will use \= for congruence relation
  292. \def\t#1{{\edef\next{\the\font}\tfont\accent"7F\next#1}}
  293.  
  294. % Graffiti macros
  295. \chardef\other=12
  296. \newread\grfi \openin\grfi=\jobname.grf
  297. %\newwrite\grfo \immediate\openout\grfo=\jobname.grf % let's hope no conflict
  298. %% Hmmm...; that doesn't work on Unix.
  299. %% Here's my first solution, a kludge where I alternated between .grf and .gr
  300. %\newif\ifgrf  \newwrite\grfo \newwrite\grfempty
  301. %\ifeof\grfi \grffalse
  302. %\else\read\grfi to\grfitest \ifeof\grfi \grffalse \else \grftrue \fi\fi
  303. %\ifgrf\else \openin\grfi=\jobname.gr
  304. %  \ifeof\grfi\else\read\grfi to\grfitest \fi\fi
  305. %\immediate\openout\grfo=\jobname.gr\ifgrf\else f\fi
  306. %\immediate\write\grfo{} % an empty line will start a nonempty file (Unix only)
  307. %% and then at the end I said
  308. % \immediate\openout\grfempty=\jobname.gr\ifgrf f\fi % clear the input file
  309. %% That solution worked with the following original macros
  310. %\def\testnextgrf{{\def\do##1{\catcode`##1=\other}\dospecials
  311. %  \global\read\grfi to\next}\expandafter\testgrf\meaning\next\testgrf}
  312. %\expandafter\def\expandafter\testgrf\meaning\empty#1 #2\testgrf{%
  313. %  \setup#2!!!!!$\ifx\thisone\thatone\if#1R\Rtrue\else\Rfalse\fi\else\Rguess\fi}
  314. %% Anyway, here's my second approach to Unix: (order n^2 algorithm)
  315. \def\\{{\def\do##1{\catcode`##1=\other}\dospecials \endlinechar=-1 \let\eol=0
  316.   \gdef\grfmem{}
  317.   \expandafter\def\expandafter\gbbl\meaning\empty{}
  318.   \def\appgrf{\read\grfi to\g
  319.     \ifx\g\empty\else\xdef\grfmem{\grfmem\expandafter\gbbl\meaning\g\eol}\fi}
  320.   \def\next{\ifeof\grfi\let\next\relax\else\appgrf\fi\next}\next}}
  321. \\ % now \grfmem is "L aaaaa\eol R bbbbb\eol ... R zzzzz\eol".
  322. \def\testnextgrf#1 #2\eol#3\\{\gdef\grfmem{#3}\setup#2!!!!!$%
  323.   \ifx\thisone\thatone\if#1R\Rtrue\else\Rfalse\fi\else\Rguess\fi}
  324. \newwrite\grfo \immediate\openout\grfo=\jobname.grf % no conflict now
  325.  
  326. \def\graffiti{% set up graffiti style
  327.  \hsize=6pc
  328.  \baselineskip=10pt \lineskip=0pt \lineskiplimit=0pt
  329.  \parindent=0pt
  330.  \mathsurround=1pt
  331.  \textfont0=\gmathtext
  332.   \scriptfont0=\gmathsubtext
  333.   \scriptscriptfont0=\gmathsubsubtext
  334.  \textfont1=\gmathlet \let\tfont=\gtfont
  335.   \scriptfont1=\gmathsublet
  336.   \scriptscriptfont1=\gmathsubsublet
  337.  \textfont2=\gmathsym
  338.   \scriptfont2=\gmathsubsym
  339.   \scriptscriptfont2=\gmathsubsubsym
  340.  \textfont3=\gmathext
  341.   \scriptfont3=\gmathsubext
  342.   \scriptscriptfont3=\gmathsubsubext
  343. \textfont\scrfam=\gmathscr
  344.  \scriptfont\scrfam=\gmathsubscr
  345.  \scriptscriptfont\scrfam=\gmathsubsubscr
  346. \textfont\frfam=\gmathfr
  347.  \scriptfont\frfam=\gmathsubfr
  348.  \scriptscriptfont\frfam=\gmathsubsubfr
  349. \textfont\euexfam=\gmatheuex
  350. \scriptfont\euexfam=\gmathsubsym % OK since I don't use all chars in this size
  351.  \def\rm{\fam\z@\gtext}%
  352.  \let\oldsty=\goldstyle
  353.  \let\big=\ninebig
  354.  \setbox\strutbox=\hbox{\vrule height7.25pt depth2.75pt width\z@}%
  355.  \gtext
  356.  \rightskip=\z@ plus2em % ragged right
  357.  \tolerance=2000
  358.  \hyphenpenalty=300
  359.  \exhyphenpenalty=300
  360.  \doublehyphendemerits=100000
  361.  \finalhyphendemerits=\doublehyphendemerits
  362.  }
  363. \def\ninebig#1{{\hbox{$\textfont0=\tenrm\textfont2=\tensy
  364.   \left#1\vbox to7.25pt{}\right.\n@space$}}}
  365. \def\grafctr{\hbox to4.5pc{\hfil##\hfil}}
  366.  
  367. \newif\ifR % does this entry go on a right-hand page?
  368. \def\Rguess{\def\ifR{\ifodd\pageno}}
  369. \long\def\g#1\g{\def\next{#1!!!!!}\expandafter\writegrf\meaning\next$%
  370.   \ifx\grfmem\empty\Rguess\else\expandafter\testnextgrf\grfmem\\\fi
  371. % pre-Unix, that line was  \ifeof\grfi\Rguess\else\testnextgrf\fi
  372.   \setbox0=\vtop{\graffiti#1%
  373.   \write\m@ne\ifR{\Rcheck}\else{\Lcheck}\fi}% log file records successes
  374.   \ifvmode\kern-\prevdepth\kern-\ht0\dp0=\z@\nointerlineskip\bgroup
  375.   \else\dp0=\dp\strutbox\strut\vadjust{\kern-\dp\strutbox\kern-\ht0\fi
  376.    \ifR\moveleft7\else\moveright29\fi pc\box0}}
  377. \expandafter\def\expandafter\writegrf\meaning\empty#1#2#3#4#5#6${%
  378.   \write\grfo{\LorR #1#2#3#4#5}\def\thisone{#1#2#3#4#5}}
  379. \def\setup#1#2#3#4#5#6${\def\thatone{#1#2#3#4#5}}
  380. \def\LorR{\ifodd\pageno R \else L \fi}
  381. \def\Lcheck{\ifodd\pageno Bad guess!\fi}
  382. \def\Rcheck{\ifodd\pageno\else Bad guess!\fi}
  383.  
  384. % Page layout
  385. \newif\ifpreprint \preprinttrue % should be false when making the final copy
  386. \newdimen\pageheight \pageheight=\vsize
  387. \newdimen\totheight \totheight=49.5pc
  388. \newdimen\folioht \setbox0=\hbox{\foliofont0} \folioht=\ht0
  389. \def\leftheadline{\hbox to35pc{\vbox to 10pt{}% strut to position the baseline
  390.     \llap{\kern-2pc\iftitle\leftcorner\else\foliofont\folio\fi\hfil}%
  391.     \iftitle\hfil\copyrite\else\runhead\uppercase\expandafter{\chaptitle}\hfil\fi}}
  392. \def\rightheadline{\hbox to35pc{\iftitle\copyrite\fi\hfil
  393.     \vbox to 10pt{}% strut to position the baseline
  394.     \runhead\uppercase\expandafter{\topmark}%
  395.     \rlap{\hfil\iftitle\rightcorner\else\foliofont\folio\fi\kern-2pc}}}
  396. \def\leftcorner{\vrule\vbox to\folioht{\hrule width9pt\vfil}}
  397. \def\rightcorner{\vbox to\folioht{\hrule width9pt\vfil}\vrule}
  398. \def\copyrite{\ifpreprint{\textfont2=\sevensy\sevenrm\copyright\ 1988
  399.    Addison-Wesley Publishing Company; all rights reserved}\fi}
  400.  
  401. \def\onepageout#1{\escapechar=-1 % for writing \tabrefs
  402.     \shipout\vbox to\totheight{ % here we define one page of output
  403.     \offinterlineskip % butt the boxes together
  404.     \vbox to 2pc{ % this part goes on top of the regular pages
  405.       \ifodd\pageno \rightheadline\else\leftheadline\fi
  406.       \vfill} % this completes the \vbox to 2pc
  407.     \ifodd\pageno\moveright7pc\fi #1
  408.     \vfill
  409.     \iftitle \global\titlefalse % reset the titlepage switch
  410.     \ifodd\pageno \hbox to35pc{\hfil\foliofont\folio}
  411.     \else\hbox{\foliofont\folio}\fi\fi
  412.     \ifpreprint\ifinxmode\makeinxfooter\fi\fi
  413.     }
  414.   \advancepageno}
  415.  
  416. \output{\onepageout{\pagebody}}
  417.  
  418. \newbox\inxfootbanner
  419. \def\hours{\count0=\time \divide\count0 by60 % find the o'clock
  420.   \multiply\count0 by40 \advance\count0\time % convert to hhmm
  421.   \advance\count0 10000 \expandafter\gobbleone\number\count0\relax}
  422. \def\gobbleone1{}
  423. \setbox\inxfootbanner=\rlap{\hbox to 6.5in{\hrulefill\sevenrm\quad
  424.  Author's page proof produced by \TeX\ at
  425.  \hours\space on \ifcase\month\or
  426.    January\or February\or March\or April\or May\or June\or
  427.    July\or August\or September\or October\or November\or December\fi
  428.   \space\number\day}}
  429. \def\makeinxfooter{\vbox to0pt{\kern10pt\copy\inxfootbanner\kern4pt
  430.   \rlap{\vbadness=\maxdimen \inxcolumns}\vss}}
  431. \def\inxcolumns{\ifvoid\inxbox\let\next\relax\else\let\next\contribcol\fi\next}
  432. \def\contribcol{\setbox0=\vsplit\inxbox to54pt
  433.   \vtop{\unvbox0}\kern20pt \inxcolumns}
  434. \def\inxstyle{\vrule height6pt depth2pt width\z@ \sevenrm}
  435. \splittopskip=6pt
  436.  
  437. % Cross references
  438.  
  439. % \ref{value}|name| gives value to |name|
  440. % \eqref|name| gives \eqcount to |name|
  441. % \exref|name| gives \excount to |name|
  442. % \tabref|name| gives appropriate page number to |name|
  443. % \refin foo inputs references from job foo (other than this job)
  444. % \showmissestrue if you want to see missing references
  445.  
  446. \newif\ifshowmisses
  447. \def\vertical{|}
  448. \def\inref#1 #{\expandafter\def\csname\vertical#1\endcsname}
  449.  
  450. \catcode`\|=\active
  451. \expandafter\def\expandafter\dospecials\expandafter{\dospecials\do\|}
  452. \newcount\defcount    % number of old definitions not yet repeated
  453. \newcount\changecount    % number of new definitions that are changed
  454. \newcount\miscount    % number of unknown references
  455.  
  456. \newread\tempin
  457. \def\refin#1 {\openin\tempin=#1.ref
  458.  \ifeof\tempin\closein\tempin
  459.  \else\closein\tempin \let|\inref \input#1.ref \let|\crossref \fi}
  460.  
  461. {\let\|=\jobname
  462.  \def\def{\global\advance\defcount1 \gdef}\expandafter\refin\| }
  463. \newwrite\refo \immediate\openout\refo=\jobname.ref
  464.  
  465. \def\ref#1|#2|{\xdef\temp{#1}\expandafter\dordef\csname\vertical#2\endcsname}
  466. \def\dordef#1{\ifx#1\temp \global\advance\defcount-1
  467.  \else\global\advance\changecount1 \global\let#1\temp\fi
  468.  {\escapechar=-1\immediate\write\refo{\noexpand#1{\temp}}}}
  469. \def\eqref{\ref{\number\eqcount}}
  470. \def\exref{\ref{\number\excount}}
  471. \def\tabref|#1|{\expandafter\pageref\csname\vertical#1\endcsname}
  472. \def\pageref#1{\ifx#1\relax\else\global\advance\defcount-1 \fi
  473.  \write\refo{\noexpand#1{\number\pageno}}%
  474.  \write\m@ne{\ifx#1\relax New Pageref!\else
  475.   \ifnum#1=\pageno\else Changed Pageref!\fi\fi}}
  476. \def\crossref#1|{\expandafter\usedef\csname\vertical#1\endcsname}
  477. \def\usedef#1{\ifx#1\relax
  478.   \ifshowmisses\showmiss#1\fi\global\advance\miscount1 ??\else #1\fi}
  479. \let|=\crossref
  480. \def\showmiss#1{{\escapechar=-1%
  481.  \message{***** WARNING: Undefined reference #1\string|! *****}}}
  482.  
  483. \def\cite#1.{\ifinxmode\write\bnx{[#1] \number\pageno.}\fi#1}
  484. {\catcode`\@=\active
  485. \gdef\newcite#1.{\ifinxmode\write\bnx{[#1'] \number\pageno.}\fi#1$'@$}}
  486.  
  487. \outer\def\bye{
  488.  \ifnum\miscount>0
  489.   \message{(\the\miscount\space undefined references were present)}\fi
  490.  \ifnum\changecount>0
  491.   \message{(\the\changecount\space new references written on \jobname.ref)}\fi
  492.  \ifnum\defcount>0
  493.   \message{(\the\defcount\space old references dropped from \jobname.ref)}\fi
  494.  \par\vfill\supereject
  495.  \end}
  496.  
  497. % Exercises
  498.  
  499. \newwrite\ans
  500. \immediate\openout\ans=\jobname.ans
  501.  
  502. \outer\def\answer{\par
  503.   \immediate\write\ans{}
  504.   \immediate\write\ans{\string\ansno\chapno.\the\excount:}
  505.   \copytoblankline}
  506. \def\copytoblankline{\begingroup\setupcopy\copyans}
  507. \def\setupcopy{\def\do##1{\catcode`##1=\other}\dospecials \obeylines}
  508. {\obeylines \gdef\copyans#1
  509.   {\def\next{#1}%
  510.   \ifx\next\empty\let\next=\endgroup %
  511.   \else\immediate\write\ans{\next} \let\next=\copyans\fi\next}}
  512.  
  513. \def\ansno#1:{\par\medbreak\def\thisansno{\source#1}%
  514.  \noindent\hbox to\parindent{\bf #1\hfil}\ignorespaces}
  515.  
  516. % Pictures (a subset of \LaTeX's conventions)
  517. \newskip\hsssglue \hsssglue=0pt plus 1fill minus 1fill \def\hsss{\hskip\hsssglue}
  518.  
  519. \newdimen\unitlength \newdimen\linethickness
  520. \newdimen\@picheight \newdimen\@xdim \newdimen\@ydim \newdimen\@len \newdimen\@save
  521. \newcount\@multicount \newcount\@xarg \newcount\@yarg
  522. \newbox\@picbox \newbox\@mpbox
  523.  
  524. \font\tenln=line10     \font\tenlnw=linew10
  525. \font\tencirc=lcircle10 \font\tencircw=lcirclew10
  526. \font\smallln=linew10 scaled 483 % that's magstep-4
  527.  
  528. \def\thinlines{\let\linefont=\tenln \let\circlefont=\tencirc
  529.   \linethickness=\fontdimen8\linefont}
  530. \def\thicklines{\let\linefont=\tenlnw \let\circlefont=\tencircw
  531.   \linethickness=\fontdimen8\linefont}
  532. \thinlines
  533.  
  534. \def\beginpicture(#1,#2)(#3,#4){\@picheight=#2\unitlength \let\line=\@line
  535.   \setbox\@picbox=\hbox to#1\unitlength\bgroup
  536.     \kern-#3\unitlength \lower#4\unitlength\hbox\bgroup\ignorespaces}
  537. \def\endpicture{\egroup\hss\egroup
  538.   \ht\@picbox=\@picheight \dp\@picbox=\z@
  539.   \leavevmode\box\@picbox}
  540.  
  541. \def\put(#1,#2)#3{\raise#2\unitlength\rlap{\kern#1\unitlength #3}\ignorespaces}
  542.  
  543. \def\multiput(#1,#2)(#3,#4)#5#6{\@multicount=#5
  544.  \@xdim=#1\unitlength \@ydim=#2\unitlength \setbox\@mpbox=\hbox{#6}%
  545.  \loop\ifnum\@multicount>0
  546.    \raise\@ydim\rlap{\kern\@xdim \unhcopy\@mpbox}%
  547.    \advance\@xdim#3\unitlength \advance\@ydim#4\unitlength
  548.    \advance\@multicount\m@ne \repeat\ignorespaces}
  549.  
  550. \def\makebox(#1,#2)#3{\setbox\@picbox=\hbox to#1\unitlength{\hss#3\hss}%
  551.   \@ydim=\ht\@picbox \advance\@ydim-\dp\@picbox
  552.   \ht\@picbox=#2\unitlength \dp\@picbox=\z@
  553.   \leavevmode\lower.5\@ydim\box\@picbox}
  554.  
  555. \newif\ifneg
  556. \def\@line(#1,#2)#3{\@xarg=#1 \@yarg=#2 \@len=#3\unitlength \leavevmode
  557.  \ifnum\@xarg<0 \reverseline \else \negfalse \@ydim=\z@\fi
  558.  \ifnum\@xarg=0 \@vline
  559.  \else\ifnum\@yarg=0 \@hline \else\@sline\fi\fi
  560.  \ifneg\kern-\@len\else\@save=\@ydim\fi}
  561. \def\reverseline{\negtrue \kern-\@len \@xarg=-\@xarg
  562.  \@ydim=\@len \multiply\@ydim\@yarg \divide\@ydim\@xarg \@yarg=-\@yarg}
  563.  
  564. \def\@hline{\vrule height.5\linethickness depth.5\linethickness width\@len}
  565. \def\@vline{\kern-.5\linethickness\vrule width\linethickness
  566.   \ifnum\@yarg<0 height\z@ depth\else depth\z@ height\fi\@len
  567.   \kern-.5\linethickness}
  568.  
  569. \def\@sline{\setbox\@picbox=\hbox{\linefont \count@=\@xarg \multiply\count@ 8
  570.  \ifnum\@yarg>0 \advance\count@\@yarg \advance\count@-9
  571.  \else \advance\count@-\@yarg \advance\count@ 55 \fi \char\count@}%
  572.  \ifnum\@yarg<0 \@picheight=-\ht\@picbox \advance\@ydim\@picheight
  573.  \else \@picheight=\ht\@picbox \fi
  574.  \@xdim=\wd\@picbox \@save=\@ydim
  575.  \loop\ifdim\@xdim<\@len \raise\@ydim\copy\@picbox
  576.   \advance\@xdim\wd\@picbox \advance\@ydim\@picheight \repeat
  577.  \advance\@xdim-\@len \kern-\@xdim
  578.  \multiply\@xdim\@yarg \divide\@xdim\@xarg \advance\@ydim-\@xdim
  579.  \raise\@ydim\box\@picbox}
  580.  
  581. \def\vector(#1,#2)#3{\@line(#1,#2){#3}%
  582.  \ifnum\@xarg=0 \@vvector \else\ifnum\@yarg=0 \@hvector \else\@svector\fi\fi}
  583. \def\@hvector{\ifneg\rlap{\linefont\char27}\else
  584.  \smash{\llap{\linefont\char45}}\fi} % we have to smash because of font bug
  585. \def\@vvector{\ifnum\@yarg<0 \raise-\@len\rlap{\linefont\char63}%
  586.  \else\setbox\@picbox=\rlap{\linefont\char54}\advance\@len-\ht\@picbox
  587.  \raise\@len\box\@picbox\fi}
  588.  
  589. \def\@svector{\setbox\@picbox=\hbox to\z@{\linefont
  590.  \ifnum\@yarg<0 \count@=55 \@yarg=-\@yarg \else\count@=-9 \fi
  591.  \ifneg\multiply\@xarg16 \multiply\@yarg2
  592.  \else\hss % \llap
  593.   \ifnum\@xarg>2 \multiply\@xarg9 \multiply\@yarg2 \advance\count@29
  594.   \else\ifnum\@yarg>2 \multiply\@xarg16 \multiply\@yarg9 \advance\count@-20
  595.    \else\multiply\@xarg24 \multiply\@yarg3 \fi\fi\fi
  596.   \advance\count@\@xarg \advance\count@\@yarg \char\count@
  597.   \ifneg\hss\fi}% \rlap
  598.  \raise\@save\box\@picbox}
  599.  
  600. \def\disk#1{\@len=#1\unitlength \count@='160 \@diskcirc}
  601. \def\circle#1{\@len=#1\unitlength \count@='140 \@diskcirc}
  602. \def\@diskcirc{\setbox\@picbox=\hbox{\circlefont\char\count@}\@xdim=\wd\@picbox
  603.  \leavevmode \ifdim\@len>15.499\@xdim \@bigdc \else \@smalldc\fi}
  604. \def\@bigdc{\ifnum\count@<'160 \@bigcirc
  605.  \else \@len=15\@xdim \@diskcirc\fi}
  606. \def\@smalldc{{\advance\@len-.5\@xdim
  607.  \loop\ifdim\@xdim<\@len \advance\count@\@ne \advance\@xdim\wd\@picbox\repeat
  608.  \hbox{\circlefont\char\count@}}}
  609. \def\@bigcirc{{\circlefont\count@=15
  610.  \setbox\@picbox=\hbox{\char\count@}\@xdim=\wd\@picbox
  611.  \ifdim\@len>2.5\@xdim \@len=2.5\@xdim\fi
  612.  \advance\@len-.125\wd\@picbox
  613.  \loop\ifdim\@xdim<\@len \advance\count@ 4 \advance\@xdim.25\wd\@picbox\repeat
  614.  \@ydim=.5\@xdim \advance\@ydim.5\linethickness
  615.  \setbox\@picbox=\vbox{\hbox{\char\count@\advance\count@-3\char\count@}%
  616.   \nointerlineskip
  617.   \hbox{\advance\count@\m@ne\char\count@\advance\count@\m@ne\char\count@}}%
  618.  \kern-\@ydim\lower\@ydim\box\@picbox}}
  619.  
  620. \newif\ifovaltl \newif\ifovaltr \newif\ifovalbl \newif\ifovalbr
  621. \ovaltltrue \ovaltrtrue \ovalbltrue \ovalbrtrue
  622. \def\oval(#1,#2){\@xdim=#1\unitlength \@ydim=#2\unitlength
  623.  {\circlefont \setbox\@picbox=\hbox{\char0}
  624.  \ifdim\@xdim<\wd\@picbox \@xdim=\wd\@picbox\fi
  625.  \ifdim\@ydim<\wd\@picbox \@ydim=\wd\@picbox\fi
  626.  \@save=\@xdim \ifdim\@ydim<\@save \@save=\@ydim \fi
  627.  \count@=39
  628.  \loop \setbox\@picbox=\hbox{\char\count@}\ifdim\@save<\wd\@picbox
  629.   \advance\count@-4 \repeat
  630.  \setbox\strutbox=\hbox{\vrule height\ht\@picbox depth\dp\@picbox width\z@
  631.    \kern\wd\@picbox}%
  632.  \@save=.5\wd\@picbox \advance\@save-.5\linethickness
  633.  \setbox0=\hbox to\@xdim{\ifovaltl\char\count@\else\strut\fi
  634.   \kern-\@save\leaders\hrule height\ifovaltl\linethickness\else\z@\fi\hfil
  635.   \leaders\hrule height\ifovaltr\linethickness\else\z@\fi\hfil\kern\@save
  636.   \ifovaltr\advance\count@-3\char\count@\else\strut\fi\kern-\wd\@picbox}%
  637.   \advance\count@\m@ne
  638.  \setbox2=\hbox to\@xdim{\ifovalbl\char\count@\else\strut\fi
  639.   \kern-\@save\leaders\hrule height\ifovalbl\linethickness\else\z@\fi\hfil
  640.   \leaders\hrule height\ifovalbr\linethickness\else\z@\fi\hfil\kern\@save
  641.   \ifovalbr\advance\count@\m@ne\char\count@\else\strut\fi\kern-\wd\@picbox}%
  642.  \@save=\@ydim \advance\@save-\wd\@picbox \divide\@save 2
  643.  \setbox\@picbox=\vbox{\box0\nointerlineskip
  644.   \hbox to\@xdim{\vrule height\@save width\ifovaltl\linethickness\else\z@\fi
  645.     \hfil\ifovaltr\vrule width\linethickness\kern-\linethickness\fi}%
  646.   \nointerlineskip
  647.   \hbox to\@xdim{\vrule height\@save width\ifovalbl\linethickness\else\z@\fi
  648.     \hfil\ifovalbr\vrule width\linethickness\kern-\linethickness\fi}%
  649.   \nointerlineskip\box2}%
  650.   \@save=.5\@ydim \advance\@save.5\linethickness \leavevmode
  651.   \kern-.5\@xdim \kern-.5\linethickness \lower\@save\box\@picbox}}
  652.  
  653. \def\cpic#1\endcpic{\vcenter{\hbox{\beginpicture#1\endpicture}}}
  654.  
  655. % Squines (quadratic splines)
  656. % example of use: to plot f(x) between x0 and x1, you can say
  657. % \put(0,0){\squine(x0,xm,x1,y0,ym,y1)}, where y0=f(x0), y1=f(x1)
  658. % xm=(y0-y1+s1x1-s0x0)/(s1-s0), ym=(s0(s1x1-y1)-s1(s0x0-y0))/(s1-s0),
  659. % s0=f'(x0), and s1=f'(x1).
  660.  
  661. \newdimen\@xi \newdimen\@xii \newdimen\@xiii \newdimen\@xiv
  662. \newdimen\@xpt \newdimen\@xoldpt
  663. \newdimen\@yi \newdimen\@yii \newdimen\@yiii \newdimen\@yiv
  664. \newdimen\@ypt \newdimen\@yoldpt
  665. \def\squine(#1,#2,#3,#4,#5,#6){\setbox\@picbox\hbox{\tencirc q}%
  666.  \global\@xoldpt=#1\unitlength \global\@yoldpt=#4\unitlength \kern\@xoldpt
  667.  \@xi=\@xoldpt \@xii=#2\unitlength \@xiii=#3\unitlength
  668.  \@yi=\@yoldpt \@yii=#5\unitlength \@yiii=#6\unitlength
  669.  \squinerec
  670.  \@xpt=#3\unitlength \@ypt=#6\unitlength \@addpoint
  671.  \raise\@ypt\copy\@picbox}
  672. \newif\iffar
  673. \def\squinerec{\farfalse \testnear\@xi\@xiii \testnear\@yi\@yiii
  674.  \iffar \decast \fi}
  675. \def\testnear#1#2{\@save=#1\advance\@save-#2%
  676.  \ifdim\@save<\z@ \@save=-\@save\fi \ifdim\@save>\p@ \fartrue \fi}
  677. \def\decast{\@xpt=\@xi \advance\@xpt\@xii \divide\@xpt2
  678.  \advance\@xii\@xiii \divide\@xii2
  679.  \@xiv=\@xpt \advance\@xiv\@xii \divide\@xiv2
  680.  \@ypt=\@yi \advance\@ypt\@yii \divide\@ypt2
  681.  \advance\@yii\@yiii \divide\@yii2
  682.  \@yiv=\@ypt \advance\@yiv\@yii \divide\@yiv2
  683.  \begingroup\@xii=\@xpt \@xiii=\@xiv
  684.   \@yii=\@ypt \@yiii=\@yiv \squinerec\endgroup
  685.  \@xpt=\@xiv \@ypt=\@yiv \@addpoint
  686.  \@xi=\@xiv \@yi=\@yiv \squinerec}
  687. \def\@addpoint{%\message{(\the\@xpt,\the\@ypt)}%
  688.  \global\advance\@xoldpt-\@xpt \wd\@picbox=-\@xoldpt
  689.  \raise\@yoldpt\copy\@picbox \global\@xoldpt=\@xpt \global\@yoldpt=\@ypt}
  690.  
  691. % Math operators
  692. \def\2{\mskip-.5mu2\mskip.5mu}
  693. \newmuskip\lessfortimes \lessfortimes=-2mu minus -2mu
  694. \def\cdt{\mskip\lessfortimes\cdot\mskip\lessfortimes}
  695. \def\nullnum{\phantom{0}}
  696. \def\twonullnum{\phantom{00}}
  697. \def\bex{\mskip-2mu}
  698. \def\twoconditions#1#2{_{\scriptstyle#1\atop\scriptstyle#2}}
  699. \def\tworestrictions#1#2{\vcenter{\offinterlineskip
  700.   \halign{\strut\hfil##\hfil\cr#1\cr#2\cr}}}
  701. \def\dts{\mathinner{\ldotp\ldotp}}
  702. \def\[#1]{[\hbox{$\mskip1mu\thickmuskip=\thinmuskip#1\mskip1mu$}]}
  703. \def\bigi[#1\bigr]{\bigl[\hbox{$\thickmuskip=\thinmuskip#1$}\bigr]}
  704. \def\Bigi[#1\Bigr]{\Bigl[\hbox{$\thickmuskip=\thinmuskip#1$}\Bigr]}
  705. \def\prp(#1){(\hbox{$\thickmuskip=\thinmuskip#1$})}
  706. \def\pbigi(#1\bigr){\bigl(\hbox{$\thickmuskip=\thinmuskip#1$}\bigr)}
  707. \def\_#1{\def\next{#1}%
  708.  \ifx\next\risingsign\expandafter\rising\else^{\underline{#1}}\fi}
  709. \def\risingsign{^}
  710. \def\rising#1{^{\overline{#1}}}
  711. \def\dotminus{\mathbin{\buildrel{\hbox{\runhead.}}\over{\smash{-}\vphantom{_2}}}}
  712. \let\divides=\backslash
  713. \def\edivides{\divides\mskip-4mu\divides}
  714. \def\ndivides{\mathpalette\notdiv\relax}
  715. \def\notdiv#1#2{\setbox0=\hbox{$#1\divides$}%
  716.  \vcenter{\hbox to\wd0{$\hss\scriptscriptstyle/\hss$}}\kern-\wd0
  717.  \vcenter{\hbox to\wd0{$\hss\kern.5pt\scriptscriptstyle/\hss$}}\kern-\wd0
  718.  \box0\relax}
  719. \def\spec{\mathop{\rm Spec}}
  720. \def\half{{1\over2}}
  721. \def\rp{\mathchar"323F } % relatively prime
  722. \def\lcm{\mathop{\rm lcm}}
  723. \def\And{\quad{\rm and}\quad}
  724. \let\==\equiv
  725. \def\tmod#1{(mod~$#1$)}
  726. \let\implies=\Longrightarrow
  727. \def\?{\hbox{!`}} % subfactorial
  728. \def\hyp{\mathop{F{}}\nolimits\hyper}
  729. \def\tightplus{\medmuskip=1.5mu\relax}
  730. \def\hyper#1#2#3{\mathchoice{\tightplus
  731.    \hbox{$\displaystyle\biggl({#1\atop#2}\Big\vert\,{#3}\!\biggr)$}}%
  732.  {\bigl({#1\atop#2}\vert\mskip2mu#3\bigr)}%
  733.  {}{}}    % used only in D and T styles
  734. %\def\hypk_#1{\mathop{F{}}_{#1}\nolimits\hyper} % confl with mFn convention
  735. \def\hypk_#1#2#3#4{\mathop{F{}}\mathchoice{\tightplus
  736.   \hbox{$\displaystyle\biggl({#2\atop#3}\Big\vert\,{#4}\!\biggr)$}%
  737.   \lower\fontdimen11\mathsym\hbox{$\scriptstyle\!#1$}}%
  738.  {\bigl({#2\atop#3}\vert\mskip2mu#4\bigr)\lower\fontdimen12\mathsym
  739.    \hbox{$\scriptstyle\!#1$}}%
  740.  {}{}}    % used only in D and T styles
  741. \def\double(#1\choose#2){\mathchoice{\biggl(\!\!{#1\choose#2}\!\!\biggr)}
  742.  {\bigl(\!{#1\choose#2}\!\bigr)}{}{}} % only D and T styles
  743. \def\hypstrut{\vphantom{_1\_^k}} % if there's another denominator with \_^k
  744. \def\deg{\mathop{\rm deg}}
  745. \def\Bscr{{\scr B}}
  746. \def\Escr{{\scr E}}
  747. \def\Fscr{{\scr F}}
  748. \def\Pscr{{\scr P}}
  749. \def\adj{\relbar\joinrel\relbar} % adjacent in a graph
  750. \let\<=\langle \let \>=\rangle
  751. \def\Pr{\mathop{\rm Pr}\nolimits}
  752. \def\Mean{\mathop{\rm Mean}\nolimits}
  753. \def\Var{\mathop{\rm Var}\nolimits}
  754. \def\between{\big\vert\hbox{\vphantom)}} % \between_a^b
  755. {\catcode`\'=\active \gdef'{^\bgroup\mskip2mu\prim@s}} % more space before '
  756. \def\array#1[#2]{\hbox{\tt#1[$#2$]}}
  757. \def\given{\mskip1mu\vert\mskip1mu}
  758. \def\euler{\atopwithdelims<>}
  759. \def\Euler#1#2{\mathchoice{\biggl<\mskip-7mu{#1\euler#2}\mskip-7mu\biggr>}%
  760.  {\bigl<\!{#1\euler#2}\!\bigr>}{}{}}
  761. \def\Choose#1#2{\mathchoice{\biggl(\mskip-7mu{#1\euler#2}\mskip-7mu\biggr)}%
  762.  {\bigl(\!{#1\euler#2}\!\bigr)}{}{}}
  763.  
  764. \newbox\phihatbox \newbox\scrphihatbox
  765. \setbox\phihatbox=\hbox{$\phi$} \ht\phihatbox=1ex
  766. \setbox\scrphihatbox=\hbox{$\scriptstyle\phi$}
  767.   \ht\scrphihatbox=\fontdimen5\mathsublet
  768. \setbox\phihatbox=\hbox{$\widehat{\box\phihatbox}$}
  769. \setbox\scrphihatbox=\hbox{$\hat{\box\scrphihatbox}$}
  770. \def\phihat{\mathchoice{\copy\phihatbox}{\copy\phihatbox}%
  771.  {\copy\scrphihatbox}{{\hat\phi}}}
  772.  
  773. \newbox\mathsizebox
  774. \def\setmathsize#1{\global\setbox\mathsizebox=\hbox{\displaymath#1$}}
  775. \def\mathsize#1{\hbox to\wd\mathsizebox{\displaymath#1$\hss}}
  776.  
  777. \newbox\sqrtstrutbox
  778. \setbox\sqrtstrutbox=\hbox{\vrule height10.5pt width\z@}
  779. \def\strutsqrt{\copy\sqrtstrutbox\sqrt}
  780.  
  781. \newbox\Sqbox % for sum of squares
  782. \setbox\Sqbox=\vbox{\tenrm\hrule height.6pt\kern-.6pt
  783.   \hbox to1.5ex{\vrule height1.5ex width.6pt\hss\vrule width.6pt}\kern-.6pt
  784.   \hrule height.3pt depth.3pt}
  785. \def\Sq{\mskip1.5mu\copy\Sqbox\mskip1.5mu}
  786.  
  787. % primitive index macros
  788. % "stuff for index" will go into a file for sorting and into normal text
  789. % "!stuff for index" will go into the file only
  790. \expandafter\def\expandafter\dospecials\expandafter{\dospecials\do\"}
  791. \def\hexcode{"} \catcode`\"=\active
  792.  
  793. \newif\ifinxmode
  794. \newwrite\inx \newwrite\bnx
  795. \newbox\inxbox
  796.  
  797. \newif\ifsilent
  798. \def\beginxref{\futurelet\next\beginxrefswitch}
  799. \def\beginxrefswitch{\ifx\next!\let\next=\silentxref
  800.   \else\silentfalse\let\next=\xref\fi \next}
  801. \def\silentxref!{\silenttrue\xref}
  802. \let"=\beginxref
  803.  
  804. \def\xref#1"{\ifinxmode\edef\text{#1}\makexref\fi
  805.   \ifsilent\ignorespaces\else#1\fi}
  806. \def\makexref{\global\setbox\inxbox=%
  807.    \vbox{\unvbox\inxbox\allowbreak\hbox{\inxstyle\text}}%
  808.   \xdef\writeit{\write\inx{\text\space!\space
  809.      \noexpand\number\pageno.}}\writeit}
  810.  
  811. % Final considerations
  812. \catcode`\@=\active \def@{\mskip1mu\relax}
  813. \expandafter\def\expandafter\dospecials\expandafter{\dospecials\do\@}
  814.  
  815. \hyphenation{logical Mac-Mahon hyper-geo-metric hyper-geo-met-rics Ber-noulli}
  816.  
  817. \preprintfalse        % WE ARE MAKING THE REAL BOOK!
  818. \inxmodetrue        % WE ARE PREPARING A ROUGH INDEX
  819. \showmissestrue        % THE REFERENCES SHOULD ALL BE READY NOW
  820.  
  821. \ifinxmode\immediate\openout\inx=\jobname.inx \fi % file for index reminders
  822. \ifinxmode\immediate\openout\bnx=\jobname.bnx \fi % file for bib reminders
  823.  
  824. % To make the book:
  825. % First TeX BIB, to get BIB.REF correct. (Must have \cite entries.)
  826. % Then TeX CHAP1..CHAP9, PREF, ANS, CRED, FRONT, CONT.
  827. % Then make BNX file from individual *.BNX files including BIB.BNX.
  828. % Then reTeX BIB.
  829. % *.INX files are raw data only. Index and Contents are prepared by hand.
  830.  
  831. % To produce only a subset of pages, put the page numbers on separate
  832. % lines in a file called pages.tex, ended by 999
  833. % WARNING: This will screw up the .grf file! Save it, then restore it.
  834. % WARNING: This may screw up the .ref file (if there are \tabrefs). Ditto.
  835. \let\Shipout=\shipout
  836. \newread\pages \newcount\nxtpg \openin\pages=pages
  837. \def\getnxtpg{\ifeof\pages\else
  838.  {\endlinechar=-1\read\pages to\next
  839.   \ifx\next\empty % in this case we should have eof now
  840.   \else\global\nxtpg=\next\fi}\fi}
  841. \ifeof\pages\else\message{OK, I'll ship only the requested pages!}
  842.  \getnxtpg\fi
  843. \def\shipout{\ifeof\pages\let\next=\Shipout
  844.  \else\ifnum\pageno=\nxtpg\getnxtpg\let\next=\Shipout
  845.   \else\let\next=\Tosspage\fi\fi \next}
  846. \newbox\garbage \def\Tosspage{\deadcycles=0\setbox\garbage=}
  847.