diff -rc1 ../old/mf/mf.web ./mf/mf.web *** ../old/mf/mf.web Mon Jan 22 10:05:16 1990 --- ./mf/mf.web Sun Mar 25 13:08:17 1990 *************** *** 20,21 **** --- 20,22 ---- % Version 1.9 improved skimping and was edited for style (December 1989). + % Version 2.0 fixed bug in addto; released with TeX version 3.0 (March 1990). % A few "harmless" optimizations have been made without changing versions. *************** *** 22,26 **** ! % A reward of $40.96 will be paid to the first finder of any remaining bug, ! % except bugs introduced in October 1989. ! % (This amount will double again in 1990.) --- 23,26 ---- ! % A reward of $81.92 will be paid to the first finder of any remaining bug, ! % except bugs introduced after August 1989. *************** *** 152,154 **** ! @d banner=='This is METAFONT, Version 1.9' {printed when \MF\ starts} --- 152,154 ---- ! @d banner=='This is METAFONT, Version 2.0' {printed when \MF\ starts} *************** *** 931,932 **** --- 931,936 ---- be given. The following code uses concepts that will be explained later. + (If the \PASCAL\ compiler does not support non-local |@!goto|, the + @^system dependencies@> + statement `|goto final_end|' should be replaced by something that + quietly terminates the program.) *************** *** 1701,1703 **** @ The |jump_out| procedure just cuts across all active procedure levels and ! goes to |end_of_MF|. This is the only nonlocal |@!goto| statement in the whole program. It is used when there is no recovery from a particular error. --- 1705,1707 ---- @ The |jump_out| procedure just cuts across all active procedure levels and ! goes to |end_of_MF|. This is the only nontrivial |@!goto| statement in the whole program. It is used when there is no recovery from a particular error. *************** *** 8629,8631 **** @!cur_pen:pointer; {an implicit input of |make_spec|, used in autorounding} ! @!cur_path_type:double_path_code..also_code; {likewise} @!max_allowed:scaled; {coordinates must be at most this big} --- 8633,8635 ---- @!cur_pen:pointer; {an implicit input of |make_spec|, used in autorounding} ! @!cur_path_type:double_path_code..contour_code; {likewise} @!max_allowed:scaled; {coordinates must be at most this big} *************** *** 13304,13305 **** --- 13308,13310 ---- @!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} @!input_file : array[1..max_in_open] of alpha_file; *************** *** 13733,13735 **** begin input_ptr:=0; max_in_stack:=0; ! in_open:=0; max_buf_stack:=0; param_ptr:=0; max_param_stack:=0; --- 13738,13740 ---- begin input_ptr:=0; max_in_stack:=0; ! in_open:=0; open_parens:=0; max_buf_stack:=0; param_ptr:=0; max_param_stack:=0; *************** *** 14119,14122 **** if force_eof then ! begin print_char(")"); force_eof:=false; update_terminal; {show user that file has been read} end_file_reading; {resume previous level} --- 14124,14128 ---- if force_eof then ! begin print_char(")"); decr(open_parens); update_terminal; {show user that file has been read} + force_eof:=false; end_file_reading; {resume previous level} *************** *** 15899,15901 **** else if (term_offset>0)or(file_offset>0) then print_char(" "); ! print_char("("); print(name); update_terminal; if name=str_ptr-1 then {we can conserve string pool space now} --- 15905,15907 ---- else if (term_offset>0)or(file_offset>0) then print_char(" "); ! print_char("("); incr(open_parens); print(name); update_terminal; if name=str_ptr-1 then {we can conserve string pool space now} *************** *** 20250,20251 **** --- 20256,20258 ---- @!q:pointer; {beginning of second half of doubled path} + @!add_to_type:double_path_code..also_code; {modifier of \&{addto}} begin get_x_next; var_flag:=thing_to_add; scan_primary; *************** *** 20253,20257 **** @<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@> else @<Get ready to fill a contour, and fill it@>; --- 20260,20264 ---- @<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@> else @<Get ready to fill a contour, and fill it@>; *************** *** 20314,20316 **** if cur_edges=null then toss_knot_list(rhs) ! else begin lhs:=null; if left_type(rhs)=endpoint then --- 20321,20323 ---- if cur_edges=null then toss_knot_list(rhs) ! else begin lhs:=null; cur_path_type:=add_to_type; if left_type(rhs)=endpoint then *************** *** 22900,22901 **** --- 22907,22911 ---- if job_name=0 then open_log_file; + while open_parens>0 do + begin print(" )"); decr(open_parens); + end; while cond_ptr<>null do diff -rc1 ../old/mf/mfbook.tex ./mf/mfbook.tex *** ../old/mf/mfbook.tex Sun Jan 7 16:04:00 1990 --- ./mf/mfbook.tex Sun Mar 25 13:10:21 1990 *************** *** 106,108 **** \noindent ! {\sl \kern-1pt Fourth printing, revised, Umbruary 1990} \smallskip --- 106,108 ---- \noindent ! {\sl \kern-1pt Fifth printing, revised, March 1990} \smallskip *************** *** 123,125 **** \noindent ! DEFGHIJKLM--DO--943210 ^^{Knuth, Donald Ervin} --- 123,125 ---- \noindent ! EFGHIJKLM--AL--943210 ^^{Knuth, Donald Ervin} *************** *** 1962,1964 **** \vtop{\line{\indent \tt ! This\\is\\METAFONT,\\Version\\1.0\\(preloaded\\base=plain 85.11.8)} \leftline{\indent \tt **}}$$ --- 1962,1964 ---- \vtop{\line{\indent \tt ! This\\is\\METAFONT,\\Version\\2.0\\(preloaded\\base=plain 89.11.8)} \leftline{\indent \tt **}}$$ *************** *** 1965,1967 **** The `^|**|' is \MF's way of asking you for an input file name. ! % Incidentally, 85.11.8 was Hermann's 67th birthday. --- 1965,1967 ---- The `^|**|' is \MF's way of asking you for an input file name. ! % Incidentally, 89.11.8 was Hermann's 71st birthday. *************** *** 11085,11087 **** def wipescreen = % do this to initialize or reinitialize ! for i:=1 upto n_windows: display blankpicture on i; endfor n_windows := screen_bot := 0; screen_corner := origin enddef; --- 11085,11087 ---- def wipescreen = % do this to initialize or reinitialize ! for i:=1 upto n_windows: display blankpicture inwindow i; endfor n_windows := screen_bot := 0; screen_corner := origin enddef; *************** *** 13036,13038 **** @nonstopmode@, and @batchmode@ are the modes you get into by hitting ! `|S|', `|R|', or `|Q|, respectively, in response to error messages (cf.~Chapter~5). --- 13036,13038 ---- @nonstopmode@, and @batchmode@ are the modes you get into by hitting ! `|S|', `|R|', or `|Q|', respectively, in response to error messages (cf.~Chapter~5). *************** *** 14043,14045 **** |% And don't modify the file under any circumstances.| ! |string base_name, base_version; base_name="plain"; base_version="1.7";| \smallskip --- 14043,14045 ---- |% And don't modify the file under any circumstances.| ! |string base_name, base_version; base_name="plain"; base_version="2.0";| \smallskip *************** *** 14178,14181 **** \smallbreak ! |vardef |^|byte|| primary s =| ! | if string s: ASCII fi s enddef;| \smallbreak --- 14178,14180 ---- \smallbreak ! |vardef |^|byte|| primary s = if string s: ASCII fi s enddef;| \smallbreak *************** *** 14189,14192 **** |vardef |^|counterclockwise|| primary c =| ! | interim |^|autorounding||:=0;| ! | if |^|turningnumber|| c <= 0: reverse fi c enddef;| \smallbreak --- 14188,14192 ---- |vardef |^|counterclockwise|| primary c =| ! | if turningcheck>0:| ! | interim |^|autorounding||:=0;| ! | if |^|turningnumber|| c <= 0: reverse fi fi c enddef;| \smallbreak *************** *** 15050,15052 **** \begintt ! This is METAFONT, Version 1.0 (INIMF) 8 NOV 1985 10:09 **plain --- 15050,15052 ---- \begintt ! This is METAFONT, Version 2.0 (INIMF) 8 NOV 1989 10:09 **plain *************** *** 15053,15055 **** (plain.mf ! Preloading the plain base, version 1.0) *input local --- 15053,15055 ---- (plain.mf ! Preloading the plain base, version 2.0) *input local *************** *** 16455,16457 **** | ligtable "`": "`" =: oct"134"; % open quotes| ! | ligtable "'": "'" := oct"042", % close quotes| | "?" kern 2u#, "!" kern 2u#;| --- 16455,16457 ---- | ligtable "`": "`" =: oct"134"; % open quotes| ! | ligtable "'": "'" =: oct"042", % close quotes| | "?" kern 2u#, "!" kern 2u#;| *************** *** 20087,20091 **** \TeX\ Users Group - c/o American Mathematical Society P.O. Box 9506 ! Providence RI 02940-9506, USA. \author DONALD E. ^{KNUTH}, {\sl The \TeX book\/} (1985) % Appendix J --- 20087,20090 ---- \TeX\ Users Group P.O. Box 9506 ! Providence RI 02940\kern.05em-9506, USA. \author DONALD E. ^{KNUTH}, {\sl The \TeX book\/} (1985) % Appendix J diff -rc1 ../old/mf/trap.fot ./mf/trap.fot *** ../old/mf/trap.fot Wed Dec 20 13:12:52 1989 --- ./mf/trap.fot Sun Mar 25 13:10:25 1990 *************** *** 1,2 **** ! This is METAFONT, Version 1.9 (INIMF) ** &trap trap --- 1,2 ---- ! This is METAFONT, Version 2.0(INIMF) ** &trap trap *************** *** 38,40 **** Memory usage 1476&588 (104 still untouched) ! String usage 39&162 (822&7732 still untouched) {[repeat the loop]} --- 38,40 ---- Memory usage 1476&588 (104 still untouched) ! String usage 39&162 (821&7731 still untouched) {[repeat the loop]} *************** *** 46,47 **** --- 46,48 ---- {endgroup} + ) (end occurred when else on line 93 was incomplete) diff -rc1 ../old/mf/trap.log ./mf/trap.log *** ../old/mf/trap.log Wed Dec 20 13:12:28 1989 --- ./mf/trap.log Sun Mar 25 13:11:14 1990 *************** *** 1,2 **** ! This is METAFONT, Version 1.9 (preloaded base=trap 89.12.20) 20 DEC 1989 13:04 ** &trap trap --- 1,2 ---- ! This is METAFONT, Version 2.0 (preloaded base=trap 90.3.25) 25 MAR 1990 00:34 ** &trap trap *************** *** 1521,1523 **** l.73 ...es:=1; e[-1+-+ -1.00001] ! =nullpicture; Since I don't take square roots of negative numbers, --- 1521,1523 ---- l.73 ...es:=1; e[-1+-+ -1.00001] ! =nullpicture; addto e1 also[[ Since I don't take square roots of negative numbers, *************** *** 1528,1529 **** --- 1528,1531 ---- {addto} + {begingroup} + {addto} {(path)scaled(3)} *************** *** 1574,1575 **** --- 1576,1579 ---- {cull} + {nullpicture} + {endgroup} {show} *************** *** 1803,1805 **** Memory usage 1084&202 (749 still untouched) ! String usage 21&86 (867&11413 still untouched) {addto} --- 1807,1809 ---- Memory usage 1084&202 (749 still untouched) ! String usage 21&86 (866&11412 still untouched) {addto} *************** *** 4221,4223 **** Memory usage 1476&588 (104 still untouched) ! String usage 39&162 (822&7732 still untouched) {[repeat the loop]} --- 4225,4227 ---- Memory usage 1476&588 (104 still untouched) ! String usage 39&162 (821&7731 still untouched) {[repeat the loop]} *************** *** 4232,4233 **** --- 4236,4238 ---- {endgroup} + ) (end occurred when else on line 93 was incomplete) *************** *** 4236,4239 **** Here is how much of METAFONT's memory you used: ! 66 strings out of 888 ! 3753 string characters out of 11485 2897 words of memory out of 3001 --- 4241,4244 ---- Here is how much of METAFONT's memory you used: ! 66 strings out of 887 ! 3753 string characters out of 11484 2897 words of memory out of 3001 *************** *** 4240,4242 **** 289 symbolic tokens out of 2100 ! 8i,43n,14r,8p,168b stack positions out of 30i,100n,300r,150p,500b --- 4245,4247 ---- 289 symbolic tokens out of 2100 ! 8i,43n,14r,8p,167b stack positions out of 30i,100n,300r,150p,500b diff -rc1 ../old/mf/trap.mf ./mf/trap.mf *** ../old/mf/trap.mf Wed Dec 20 13:03:50 1989 --- ./mf/trap.mf Sun Mar 25 13:11:22 1990 *************** *** 72,76 **** point ypart(p~5 intersectiontimes p~5 shifted (.01,0))of p~5; ! [[interim tracingedges:=1; e[-1+-+ -1.00001]=nullpicture; addto e0 doublepath p~5 scaled 3 withpen q; e0=e1=e2; cull e1 dropping (0,.1); ! show e1 shifted(4089,-4095), e2 shifted(-4095,4092) shifted (-3,0), e2 shifted(4089,-4095)]];addto e1 also e2 shifted(-2,$); e1:=e1 shifted(-4,$); --- 72,76 ---- point ypart(p~5 intersectiontimes p~5 shifted (.01,0))of p~5; ! [[interim tracingedges:=1; e[-1+-+ -1.00001]=nullpicture; addto e1 also[[ addto e0 doublepath p~5 scaled 3 withpen q; e0=e1=e2; cull e1 dropping (0,.1); ! nullpicture]];show e1 shifted(4089,-4095), e2 shifted(-4095,4092)shifted (-3,0), e2 shifted(4089,-4095)]];addto e1 also e2 shifted(-2,$); e1:=e1 shifted(-4,$); diff -rc1 ../old/mf/trap.typ ./mf/trap.typ *** ../old/mf/trap.typ Wed Dec 20 13:11:58 1989 --- ./mf/trap.typ Sun Mar 25 13:11:28 1990 *************** *** 2,4 **** Options selected: Mnemonic output = true; pixel output = true. ! ' METAFONT output 1989.12.20:1304' --- 2,4 ---- Options selected: Mnemonic output = true; pixel output = true. ! ' METAFONT output 1990.03.25:0034' diff -rc1 ../old/mf/trapin.log ./mf/trapin.log *** ../old/mf/trapin.log Wed Dec 20 13:13:45 1989 --- ./mf/trapin.log Sun Mar 25 13:11:33 1990 *************** *** 1,2 **** ! This is METAFONT, Version 1.9 (INIMF) 20 DEC 1989 13:03 **\input trap --- 1,2 ---- ! This is METAFONT, Version 2.0 (INIMF) 25 MAR 1990 00:34 **\input trap *************** *** 149,151 **** Memory usage 291&37 (1922 still untouched) ! String usage 26&83 (896&11536 still untouched) ! OK. --- 149,151 ---- Memory usage 291&37 (1922 still untouched) ! String usage 26&83 (895&11534 still untouched) ! OK. *************** *** 173,178 **** {elseif} ! Beginning to dump on file trap.base ! (preloaded base=trap 89.12.20) ! 1112 strings of total length 20515 395 memory locations dumped; current usage is 317&67 --- 173,178 ---- {elseif} ! ) Beginning to dump on file trap.base ! (preloaded base=trap 90.3.25) ! 1113 strings of total length 20516 395 memory locations dumped; current usage is 317&67 diff -rc1 ../old/tex/tex.web ./tex/tex.web *** ../old/tex/tex.web Mon Jan 8 06:27:11 1990 --- ./tex/tex.web Sun Mar 25 13:14:46 1990 *************** *** 39,44 **** % Version 2.993 fixed a save_stack synchronization bug et alia (December 1989). ! % A reward of $163.84 will be paid to the first finder of any remaining bug, % not counting changes introduced after August 1989. - % (This amount will double again in 1990.) --- 39,44 ---- % Version 2.993 fixed a save_stack synchronization bug et alia (December 1989). + % Version 3.0 fixed unusual displays; was more \output robust (March 1990). ! % A reward of $327.68 will be paid to the first finder of any remaining bug, % not counting changes introduced after August 1989. *************** *** 185,187 **** ! @d banner=='This is TeX, Version 2.993' {printed when \TeX\ starts} --- 185,187 ---- ! @d banner=='This is TeX, Version 3.0' {printed when \TeX\ starts} *************** *** 433,435 **** @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|} --- 433,435 ---- @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|} *************** *** 1010,1011 **** --- 1010,1015 ---- be given. The following code uses concepts that will be explained later. + (If the \PASCAL\ compiler does not support non-local |@!goto|, the + @^system dependencies@> + statement `|goto final_end|' should be replaced by something that + quietly terminates the program.) *************** *** 1828,1830 **** @ The |jump_out| procedure just cuts across all active procedure levels and ! goes to |end_of_TEX|. This is the only nonlocal |@!goto| statement in the whole program. It is used when there is no recovery from a particular error. --- 1832,1834 ---- @ The |jump_out| procedure just cuts across all active procedure levels and ! goes to |end_of_TEX|. This is the only nontrivial |@!goto| statement in the whole program. It is used when there is no recovery from a particular error. *************** *** 6150,6153 **** each word contains a token and a link. Macro definitions, output-routine ! definitions, marks, and \.{\\write} texts are kept in \TeX's memory in the ! form of token lists, preceded by a node that has a reference count in its |token_ref_count| field. The token stored in location |p| is called --- 6154,6158 ---- each word contains a token and a link. Macro definitions, output-routine ! definitions, marks, \.{\\write} texts, and a few other things ! are remembered by \TeX\ in the form ! of token lists, usually preceded by a node with a reference count in its |token_ref_count| field. The token stored in location |p| is called *************** *** 6522,6523 **** --- 6527,6529 ---- @!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} @!input_file : array[1..max_in_open] of alpha_file; *************** *** 7052,7054 **** begin input_ptr:=0; max_in_stack:=0; ! in_open:=0; max_buf_stack:=0; param_ptr:=0; max_param_stack:=0; --- 7058,7060 ---- begin input_ptr:=0; max_in_stack:=0; ! in_open:=0; open_parens:=0; max_buf_stack:=0; param_ptr:=0; max_param_stack:=0; *************** *** 7496,7498 **** if interaction>nonstop_mode then ! begin if (end_line_char<0)or(end_line_char>127) then incr(limit); if limit=start then {previous line was empty} --- 7502,7504 ---- if interaction>nonstop_mode then ! begin if end_line_char_inactive then incr(limit); if limit=start then {previous line was empty} *************** *** 7530,7533 **** if force_eof then ! begin print_char(")"); force_eof:=false; update_terminal; {show user that file has been read} end_file_reading; {resume previous level} --- 7536,7540 ---- if force_eof then ! begin print_char(")"); decr(open_parens); update_terminal; {show user that file has been read} + force_eof:=false; end_file_reading; {resume previous level} *************** *** 8038,8040 **** incr(align_state); long_state:=call; cur_tok:=par_token; ins_error; ! end --- 8045,8047 ---- incr(align_state); long_state:=call; cur_tok:=par_token; ins_error; ! end {a white lie; the \.{\\par} won't always trigger a runaway} *************** *** 9810,9815 **** different in examples like this: ! $$\vbox{\halign{\.{#}\hfil\cr ! {}\\def\\a\{\\c\}\cr ! {}\\def\\b\{\\d\}\cr {}\\def\\c\{\}\cr {}\\def\\d\{\}\cr}}$$ --- 9817,9822 ---- different in examples like this: ! $$\vbox{\halign{\.{#}\hfil&\qquad\.{#}\hfil\cr ! {}\\def\\a\{\\c\}& {}\\def\\c\{\}\cr + {}\\def\\b\{\\d\}& {}\\def\\d\{\}\cr}}$$ *************** *** 9818,9824 **** begin p:=link(cur_chr); q:=link(equiv(n)); {omit reference counts} ! 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 --- 9825,9833 ---- begin p:=link(cur_chr); q:=link(equiv(n)); {omit reference counts} ! 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; end *************** *** 10333,10335 **** else if (term_offset>0)or(file_offset>0) then print_char(" "); ! print_char("("); print(name); update_terminal; state:=new_line; if name=str_ptr-1 then {we can conserve string pool space now} --- 10342,10345 ---- else if (term_offset>0)or(file_offset>0) then print_char(" "); ! print_char("("); incr(open_parens); print(name); update_terminal; ! state:=new_line; if name=str_ptr-1 then {we can conserve string pool space now} *************** *** 10347,10349 **** @<Read the first line...@>= ! begin if not input_ln(cur_file,false) then do_nothing; firm_up_the_line; --- 10357,10359 ---- @<Read the first line...@>= ! begin if input_ln(cur_file,false) then do_nothing; firm_up_the_line; *************** *** 14295,14296 **** --- 14305,14307 ---- by |cur_mu|. + @!@:non_script_}{\.{\\nonscript} primitive@> *************** *** 15756,15762 **** while q<>null do ! 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@>; s:=q; q:=link(q); --- 15767,15774 ---- while q<>null do ! 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@>; s:=q; q:=link(q); *************** *** 16290,16292 **** @!d:integer; {demerits of test line} ! @!artificial_badness:boolean; {has |b| been forced to zero?} @!save_link:pointer; {temporarily holds value of |link(cur_p)|} --- 16302,16304 ---- @!d:integer; {demerits of test line} ! @!artificial_demerits:boolean; {has |d| been forced to zero?} @!save_link:pointer; {temporarily holds value of |link(cur_p)|} *************** *** 16326,16330 **** @<Global...@>= ! @!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 and position} --- 16338,16342 ---- @<Global...@>= ! @!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 and position} *************** *** 16371,16373 **** @<Insert a delta node to prepare for breaks at |cur_p|@>; ! minimum_demerits:=minimum_demerits+abs(adj_demerits); for fit_class:=very_loose_fit to tight_fit do --- 16383,16387 ---- @<Insert a delta node to prepare for breaks at |cur_p|@>; ! if abs(adj_demerits)>=awful_bad-minimum_demerits then ! minimum_demerits:=awful_bad-1 ! else minimum_demerits:=minimum_demerits+abs(adj_demerits); for fit_class:=very_loose_fit to tight_fit do *************** *** 16647,16649 **** @<Consider the demerits for a line from |r| to |cur_p|...@>= ! begin @!stat artificial_badness:=false;@+tats@/ @^inner loop@> --- 16661,16663 ---- @<Consider the demerits for a line from |r| to |cur_p|...@>= ! begin artificial_demerits:=false;@/ @^inner loop@> *************** *** 16714,16718 **** (prev_r=active) then ! begin b:=0; {set badness zero, this break is forced} ! @!stat artificial_badness:=true;@+tats ! end else if b>threshold then goto deactivate; --- 16728,16730 ---- (prev_r=active) then ! artificial_demerits:=true {set demerits zero, this break is forced} else if b>threshold then goto deactivate; *************** *** 16729,16731 **** @<Record a new feasible break@>= ! @<Compute the demerits, |d|, from |r| to |cur_p|@>; @!stat if tracing_paragraphs>0 then --- 16741,16744 ---- @<Record a new feasible break@>= ! if artificial_demerits then d:=0 ! else @<Compute the demerits, |d|, from |r| to |cur_p|@>; @!stat if tracing_paragraphs>0 then *************** *** 16758,16763 **** print(" b="); ! if artificial_badness then print_char("*")@+else print_int(b); @.*\relax@> ! print(" p="); print_int(pi); ! print(" d="); print_int(d); end --- 16771,16776 ---- print(" b="); ! 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); end *************** *** 16788,16790 **** @ @<Compute the demerits, |d|, from |r| to |cur_p|@>= ! d:=line_penalty+b; d:=d*d; if pi<>0 then --- 16801,16804 ---- @ @<Compute the demerits, |d|, from |r| to |cur_p|@>= ! begin d:=line_penalty+b; ! if abs(d)>=10000 then d:=100000000@+else d:=d*d; if pi<>0 then *************** *** 16795,16797 **** else d:=d+final_hyphen_demerits; ! if abs(fit_class-fitness(r))>1 then d:=d+adj_demerits --- 16809,16812 ---- else d:=d+final_hyphen_demerits; ! if abs(fit_class-fitness(r))>1 then d:=d+adj_demerits; ! end *************** *** 17442,17444 **** procedure hyphenate; ! label common_ending,done,found,found1,not_found,not_found+1,exit; var @<Local variables for hyphenation@>@; --- 17457,17459 ---- procedure hyphenate; ! label common_ending,done,found,found1,found2,not_found,exit; var @<Local variables for hyphenation@>@; *************** *** 17572,17574 **** q:=link(hb); link(hb):=null; r:=link(ha); link(ha):=null; bchar:=non_char; ! if type(hb)=ligature_node then if odd(subtype(hb)) then bchar:=font_bchar[hf]; --- 17587,17590 ---- q:=link(hb); link(hb):=null; r:=link(ha); link(ha):=null; bchar:=non_char; ! if not is_char_node(hb) then ! if type(hb)=ligature_node then if odd(subtype(hb)) then bchar:=font_bchar[hf]; *************** *** 17575,17587 **** 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|} --- 17591,17609 ---- 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|} *************** *** 17589,17595 **** 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; common_ending: flush_node_list(r); --- 17611,17613 ---- j:=0; goto common_ending; ! found2: s:=ha; j:=0; hu[0]:=256; init_lig:=false; init_list:=null; common_ending: flush_node_list(r); *************** *** 19733,19736 **** if best_ins_ptr(r)=null then wait:=true ! else begin wait:=false; s:=ins_ptr(p); ! link(last_ins_ptr(r)):=s; s:=last_ins_ptr(r); if best_ins_ptr(r)=p then --- 19751,19753 ---- if best_ins_ptr(r)=null then wait:=true ! else begin wait:=false; s:=last_ins_ptr(r); link(s):=ins_ptr(p); if best_ins_ptr(r)=p then *************** *** 19751,19752 **** --- 19768,19770 ---- begin while link(s)<>broken_ptr(r) do s:=link(s); + link(s):=null; split_top_skip:=split_top_ptr(p); *************** *** 19758,19760 **** end; - link(s):=null; end; --- 19776,19777 ---- *************** *** 19815,19817 **** @<Resume the page builder after an output routine has come to an end@>= ! begin if loc<>null then @<Recover from an unbalanced output routine@>; end_token_list; {conserve stack space in case more outputs are triggered} --- 19832,19836 ---- @<Resume the page builder after an output routine has come to an end@>= ! begin if (loc<>null) or ! ((token_type<>output_text)and(token_type<>backed_up)) then ! @<Recover from an unbalanced output routine@>; end_token_list; {conserve stack space in case more outputs are triggered} *************** *** 19835,19837 **** @.Unbalanced output routine@> ! help2("Your sneaky output routine has fewer real {'s than }'s.")@/ ("I can't handle that very well; good luck."); error; --- 19854,19856 ---- @.Unbalanced output routine@> ! help2("Your sneaky output routine has problematic {'s and/or }'s.")@/ ("I can't handle that very well; good luck."); error; *************** *** 19839,19841 **** until loc=null; ! end --- 19858,19860 ---- until loc=null; ! end {loops forever if reading from a file, since |null=min_halfword<=0|} *************** *** 20366,20368 **** tail_append(new_penalty(-@'10000000000));@/ ! build_page; {append \.{\\hbox to \\hsize\{\}\\vss\\penalty-'10000000000}} end; --- 20385,20387 ---- tail_append(new_penalty(-@'10000000000));@/ ! build_page; {append \.{\\hbox to \\hsize\{\}\\vfill\\penalty-'10000000000}} end; *************** *** 20567,20572 **** ! @ It's very hard to get this error message; indeed, the case didn't arise ! until more than two years after it had been programmed. ! ! @<Drop current token and complain that it was unmatched@>= begin print_err("Extra "); print_cmd_chr(cur_cmd,cur_chr); --- 20586,20588 ---- ! @ @<Drop current token and complain that it was unmatched@>= begin print_err("Extra "); print_cmd_chr(cur_cmd,cur_chr); *************** *** 22186,22188 **** in a math formula. Two special cases are simplified here: Braces are effectively ! removed when they surround a single Ord character or, when they surround an accent that is the nucleus of an Ord atom. --- 22202,22204 ---- in a math formula. Two special cases are simplified here: Braces are effectively ! removed when they surround a single Ord without sub/superscripts, or when they surround an accent that is the nucleus of an Ord atom. *************** *** 22277,22279 **** if mode=-m then {end of equation number} ! begin cur_mlist:=p; cur_style:=text_style; mlist_penalties:=false; mlist_to_hlist; a:=hpack(link(temp_head),natural); --- 22293,22296 ---- if mode=-m then {end of equation number} ! begin @<Check that another \.\$ follows@>; ! cur_mlist:=p; cur_style:=text_style; mlist_penalties:=false; mlist_to_hlist; a:=hpack(link(temp_head),natural); *************** *** 22281,22283 **** if saved(0)=1 then l:=true; ! if danger then flush_math; m:=mode; p:=fin_mlist(null); --- 22298,22302 ---- if saved(0)=1 then l:=true; ! danger:=false; ! @<Check that the necessary fonts for math symbols are present; ! if not, flush the current math lists and set |danger:=true|@>; m:=mode; p:=fin_mlist(null); *************** *** 22286,22288 **** if m<0 then @<Finish math in text@> ! else begin @<Check that another \.\$ follows@>; @<Finish displayed math@>; --- 22305,22307 ---- if m<0 then @<Finish math in text@> ! else begin if a=null then @<Check that another \.\$ follows@>; @<Finish displayed math@>; *************** *** 22364,22366 **** mlist_to_hlist; p:=link(temp_head);@/ ! adjust_tail:=adjust_head; b:=hpack(p,natural); t:=adjust_tail; adjust_tail:=null;@/ --- 22383,22385 ---- mlist_to_hlist; p:=link(temp_head);@/ ! adjust_tail:=adjust_head; b:=hpack(p,natural); p:=list_ptr(b); t:=adjust_tail; adjust_tail:=null;@/ *************** *** 22424,22426 **** begin d:=half(z-w-e); ! if p<>null then if type(p)=glue_node then d:=0; end --- 22443,22445 ---- begin d:=half(z-w-e); ! if p<>null then if not is_char_node(p) then if type(p)=glue_node then d:=0; end *************** *** 22457,22462 **** end; ! shift_amount(b):=s+d; append_to_vlist(b); ! if t<>adjust_head then ! begin link(tail):=link(adjust_head); tail:=t; ! end --- 22476,22478 ---- end; ! shift_amount(b):=s+d; append_to_vlist(b) *************** *** 22467,22473 **** append_to_vlist(a); ! tail_append(new_penalty(post_display_penalty)); ! end ! else begin tail_append(new_penalty(post_display_penalty)); ! tail_append(new_param_glue(g2)); ! end --- 22483,22491 ---- append_to_vlist(a); ! 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)) *************** *** 24220,24221 **** --- 24238,24242 ---- if job_name=0 then open_log_file; + while open_parens>0 do + begin print(" )"); decr(open_parens); + end; if cur_level>level_one then diff -rc1 ../old/tex/texbook.tex ./tex/texbook.tex *** ../old/tex/texbook.tex Fri Dec 8 20:19:41 1989 --- ./tex/texbook.tex Sun Mar 25 15:32:52 1990 *************** *** 5876,5878 **** infeasible breakpoint had to be chosen because there was no feasible ! alternative. --- 5876,5878 ---- infeasible breakpoint had to be chosen because there was no feasible ! way to keep total demerits small. *************** *** 8335,8340 **** \kern-.1em\TeX} Document Preparation System\/} (1983) ! % Note: the final manual has a slightly different wording on p43. ! % It's now called "LaTeX: A Document Preparation System" (1986) ! % But I decided to cite the original, partly because I have ! % no smallcaps sans-serif `A' to match the new LaTeX logo! --- 8335,8340 ---- \kern-.1em\TeX} Document Preparation System\/} (1983) ! % Note: the final manual has a slightly different wording on p43. ! % It's now called "LaTeX: A Document Preparation System" (1986) ! % But I decided to cite the original, partly because I have ! % no smallcaps sans-serif `A' to match the new LaTeX logo! *************** *** 10396,10398 **** formula produces a result exactly equivalent to ! `|\left(|\<subformula>|\right)|', except that the ^{delimiters} are forced to be of the |\big| size regardless of the height and depth of the subformula. --- 10396,10399 ---- 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. *************** *** 17742,17745 **** token \cstok{par} into the input; after reading and expanding this \cstok{par} ! token, \TeX\ will see the \<vertical command> again. \ (The current ! meaning of the control sequence ^|\par| will be used; \cstok{par} may no longer stand for \TeX's |\par| primitive.) --- 17743,17746 ---- token \cstok{par} into the input; after 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.) *************** *** 17930,17932 **** math list goes into the atomic field. If the math list turns out to be ! simply a single Ord atom without subscripts or superscripts, the enclosing braces are effectively removed. --- 17931,17934 ---- math list goes into the atomic field. If the math list turns out to be ! simply a single Ord atom without subscripts or superscripts, ! or an Acc whose nucleus is an Ord, the enclosing braces are effectively removed. *************** *** 18566,18568 **** |main memory size|\qquad(boxes, glue, breakpoints, token lists, ! characters, etc.)\cr |hash size|\qquad(control sequence names)\cr --- 18568,18570 ---- |main memory size|\qquad(boxes, glue, breakpoints, token lists, ! characters, etc.)\cr |hash size|\qquad(control sequence names)\cr *************** *** 18934,18936 **** | | ! ^|\vglue|| 1in % This makes an inch of blank space (1in=2.54cm).| ^|\centerline||{\bf A Bold, Centered Title}| --- 18936,18938 ---- | | ! ^|\topglue|| 1in % This makes an inch of blank space (1in=2.54cm).| ^|\centerline||{\bf A Bold, Centered Title}| *************** *** 18968,18970 **** {\parindent 20pt ! \vglue 1in % This makes an inch of blank space (1in=2.54cm). \centerline{\bf A Bold, Centered Title} --- 18970,18972 ---- {\parindent 20pt ! \topglue 1in % This makes an inch of blank space (1in=2.54cm). \centerline{\bf A Bold, Centered Title} *************** *** 19013,19015 **** |\medskip| or |\bigskip|; it uses |\llap| but not |\rlap|, |\item| ! but not |\itemitem|, |\vglue| but not |\hglue|. It does not illustrate |\raggedright| setting of paragraphs; it does not use --- 19015,19017 ---- |\medskip| or |\bigskip|; it uses |\llap| but not |\rlap|, |\item| ! but not |\itemitem|, |\topglue| but not |\hglue|. It does not illustrate |\raggedright| setting of paragraphs; it does not use *************** *** 19689,19696 **** There also are macros for potentially breakable vertical spaces: ! ^|\smallskip|, ^|\medskip|, and ^|\bigskip|. \beginlines ! |\def\enskip{\hskip.5em\relax}| ! |\def\quad{\hskip1em\relax} \def\qquad{\hskip2em\relax}| ! |\def\enspace{\kern.5em }| ! |\def\thinspace{\kern .16667em } \def\negthinspace{\kern-.16667em }| \smallbreak --- 19691,19697 ---- There also are macros for potentially breakable vertical spaces: ! ^|\smallskip|, ^|\medskip|, and ^|\bigskip|.^^|\topglue| \beginlines ! |\def\enskip{\hskip.5em\relax} \def\enspace{\kern.5em }| ! |\def\quad{\hskip1em\relax} \def\qquad{\hskip2em\relax}| ! |\def\thinspace{\kern .16667em } \def\negthinspace{\kern-.16667em }| \smallbreak *************** *** 19702,19703 **** --- 19703,19705 ---- | \nobreak\vskip\skip@ \prevdepth=\dimen@}| + |\def\topglue{\nointerlineskip \vglue-\topskip \vglue} % for top of page| \smallbreak *************** *** 24909,24911 **** in the width of box~$x$ if and only if limits are to be set or ! there is no subscript. Shift box~$x$ down by ${1\over2}\bigl(h(x)+d(x)\bigr) -a$, where $a=\sigma_{22}$, so that the operator character is centered --- 24911,24913 ---- in the width of box~$x$ if and only if limits are to be set or ! there is no subscript. Shift box~$x$ down by ${1\over2}\bigl(h(x)-d(x)\bigr) -a$, where $a=\sigma_{22}$, so that the operator character is centered *************** *** 27809,27810 **** --- 27811,27813 ---- |\top| ( $\top$ ), 435. + |\topglue|, @340, +352. |\topins|, 256, +363, @364. *************** *** 27940,27942 **** *|\vfuzz|, 274, @348. ! |\vglue|, 340, +352. vinculum, \see |\overline|. --- 27943,27945 ---- *|\vfuzz|, 274, @348. ! |\vglue|, +352, @408. vinculum, \see |\overline|.