diff -rc1 ../old/cm/romanl.mf ./cm/romanl.mf
*** ../old/cm/romanl.mf	Fri Aug 11 12:01:41 1989
--- ./cm/romanl.mf	Sun Mar 25 12:59:21 1990
***************
*** 300,302 ****
  pos3(dot_diam,0); pos4(dot_diam,90);
! if serifs: x3r=max(x1r,x1+.5(dot_diam-tiny)-.2jut) else: x3=x1-.5 fi;
  top y4r=h+1;
--- 300,303 ----
  pos3(dot_diam,0); pos4(dot_diam,90);
! if serifs: x3r=max(x1r,hround(x1+.5dot_diam-.2jut)-.5tiny)
! else: x3=x1-.5 fi;
  top y4r=h+1;
diff -rc1 ../old/cm/symbol.mf ./cm/symbol.mf
*** ../old/cm/symbol.mf	Sat Aug 12 20:27:43 1989
--- ./cm/symbol.mf	Sun Mar 25 12:59:29 1990
***************
*** 1,3 ****
  % This file defines the symbols of a \TeX\ math symbol font.
! % Character codes \0000--\00100 and \0133--\0177 are generated.
  
--- 1,3 ----
  % This file defines the symbols of a \TeX\ math symbol font.
! % Character codes \0000--\0100 and \0133--\0177 are generated.
  
diff -rc1 ../old/errata/cm85.bug ./errata/cm85.bug
*** ../old/errata/cm85.bug	Fri Aug 11 22:11:28 1989
--- ./errata/cm85.bug	Sun Mar 25 12:59:38 1990
***************
*** 1106,1107 ****
--- 1106,1116 ----
  
+ @x in ROMANL, the letter i (this change by Jonathan Kew makes the dot rounder)
+ if serifs: x3r=max(x1r,x1+.5(dot_diam-tiny)-.2jut) else: x3=x1-.5 fi;
+ @y
+ if serifs: x3r=max(x1r,hround(x1+.5dot_diam-.2jut)-.5tiny)
+ else: x3=x1-.5 fi;
+ @z
+ 
+ -----------Here I draw the line with respect to further changes
+ 
  (I sincerely hope there won't be any more!)
diff -rc1 ../old/errata/errata.tex ./errata/errata.tex
*** ../old/errata/errata.tex	Sun Jan  7 16:09:20 1990
--- ./errata/errata.tex	Sun Mar 25 12:59:43 1990
***************
*** 40,42 ****
  version of {\sl The \slMF\kern1ptbook\/} are the same as corrections
! to Volume~C\null.  Some of the corrections below may have already been made in
  reprintings of the books. Hundreds of changes, too many to list here,
--- 40,42 ----
  version of {\sl The \slMF\kern1ptbook\/} are the same as corrections
! to Volume~C\null.  Some of the corrections below have already been made in
  reprintings of the books. Hundreds of changes, too many to list here,
***************
*** 49,50 ****
--- 49,56 ----
  
+ \bugonpage A99, line 4 from the bottom (2/22/90)
+ 
+ \ninepoint\indent
+ to be chosen because there was no feasible
+ way to keep total demerits small.
+ 
  \bugonpage A156, line 2 (11/18/89)
***************
*** 55,56 ****
--- 61,70 ----
  
+ \bugonpage A171, lines 24--26 (3/13/90)
+ 
+ \ninepoint\noindent
+ formula produces a result exactly equivalent to
+ `|\left(|\<subformula>|\right)|', when the \<subformula> doesn't end
+ with Punct, except that the {delimiters} are forced to
+ be of the |\big| size regardless of the height and depth of the subformula.
+ 
  \bugonpage A193, lines 16--18 (12/2/89)
***************
*** 92,93 ****
--- 106,133 ----
  
+ \bugonpage A286, lines 30--32 (3/13/90)
+ 
+ \ninepoint\noindent
+ reading and expanding this \cstok{par}
+ token, \TeX\ will see the \<vertical command> token again. \ (The current
+ meaning of the control sequence ^|\par| will be used; \cstok{par} might no
+ longer stand for \TeX's |\par| primitive.)
+ 
+ \bugonpage A290, lines 12--13 (3/24/90)
+ 
+ \ninepoint\noindent
+ simply a single Ord atom without subscripts or superscripts,
+ or an Acc whose nucleus is an Ord, the
+ enclosing braces are effectively removed.
+ 
+ \bugonpage A340, nonblank line 11 (3/13/90)
+ 
+ \tenpoint\noindent
+ |\topglue 1in % This makes an inch of blank space (1in=2.54cm).|
+ 
+ \bugonpage A342, line 6 ( 3/13/90)
+ 
+ \tenpoint\noindent
+ |\topglue| but not |\hglue|. It does not
+ illustrate |\raggedright| setting of para-\cutpar
+ 
  \bugonpage A346, lines 20--21 (12/3/89)
***************
*** 132,133 ****
--- 172,178 ----
  
+ \bugonpage A352, new line before line 6 from the bottom (3/13/90)
+ 
+ \ninepoint\noindent
+ |\def\topglue{\nointerlineskip \vglue-\topskip \vglue} % for top of page|
+ 
  \bugonpage A355, line 8 from the bottom (12/3/89)
***************
*** 158,159 ****
--- 203,210 ----
  
+ \bugonpage A444, line 4 (3/13/90)
+ 
+ \ninepoint\noindent
+ Shift box~$x$ down by ${1\over2}\bigl(h(x)-d(x)\bigr)
+ -a$, where $a=\sigma_{22}$, so that the operator character\cutpar
+ 
  \bugonpage A450, line 8 (12/3/89)
***************
*** 226,227 ****
--- 277,287 ----
  
+ \bugonpage A479, new entry (3/13/90)
+ 
+ \eightpoint
+ |\topglue|, {\it340}, $\underline{352}$.
+ 
+ \bugonpage A480, right column (3/13/90)
+ 
+ \eightpoint
+ |\vglue|, $\underline{352}$, {\it408}.
  
***************
*** 249,250 ****
--- 309,334 ----
  
+ \bugonpage C220, top line (3/13/90)
+ 
+ \ninepoint\noindent
+ modes you get into by hitting
+ `|S|', `|R|', or `|Q|', respectively, in response to error messages\cutpar
+ 
+ \bugonpage C252, line 16 (3/13/90)
+ 
+ \ninepoint\indent
+ | for i:=1 upto n_windows: display blankpicture inwindow i; endfor|
+ 
+ \bugonpage C264, lines 4--6 from the bottom (3/24/90)
+ 
+ \ninepoint\noindent
+ |vardef |^|counterclockwise|| primary c =|\par\noindent
+ | if turningcheck>0:|\par\noindent
+ |  interim |^|autorounding||:=0;|\par\noindent
+ |  if |^|turningnumber|| c <= 0: reverse fi fi c enddef;|
+ 
+ \bugonpage C306, line 6 (3/13/90)
+ 
+ \ninepoint\noindent
+ | ligtable "'": "'" =: oct"042",                         % close quotes|
+ 
  \bugonpage C309, second line from bottom (11/18/89)
***************
*** 272,273 ****
--- 356,408 ----
  \def\dashto{\mathrel{\hbox{-\kern-.05em}\mkern3.9mu\hbox{-\kern-.05em}}}
+ 
+ \bugonpage E325, line 13 (3/13/90)
+ 
+ \ninepoint\noindent
+ {\bf if} \\{serifs}: $x_{3r}=\max(x_{1r},{\rm hround}(x_1+.5\\{dot\_diam}
+  -.2\\{jut})-.5\\{tiny})$\par\noindent
+ {\bf else}: $x_3=x_1-.5$ {\bf fi};
+ 
+ \bugonpage E483, line 4 (3/13/90)
+ 
+ \ninepoint
+ \rightline{\% Character codes \oct{000}--\oct{100} and \oct{133}--\oct{177}
+  are generated.}
+ 
+ \bugonpage E544, line 5 (3/13/90)
+ 
+ \ninepoint\noindent
+ \hskip 3em\vdots\hskip2em\raise2pt\hbox{(the rest of the
+  program for `$\gamma$' in |greekl| comes here)}
+ 
+ \bugonpage E557, line 9 (3/13/90)
+ 
+ \ninepoint
+ \rightline{\sl`Nevermore---Ah nevermore.'\thinspace''}
+ 
+ \bugonpage E558, line 21 (3/13/90)
+ 
+ \eightpoint\noindent
+ |Clasp a rare and radiant maiden whom the angels name Lenore."|
+ 
+ \bugonpage E570, lines 27--28 look better with proper skewchars (3/13/90)
+ 
+ \begingroup
+ \tenpoint\bf
+ \textfont0=\tenbf \scriptfont0=\sevenbf
+ \font\boldi=cmmib10 \font\boldsy=cmbsy10
+ \skewchar\boldi='177 \skewchar\boldsy='60
+ \textfont1=\boldi
+ \textfont2=\boldsy
+ \noindent Here's some bold 10-point math:
+ ${\hat A}^\Gamma_0
+ +{\check B}^\Delta_1
+ -{\tilde C}^\Theta_2
+ \times{\acute D}^\Lambda_3
+ /{\grave E}^\Xi_4
+ \oplus{\dot F}^\Pi_5
+ \ominus{\ddot G}^\Sigma_6
+ \otimes{\breve H}^\Phi_7
+ \oslash{\bar I}^\Psi_8
+ \odot{\vec J}^{\,\Omega}_9$.
+ \endgroup
  
diff -rc1 ../old/errata/errorlog.tex ./errata/errorlog.tex
*** ../old/errata/errorlog.tex	Sun Jan  7 22:23:03 1990
--- ./errata/errorlog.tex	Sun Mar 25 13:00:08 1990
***************
*** 1430,1432 ****
  G552. Give more power to |\let|: the right-hand side needn't be a control
!         sequence. @1221
  I553. Amend \\{show_context} to say
--- 1430,1432 ----
  G552. Give more power to |\let|: the right-hand side needn't be a control
! 	sequence. @1221
  I553. Amend \\{show_context} to say
***************
*** 2252,2254 ****
  A854. Replace my stupid algorithm
! 	for fixed-point multiplication of negatives (W. G. Sullivan). @572
  * 12 Dec 1987
--- 2252,2254 ----
  A854. Replace my stupid algorithm
! 	for fixed-point multiplication of negatives (WGS). @572
  * 12 Dec 1987
***************
*** 2295,2297 ****
  * 17 Feb 1989
! D870. Avoid spurious error message for |\aftergroup\relax\dump| by avoiding
  	inaccessible |\aftergroup| tokens (FM and RS). @280
--- 2295,2297 ----
  * 17 Feb 1989
! D870\>758. Avoid spurious error message for |\aftergroup\relax\dump| by avoiding
  	inaccessible |\aftergroup| tokens (FM and RS). @280
***************
*** 2308,2310 ****
  	mechanism has been fully initialized, for example when the
! 	command line exceeds the buffer size (W. G. Sullivan). @31
  * 16 Aug 1989
--- 2308,2310 ----
  	mechanism has been fully initialized, for example when the
! 	command line exceeds the buffer size (WGS). @31
  * 16 Aug 1989
***************
*** 2312,2314 ****
  * 31 Aug 1989
! C441\>876. Increase the number of tokens shown by \\{token\_show}
  	(J. Lavagnino). @295
--- 2312,2314 ----
  * 31 Aug 1989
! C876\>441. Increase the number of tokens shown by \\{token\_show}
  	(J. Lavagnino). @295
***************
*** 2316,2318 ****
  # The recent TUG meeting turned out to be an extend-\TeX-for-the-nineties
!         party! I agreed that some extensions for non-English languages
  	ought to be made while I still knew how to do them. (In other words,
--- 2316,2318 ----
  # The recent TUG meeting turned out to be an extend-\TeX-for-the-nineties
! 	party! I agreed that some extensions for non-English languages
  	ought to be made while I still knew how to do them. (In other words,
***************
*** 2319,2321 ****
  	I broke my firm commitment to keeping \TeX\ completely stable;
! 	but in this case nobody objected.) The following nine changes
  	were coded during the month of September.
--- 2319,2321 ----
  	I broke my firm commitment to keeping \TeX\ completely stable;
! 	but in this case nobody objected.) The following eleven changes
  	were coded during the month of September.
***************
*** 2324,2326 ****
  G879. Install major change allowing multiple hyphenation tables
!         (M. Ferguson). @923
  G880. Introduce new parameters |\lefthyphenmin| and |\righthyphenmin|. @923
--- 2324,2326 ----
  G879. Install major change allowing multiple hyphenation tables
! 	(M. Ferguson). @923
  G880. Introduce new parameters |\lefthyphenmin| and |\righthyphenmin|. @923
***************
*** 2327,2329 ****
  G881. Introduce major new ligature capabilities including implicit
!       boundary characters. @908,1037
  G882. Install new |\inputlineno| feature suggested by MDS. @424
--- 2327,2329 ----
  G881. Introduce major new ligature capabilities including implicit
! 	boundary characters. @908,1037
  G882. Install new |\inputlineno| feature suggested by MDS. @424
***************
*** 2333,2336 ****
  G886. Install new |\errorcontextlines| feature suggested by FM. @311
! S887. Recover from anomaly when |char_warning| in hyphenation clobbers
!       |old_setting|. @863
  P888. Make it easier to change the format extension (Don Hosek). @520,1328
--- 2333,2336 ----
  G886. Install new |\errorcontextlines| feature suggested by FM. @311
! S887. Recover from anomaly when hyphenation |char_warning| clobbers
! 	|old_setting|. @863
  P888. Make it easier to change the format extension (Don Hosek). @520,1328
***************
*** 2339,2344 ****
  * 22 Nov 1989
! S890\>856. Prevent \\{save\_stack} conflicts in cases like
!   |{\hbox\expandafter{\csname\endcsname}}| (W. G. Sullivan). @645,1117
  S891\>858. System-dependent parts of file names must be addressed relatively,
!   not absolutely (FM and RS). @516,517
  * 3 Dec 1989
--- 2339,2345 ----
  * 22 Nov 1989
! S890\>856. Prevent \\{save\_stack} conflicts in
! 	|{\hbox\expandafter{\csname\endcsname}}| and\kern-3pt\break
! 	 similar constructions (WGS). @645,1117
  S891\>858. System-dependent parts of file names must be addressed relatively,
! 	not absolutely (FM and RS). @516,517
  * 3 Dec 1989
***************
*** 2345,2353 ****
  G892\>880. Allow different hyphenmins in the same paragraph (M. Ferguson). @1376
! S893. Distinguish |\par| from characters on |\if| tests. (M. van Leeuwen). @334
  S894\>378. Alignments need to be more robust against malicious
!   attacks (M. van Leeuwen). @782
! C895. Don't let kerns in discretionaries disappear at breaks (M. van Leeuwen).
!   @869
  Q896\>881. Make the new hyphenation reconstruction procedure less cautious,
!   so that it doesn't lose hyphens found by the old method. @914
  * 11 Dec 1989
--- 2346,2353 ----
  G892\>880. Allow different hyphenmins in the same paragraph (M. Ferguson). @1376
! S893. Distinguish |\par| from characters on |\if| tests. (MVL). @334
  S894\>378. Alignments need to be more robust against malicious
! 	attacks (MVL). @782
! C895. Don't let kerns in discretionaries disappear at breaks (MVL). @869
  Q896\>881. Make the new hyphenation reconstruction procedure less cautious,
! 	so that it doesn't lose hyphens found by the old method. @914
  * 11 Dec 1989
***************
*** 2355,2359 ****
  * 18 Dec 1989
! G898. Allow access to page totals in \output routines (FM and Chris Rowley).
!   @421
! 
  # We're now up to Version 3.0; I sincerely hope all bugs have been found.
--- 2355,2378 ----
  * 18 Dec 1989
! G898. Allow access to page totals in |\output| routines (FM and Chris Rowley).
! 	@421      
! * 22 Jan 1990
! R899\>611. Recognize more cases of unbalanced |\output| (CET). @1026
! * 29 Jan 1990
! S900\>758. Make |\aftergroup| work properly after |\eqno| (Michael Downes).
! 	@1194
! * 1 Feb 1990
! S901\>878. Fix one more case of \\{end\_line\_char\_inactive} (WGS). @360
! * 22 Feb 1990
! R902. Don't lose the last active node when total demerits are very high (FM).
! 	@836,854
! * 13 Mar 1990
! D903. Doublecheck math fonts after making equation number (MVL). @1194
! D904. Don't forget to rule out charnodes before testing \\{type} (MVL).
! 	@805,1202
! * 23 Mar 1990
! F905\>881. Don't change the font of punctuation preceding a hyphenated word
! 	(Scott C. Allendorf). @903
! I906. Balance the parentheses shown on the terminal during normal runs. @1335
! E907. Optimize |\ifx\p\q| after |\let\p=\q| (MVL). @508
! S907. Treat migration properly in displays (MVL). @1199,1205
  # We're now up to Version 3.0; I sincerely hope all bugs have been found.
***************
*** 2371,2371 ****
--- 2390,2392 ----
  PB  Peter Breitenlohner (ditto)
+ WGS Wayne G. Sullivan (ditto)
+ MVL Marc van Leeuwen
diff -rc1 ../old/errata/mf84.bug ./errata/mf84.bug
*** ../old/errata/mf84.bug	Mon Jan 22 10:10:06 1990
--- ./errata/mf84.bug	Sun Mar 25 14:01:42 1990
***************
*** 1791,1799 ****
  
! 553. (Change made by Joe Weening as per message from DEK.)
! @x module 1119
! @!excess:halfword; {the list is this much too long}
  @y
! @!excess:integer; {the list is this much too long}
  @z
  
! 554. (I sincerely hope that there won't be any more)
--- 1791,1856 ----
  
! 553. Global variable used prematurely in do_add_to (Alan Jeffrey, 9 Feb 90)
! @x module 403
! @!cur_path_type:double_path_code..also_code; {likewise}
  @y
! @!cur_path_type:double_path_code..contour_code; {likewise}
  @z
+ @x module 1059
+ begin get_x_next; var_flag:=thing_to_add; scan_primary;
+ if cur_type<>token_list then
+   @<Abandon edges command because there's no variable@>
+ else  begin lhs:=cur_exp; cur_path_type:=cur_mod;@/
+   cur_type:=vacuous; get_x_next; scan_expression;
+   if cur_path_type=also_code then @<Augment some edges by others@>
+ @y
+ @!add_to_type:double_path_code..also_code; {modifier of \&{addto}}
+ begin get_x_next; var_flag:=thing_to_add; scan_primary;
+ if cur_type<>token_list then
+   @<Abandon edges command because there's no variable@>
+ else  begin lhs:=cur_exp; add_to_type:=cur_mod;@/
+   cur_type:=vacuous; get_x_next; scan_expression;
+   if add_to_type=also_code then @<Augment some edges by others@>
+ @z
+ @x module 1064
+ else  begin lhs:=null;
+ @y
+ else  begin lhs:=null; cur_path_type:=add_to_type;
+ @z
+ 
+ 554. Balance the parens showing on the terminal (for Lispers).
+ @x module 631
+ @!in_open : 0..max_in_open; {the number of lines in the buffer, less one}
+ @y
+ @!in_open : 0..max_in_open; {the number of lines in the buffer, less one}
+ @!open_parens : 0..max_in_open; {the number of open text files}
+ @z
+ @x module 657
+ in_open:=0; max_buf_stack:=0;
+ @y
+ in_open:=0; open_parens:=0; max_buf_stack:=0;
+ @z
+ @x module 681
+   begin print_char(")"); force_eof:=false;
+   update_terminal; {show user that file has been read}
+ @y
+   begin print_char(")"); decr(open_parens);
+   update_terminal; {show user that file has been read}
+   force_eof:=false;
+ @z
+ @x module 793
+ print_char("("); print(name); update_terminal;
+ @y
+ print_char("("); incr(open_parens); print(name); update_terminal;
+ @z
+ @x module 1209
+ if job_name=0 then open_log_file;
+ @y
+ if job_name=0 then open_log_file;
+ while open_parens>0 do
+   begin print(" )"); decr(open_parens);
+   end;
+ @z
+ 
+ -----------Here I draw the line with respect to further changes
  
! 555. (I sincerely hope that there won't be any more)
diff -rc1 ../old/errata/tex82.bug ./errata/tex82.bug
*** ../old/errata/tex82.bug	Mon Jan  8 06:27:02 1990
--- ./errata/tex82.bug	Sun Mar 25 13:00:46 1990
***************
*** 7831,7833 ****
  
! 380. (I sincerely hope that there won't be any more)
  
--- 7831,8118 ----
  
! 380. Slightly more robust recovery and detection of \output anomalies.
! (Suggested by Chris Thompson, provoked by George Russell, January 1990)
! @x module 1026
! begin if loc<>null then @<Recover from an unbalanced output routine@>;
! @y
! begin if (loc<>null) or 
!  ((token_type<>output_text)and(token_type<>backed_up)) then
!   @<Recover from an unbalanced output routine@>;
! @z
! @x module 1027
! help2("Your sneaky output routine has fewer real {'s than }'s.")@/
! @y
! help2("Your sneaky output routine has problematic {'s and/or }'s.")@/
! @z
! 
! 381. \eqno\aftergroup*$$ should yield * after the $$ (Michael Downes, 29 Jan 90)
! @x module 1194
!   begin cur_mlist:=p; cur_style:=text_style; mlist_penalties:=false;
! @y
!   begin @<Check that another \.\$ follows@>;
!   cur_mlist:=p; cur_style:=text_style; mlist_penalties:=false;
! @z
! @x ibid
! else  begin @<Check that another \.\$ follows@>;
! @y
! else  begin if a=null then @<Check that another \.\$ follows@>;
! @z
! 
! 382. Missed a case in the 8-bit change (Wayne Sullivan, 1 Feb 1990)
! @x module 360
!     begin if (end_line_char<0)or(end_line_char>127) then incr(limit);
! @y
!     begin if end_line_char_inactive then incr(limit);
! @z
! 
! 383. Linebreaking needs to be more robust when total demerits get
! very high (Frank Mittelbach, 22 Feb 1990)
! @x module 830
! @!artificial_badness:boolean; {has |b| been forced to zero?}
! @y
! @!artificial_demerits:boolean; {has |d| been forced to zero?}
! @z
! @x module 833 (this change is cosmetic only)
! @!minimal_demerits:array[very_loose_fit..tight_fit] of scaled; {best total
!   demerits known for current line class and position, given the fitness}
! @!minimum_demerits:scaled; {best total demerits known for current line class
! @y
! @!minimal_demerits:array[very_loose_fit..tight_fit] of integer; {best total
!   demerits known for current line class and position, given the fitness}
! @!minimum_demerits:integer; {best total demerits known for current line class
! @z
! @x module 836 here we want to ensure that total_demerits < awful_bad
! minimum_demerits:=minimum_demerits+abs(adj_demerits);
! @y
! if abs(adj_demerits)>=awful_bad-minimum_demerits then
!   minimum_demerits:=awful_bad-1
! else minimum_demerits:=minimum_demerits+abs(adj_demerits);
! @z
! @x module 851
! begin @!stat artificial_badness:=false;@+tats@/
! @y
! begin artificial_demerits:=false;@/
! @z
! @x module 854
!   begin b:=0; {set badness zero, this break is forced}
!   @!stat artificial_badness:=true;@+tats
!   end
! @y
!   artificial_demerits:=true {set demerits zero, this break is forced}
! @z
! @x module 855
! @<Compute the demerits, |d|, from |r| to |cur_p|@>;
! @y
! if artificial_demerits then d:=0
! else @<Compute the demerits, |d|, from |r| to |cur_p|@>;
! @z
! @x module 856
! if artificial_badness then print_char("*")@+else print_int(b);
! @.*\relax@>
! print(" p="); print_int(pi);
! print(" d="); print_int(d);
! @y
! if b>inf_bad then print_char("*")@+else print_int(b);
! @.*\relax@>
! print(" p="); print_int(pi); print(" d=");
! if artificial_demerits then print_char("*")@+else print_int(d);
! @z
! @x module 859
! d:=line_penalty+b; d:=d*d;
! @y
! begin d:=line_penalty+b;
! if abs(d)>=10000 then d:=100000000@+else d:=d*d;
! @z
! @x ibid
! if abs(fit_class-fitness(r))>1 then d:=d+adj_demerits
! @y
! if abs(fit_class-fitness(r))>1 then d:=d+adj_demerits;
! end
! @z
! 
! 384. Math fonts may disappear outside of \eqno (Marc van Leeuwen).
! @x module 1194
!   if danger then flush_math;
! @y
!   danger:=false;
!   @<Check that the necessary fonts for math symbols are present;
!     if not, flush the current math lists and set |danger:=true|@>;
! @z
! 
! 385. Forgot to rule out charnode when testing for node type (Marc van Leeuwen).
! @x module 805
!   begin if type(q)=unset_node then
!     @<Set the unset box |q| and the unset boxes in it@>
!   else if type(q)=rule_node then
!     @<Make the running dimensions in rule |q| extend to the
!       boundaries of the alignment@>;
! @y
!   begin if not is_char_node(q) then
!     if type(q)=unset_node then
!       @<Set the unset box |q| and the unset boxes in it@>
!     else if type(q)=rule_node then
!       @<Make the running dimensions in rule |q| extend to the
!         boundaries of the alignment@>;
! @z
! @x module 903
! if type(hb)=ligature_node then if odd(subtype(hb)) then
! @y
! if not is_char_node(hb) then
!  if type(hb)=ligature_node then if odd(subtype(hb)) then
! @z
! @x module 1202
!   if p<>null then if type(p)=glue_node then d:=0;
! @y
!   if p<>null then if not is_char_node(p) then if type(p)=glue_node then d:=0;
! @z
! 
! 386. Don't change the font of punctuation before a hyphenated word
!      (Scott Allendorf, reported 7 Mar 90)
! @x module 895
! label common_ending,done,found,found1,not_found,not_found+1,exit;
! @y
! label common_ending,done,found,found1,found2,not_found,exit;
! @z
! @x module 903
! if is_char_node(ha) then
!   begin init_list:=ha; init_lig:=false; hu[0]:=qo(character(ha));
!   end
! else if type(ha)=ligature_node then
!   begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1);
!   hu[0]:=qo(character(lig_char(ha)));
!   if init_list=null then if init_lft then
!     begin hu[0]:=256; init_lig:=false;
!     end; {in this case a ligature will be reconstructed from scratch}
!   free_node(ha,small_node_size);
!   end
! else goto not_found+1; {no punctuation found}
! s:=cur_p; {we have |cur_p<>ha| because |type(cur_p)=glue_node|}
! while link(s)<>ha do s:=link(s);
! j:=0; goto common_ending;
! not_found+1: j:=1; s:=ha; init_list:=null;
! if not is_char_node(r) then if type(r)=ligature_node then
!  if subtype(r)>1 then
!   begin j:=0; hu[0]:=256; init_lig:=false;
!   end;
! @y
! if is_char_node(ha) then
!   if font(ha)<>hf then goto found2
!   else begin init_list:=ha; init_lig:=false; hu[0]:=qo(character(ha));
!     end
! else if type(ha)=ligature_node then
!   if font(lig_char(ha))<>hf then goto found2
!   else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1);
!     hu[0]:=qo(character(lig_char(ha)));
!     if init_list=null then if init_lft then
!       begin hu[0]:=256; init_lig:=false;
!       end; {in this case a ligature will be reconstructed from scratch}
!     free_node(ha,small_node_size);
!     end
! else begin {no punctuation found; look for left boundary}
!   if not is_char_node(r) then if type(r)=ligature_node then
!    if subtype(r)>1 then goto found2;
!   j:=1; s:=ha; init_list:=null; goto common_ending;
!   end;
! s:=cur_p; {we have |cur_p<>ha| because |type(cur_p)=glue_node|}
! while link(s)<>ha do s:=link(s);
! j:=0; goto common_ending;
! found2: s:=ha; j:=0; hu[0]:=256; init_lig:=false; init_list:=null;
! @z
! 
! 387. Balance the parens showing on the terminal (for Lispers).
! @x module 304
! @!in_open : 0..max_in_open; {the number of lines in the buffer, less one}
! @y
! @!in_open : 0..max_in_open; {the number of lines in the buffer, less one}
! @!open_parens : 0..max_in_open; {the number of open text files}
! @z
! @x module 331
! in_open:=0; max_buf_stack:=0;
! @y
! in_open:=0; open_parens:=0; max_buf_stack:=0;
! @z
! @x module 362
!   begin print_char(")"); force_eof:=false;
!   update_terminal; {show user that file has been read}
! @y
!   begin print_char(")"); decr(open_parens);
!   update_terminal; {show user that file has been read}
!   force_eof:=false;
! @z
! @x module 537
! print_char("("); print(name); update_terminal; state:=new_line;
! @y
! print_char("("); incr(open_parens); print(name); update_terminal;
! state:=new_line;
! @z
! @x module 1334
! if job_name=0 then open_log_file;
! @y
! if job_name=0 then open_log_file;
! while open_parens>0 do
!   begin print(" )"); decr(open_parens);
!   end;
! @z
! 
! 388. Optimize \ifx\p\q after \let\p=\q (Marc van Leeuwen says that
!   AmS-TeX uses this a lot).
! @x module 508
!   while (p<>null)and(q<>null) do
!   if info(p)<>info(q) then p:=null
!   else  begin p:=link(p); q:=link(q);
!     end;
! b:=((p=null)and(q=null));
! @y
! if p=q then b:=true
! else begin while (p<>null)and(q<>null) do
!     if info(p)<>info(q) then p:=null
!     else  begin p:=link(p); q:=link(q);
!       end;
!   b:=((p=null)and(q=null));
!   end;
! @z
! @x module 538 (while we're at it, might as well optimize this too)
! begin if not input_ln(cur_file,false) then do_nothing;
! @y
! begin if input_ln(cur_file,false) then do_nothing;
! @z
! @x module 1020 (and this)
! else  begin wait:=false; s:=ins_ptr(p);
!   link(last_ins_ptr(r)):=s; s:=last_ins_ptr(r);
! @y
! else  begin wait:=false; s:=last_ins_ptr(r); link(s):=ins_ptr(p);
! @z
! 
! 389. Treat migration properly in displays (Marc van Leeuwen).
! @x module 1199 (a bad bug that really has bitten)
! adjust_tail:=adjust_head; b:=hpack(p,natural);
! @y
! adjust_tail:=adjust_head; b:=hpack(p,natural); p:=list_ptr(b);
! @z
! @x module 1204
! shift_amount(b):=s+d; append_to_vlist(b);
! if t<>adjust_head then
!   begin link(tail):=link(adjust_head); tail:=t;
!    end
! @y
! shift_amount(b):=s+d; append_to_vlist(b)
! @z
! @x module 1205
!   tail_append(new_penalty(post_display_penalty));
!   end
! else  begin tail_append(new_penalty(post_display_penalty));
!   tail_append(new_param_glue(g2));
!   end
! @y
!   g2:=0;
!   end;
! if t<>adjust_head then {migrating material comes after equation number}
!   begin link(tail):=link(adjust_head); tail:=t;
!   end;
! tail_append(new_penalty(post_display_penalty));
! if g2>0 then tail_append(new_param_glue(g2))
! @z
! 
! -----------Here I draw the line with respect to further changes
! 
! 390. (I sincerely hope that there won't be any more)
  
diff -rc1 ../old/lib/plain.mf ./lib/plain.mf
*** ../old/lib/plain.mf	Sat Oct  7 12:41:16 1989
--- ./lib/plain.mf	Sun Mar 25 15:31:10 1990
***************
*** 3,5 ****
  % And don't modify the file under any circumstances.
! string base_name, base_version; base_name="plain"; base_version="1.7";
  
--- 3,5 ----
  % And don't modify the file under any circumstances.
! string base_name, base_version; base_name="plain"; base_version="2.0";
  
***************
*** 112,115 ****
  vardef counterclockwise primary c =
!  interim autorounding:=0;
!  if turningnumber c <= 0: reverse fi c enddef;
  
--- 112,116 ----
  vardef counterclockwise primary c =
!  if turningcheck>0:
!   interim autorounding:=0;
!   if turningnumber c <= 0: reverse fi fi c enddef;
  
***************
*** 214,216 ****
  
! def fix_units =	% define the conversion factors, given pixels_per_inch
   mm:=pixels_per_inch/25.4;      cm:=pixels_per_inch/2.54;
--- 215,217 ----
  
! def fix_units = % define the conversion factors, given pixels_per_inch
   mm:=pixels_per_inch/25.4;      cm:=pixels_per_inch/2.54;
diff -rc1 ../old/lib/plain.tex ./lib/plain.tex
*** ../old/lib/plain.tex	Fri Dec  8 20:13:14 1989
--- ./lib/plain.tex	Sun Mar 25 13:06:55 1990
***************
*** 541,542 ****
--- 541,543 ----
  
+ \def\topglue{\nointerlineskip\vglue-\topskip\vglue} % for top of page
  \def\vglue{\afterassignment\vgl@\skip@=}
diff -rc1 ../old/lib/testfont.tex ./lib/testfont.tex
*** ../old/lib/testfont.tex	Sun Jan  7 16:03:18 1990
--- ./lib/testfont.tex	Sun Mar 25 13:06:57 1990
***************
*** 10,11 ****
--- 10,12 ----
  \doublehyphendemerits=30000
+ \hyphenation{prom-i-nent}
  
diff -rc1 ../old/lib/webmac.tex ./lib/webmac.tex
*** ../old/lib/webmac.tex	Sat Feb  8 13:24:31 1986
--- ./lib/webmac.tex	Sun Mar 25 13:06:58 1990
***************
*** 1,3 ****
  % standard macros for WEB listings (in addition to PLAIN.TEX)
! \xdef\fmtversion{\fmtversion+WEBMAC1.4}
  \parskip 0pt % no stretch between paragraphs
--- 1,3 ----
  % standard macros for WEB listings (in addition to PLAIN.TEX)
! \xdef\fmtversion{\fmtversion+WEBMAC4.0} % identifies current set of macros
  \parskip 0pt % no stretch between paragraphs
***************
*** 57,59 ****
  \def\to{\mathrel{.\,.}} % double dot, used only in math mode
! \def\note#1#2.{\Y\noindent{\hangindent2em\baselineskip10pt\eightrm#1 #2.\par}}
  \def\lapstar{\rlap{*}}
--- 57,59 ----
  \def\to{\mathrel{.\,.}} % double dot, used only in math mode
! \def\note#1#2.{\Y\noindent{\hangindent2em\baselineskip10pt\eightrm#1~#2.\par}}
  \def\lapstar{\rlap{*}}
***************
*** 61,63 ****
  \def\defin#1{\global\advance\ind by 2 \1\&{#1 }} % begin `define' or `format'
! \def\A{\note{See also}} % cross-reference for multiply defined section names
  \def\B{\mathopen{\.{@\{}}} % begin controlled comment
--- 61,64 ----
  \def\defin#1{\global\advance\ind by 2 \1\&{#1 }} % begin `define' or `format'
! \def\A{\note{See also section}} % crossref for doubly defined section name
! \def\As{\note{See also sections}} % crossref for multiply defined section name
  \def\B{\mathopen{\.{@\{}}} % begin controlled comment
***************
*** 67,68 ****
--- 68,71 ----
  \def\E{\cdot10^} % exponent in floating point constant
+ \def\ET{ and~} % conjunction between two section numbers
+ \def\ETs{, and~} % conjunction between the last two of several section numbers
  \def\F{\defin{format}} % format definition
***************
*** 95,97 ****
  \def\T{\mathclose{\.{@\}}}} % terminate controlled comment
! \def\U{\note{This code is used in}} % cross-reference for uses of sections
  \let\V=\lor % logical or
--- 98,101 ----
  \def\T{\mathclose{\.{@\}}}} % terminate controlled comment
! \def\U{\note{This code is used in section}} % crossref for use of a section
! \def\Us{\note{This code is used in sections}} % crossref for uses of a section
  \let\V=\lor % logical or
***************
*** 185,187 ****
    \linepenalty=10 % try to conserve lines
!   \def\U{\note{Used in}} % cross-reference for uses of sections
    \def\:{\par\hangindent 2em}\let\*=*\let\.=\ttentry}
--- 189,192 ----
    \linepenalty=10 % try to conserve lines
!   \def\U{\note{Used in section}} % crossref for use of a section
!   \def\Us{\note{Used in sections}} % crossref for uses of a section
    \def\:{\par\hangindent 2em}\let\*=*\let\.=\ttentry}
diff -rc1 ../old/local/etc/vftovp.ch ./local/etc/vftovp.ch
*** ../old/local/etc/vftovp.ch	Tue Jan  2 14:56:23 1990
--- ./local/etc/vftovp.ch	Sun Mar 25 13:19:26 1990
***************
*** 5,6 ****
--- 5,7 ----
  % 12/11/89 (don) Initial version
+ % 3/23/90 (don) Fixed coredump problem when no args given
  
***************
*** 49,50 ****
--- 50,60 ----
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ % [3] Add a label
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x
+ @<Labels...@>=final_end;
+ @y
+ @<Labels...@>=final_end-1, final_end;
+ @z
+ 
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % [4] Increase name_length
***************
*** 98,100 ****
      print_ln('Usage: vftovp <vf-file> <tfm-file> <pl-file>');
!     goto final_end;
  end;
--- 108,110 ----
      print_ln('Usage: vftovp <vf-file> <tfm-file> <pl-file>');
!     goto final_end-1;
  end;
***************
*** 102,104 ****
  if testreadaccess(vf_name) then reset(vf_file, vf_name)
! else begin print_ln('I can''t read the VF file!'); goto final_end;
    end;
--- 112,114 ----
  if testreadaccess(vf_name) then reset(vf_file, vf_name)
! else begin print_ln('I can''t read the VF file!'); goto final_end-1;
    end;
***************
*** 105,107 ****
  if testreadaccess(tfm_name) then reset(tfm_file, tfm_name)
! else begin print_ln('I can''t read the TFM file!'); goto final_end;
    end;
--- 115,117 ----
  if testreadaccess(tfm_name) then reset(tfm_file, tfm_name)
! else begin print_ln('I can''t read the TFM file!'); goto final_end-1;
    end;
***************
*** 315,317 ****
  @y
! final_end: print_ln(' '); out_ln; end.
  @z
--- 325,327 ----
  @y
! final_end: out_ln; final_end-1: print_ln(' '); end.
  @z
diff -rc1 ../old/local/lib/picmac.tex ./local/lib/picmac.tex
*** ../old/local/lib/picmac.tex	Sun Mar 25 12:54:18 1990
--- ./local/lib/picmac.tex	Sun Mar 25 12:55:10 1990
***************
*** 0 ****
--- 1,178 ----
+ % Pictures (a subset of \LaTeX's conventions)
+ \catcode`@=11 % enable private control sequences
+ \def\wlog#1{} % don't put allocation info into the log
+ 
+ \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
+ 
+ \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
+   \setbox\@picbox=\hbox to#1\unitlength\bgroup \let\line=\@line
+     \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}
+ 
+ \catcode`\@=12 % disable private control sequences
diff -rc1 ../old/local/mf/inimf.ch ./local/mf/inimf.ch
*** ../old/local/mf/inimf.ch	Wed Dec 20 09:01:22 1989
--- ./local/mf/inimf.ch	Sun Mar 25 13:19:35 1990
***************
*** 5,6 ****
--- 5,7 ----
  %
+ % fixed max_buf_stack logic (it was one too high) on 1/22/90 --- don
  % brought up to version 1.9 on 12/20/89 --- don
***************
*** 94,98 ****
  @x
! @d banner=='This is METAFONT, Version 1.9' {printed when \MF\ starts}
  @y
! @d banner=='This is METAFONT, Version 1.9 for SunOS'
                                                   {printed when \MF\ starts}
--- 95,99 ----
  @x
! @d banner=='This is METAFONT, Version 2.0' {printed when \MF\ starts}
  @y
! @d banner=='This is METAFONT, Version 2.0 for SunOS'
                                                   {printed when \MF\ starts}
***************
*** 587,590 ****
    line_read(f,buf_size);
!   if last>=max_buf_stack then begin
!     max_buf_stack:=last+1;
      if max_buf_stack>=buf_size then
--- 588,591 ----
    line_read(f,buf_size);
!   if last>max_buf_stack then begin
!     max_buf_stack:=last;
      if max_buf_stack>=buf_size then
diff -rc1 ../old/local/mf/mf.pool ./local/mf/mf.pool
*** ../old/local/mf/mf.pool	Sat Oct 21 18:30:31 1989
--- ./local/mf/mf.pool	Sun Mar 25 13:19:38 1990
***************
*** 816,817 ****
--- 816,818 ----
  22Transcript written on 
+ 02 )
  19(end occurred when 
***************
*** 822,823 ****
  21debug # (-1 to exit):
! *493813446
--- 823,824 ----
  21debug # (-1 to exit):
! *415546872
diff -rc1 ../old/local/mf/plain.log ./local/mf/plain.log
*** ../old/local/mf/plain.log	Sat Oct 14 16:36:40 1989
--- ./local/mf/plain.log	Sun Mar 25 13:19:41 1990
***************
*** 1,2 ****
! This is METAFONT, Version 1.8 for SunOS (INIMF)  14 OCT 1989 16:36
  **plain \input art \dump 
--- 1,2 ----
! This is METAFONT, Version 2.0 for SunOS (INIMF)  25 MAR 1990 01:30
  **plain \input art \dump 
***************
*** 3,5 ****
  (/home/tex/dist/lib/plain.mf
! Preloading the plain base, version 1.7: preliminaries,
   basic constants and mathematical macros,
--- 3,5 ----
  (/home/tex/dist/lib/plain.mf
! Preloading the plain base, version 2.0: preliminaries,
   basic constants and mathematical macros,
***************
*** 12,16 ****
  Beginning to dump on file plain.base
!  (preloaded base=plain 89.10.14)
! 1393 strings of total length 23020
! 5044 memory locations dumped; current usage is 1406&3503
  516 symbolic tokens
--- 12,16 ----
  Beginning to dump on file plain.base
!  (preloaded base=plain 90.3.25)
! 1394 strings of total length 23021
! 5051 memory locations dumped; current usage is 1408&3508
  516 symbolic tokens
diff -rc1 ../old/local/tex/initex.ch ./local/tex/initex.ch
*** ../old/local/tex/initex.ch	Tue Dec 12 00:18:57 1989
--- ./local/tex/initex.ch	Sun Mar 25 13:19:49 1990
***************
*** 73,74 ****
--- 73,75 ----
  % (10/29/89) don Upped fontmax to 127 and fontmemsize to 40000
+ % (1/23/90) don Fixed max_buf_stack logic (it was one too high)
  
***************
*** 95,99 ****
  @x
! @d banner=='This is TeX, Version 2.993' {printed when \TeX\ starts}
  @y
! @d banner=='This is TeX, Version 2.993 for SunOS' {printed when \TeX\ starts}
  @z
--- 96,100 ----
  @x
! @d banner=='This is TeX, Version 3.0' {printed when \TeX\ starts}
  @y
! @d banner=='This is TeX, Version 3.0 for SunOS' {printed when \TeX\ starts}
  @z
***************
*** 274,276 ****
  @d hash_size=2100 {maximum number of control sequences; it should be at most
!   about |(mem_max-mem_min)/10|, but 2100 is already quite generous}
  @d hash_prime=1777 {a prime number equal to about 85\pct! of |hash_size|}
--- 275,277 ----
  @d hash_size=2100 {maximum number of control sequences; it should be at most
!   about |(mem_max-mem_min)/10|}
  @d hash_prime=1777 {a prime number equal to about 85\pct! of |hash_size|}
***************
*** 286,288 ****
  @d hash_size=4000 {maximum number of control sequences; it should be at most
!   about |(mem_max-mem_min)/10|, but 2100 is already quite generous}
  @d hash_prime=3443 {a prime number equal to about 85\pct! of |hash_size|}
--- 287,289 ----
  @d hash_size=4000 {maximum number of control sequences; it should be at most
!   about |(mem_max-mem_min)/10|}
  @d hash_prime=3443 {a prime number equal to about 85\pct! of |hash_size|}
***************
*** 624,627 ****
    line_read(f,buf_size);
!   if last>=max_buf_stack then begin
!     max_buf_stack:=last+1;
      if max_buf_stack>=buf_size then
--- 625,628 ----
    line_read(f,buf_size);
!   if last>max_buf_stack then begin
!     max_buf_stack:=last;
      if max_buf_stack>=buf_size then
diff -rc1 ../old/local/tex/plain.log ./local/tex/plain.log
*** ../old/local/tex/plain.log	Mon Jan  8 00:31:09 1990
--- ./local/tex/plain.log	Sun Mar 25 13:19:52 1990
***************
*** 1,2 ****
! This is TeX, Version 2.993 for SunOS (INITEX)  8 JAN 1990 00:30
  **plain \dump 
--- 1,2 ----
! This is TeX, Version 3.0 for SunOS (INITEX)  24 MAR 1990 22:56
  **plain \dump 
***************
*** 43,48 ****
  Beginning to dump on file plain.fmt
!  (preloaded format=plain 90.1.8)
! 1958 strings of total length 27665
! 4824 memory locations dumped; current usage is 110&4711
! 920 multiletter control sequences
  \font\nullfont=nullfont
--- 43,48 ----
  Beginning to dump on file plain.fmt
!  (preloaded format=plain 90.3.24)
! 1960 strings of total length 27678
! 4831 memory locations dumped; current usage is 110&4718
! 921 multiletter control sequences
  \font\nullfont=nullfont
diff -rc1 ../old/local/tex/tex.pool ./local/tex/tex.pool
*** ../old/local/tex/tex.pool	Mon Jan  8 06:27:57 1990
--- ./local/tex/tex.pool	Sun Mar 25 13:19:59 1990
***************
*** 748,750 ****
  25Unbalanced output routine
! 55Your sneaky output routine has fewer real {'s than }'s.
  41I can't handle that very well; good luck.
--- 748,750 ----
  25Unbalanced output routine
! 58Your sneaky output routine has problematic {'s and/or }'s.
  41I can't handle that very well; good luck.
***************
*** 1011,1012 ****
--- 1011,1013 ----
  22Transcript written on 
+ 02 )
  13end occurred 
***************
*** 1034,1035 ****
  16output file name
! *024428112
--- 1035,1036 ----
  16output file name
! *498792723
diff -rc1 ../old/local/web/weave.ch ./local/web/weave.ch
*** ../old/local/web/weave.ch	Mon Oct 16 22:01:13 1989
--- ./local/web/weave.ch	Sun Mar 25 13:20:04 1990
***************
*** 55,56 ****
--- 55,57 ----
  % 10/16/89  don fixed bug when ".web" and ".ch" are explicitly stated
+ % 3/25/90   don changed version number to 4.1
  
***************
*** 73,77 ****
  @x
! @d banner=='This is WEAVE, Version 4'
  @y
! @d banner=='This is WEAVE, Version 4 for SunOS'
  @z
--- 74,78 ----
  @x
! @d banner=='This is WEAVE, Version 4.1'
  @y
! @d banner=='This is WEAVE, Version 4.1 for SunOS'
  @z