Date: 23 Dec 88 Message No: 011 To: TeX implementors and distributors From: Barbara Beeton Subject: TeX 2.95, MF 1.7, changes to CM fonts, TANGLE 2.9 As you were warned last week, TeX has again been modified, to handle the change first made in 2.94 more robustly. The change also affects MF, which is now at version 1.7. Updates to TeX82.BUG, MF84.BUG, TeX.WEB, MF.WEB and ERRATA.TEX are given below; note that these changes reverse some of the changes made in TeX 2.94 and MF 1.6, so be particularly careful applying them if you are using the line numbers for reference. Some fixes have been made to bugs in the CM fonts. These changes affect the following files: BIGOP.MF CMBASE.MF ROMANL.MF SYM.MF SYMBOL.MF The changes are posted in CM85.BUG and also in ERRATA.TEX. The changes given in CM85.BUG for BIGOP and ROMANL are clear, and since there are many similar code lines in these .MF files that could lead to the changes being applied to the wrong character descriptions, I am not providing difference lists for these. Difference lists are provided for CMBASE.MF and SYM and SYMBOL.MF, where the changes are more extensive, or more clearly followed from the complete list of differences. Finally, TANGLE has been modified to permit references to non-numeric macros before their definitions. The changes (version 2.9) are listed below. All relevant files are now up to date at SCORE. As usual, I'd appreciate an acknowledgement that you have received this message. And I'd like to wish everyone the very best of holidays. ######################################################################## Additions to TEX82.BUG 349. By popular request, undo #347 and fix the bug a more complex way. @x module 71 [this undoes change #347] if not input_ln(term_in,true) then t_open_in; @y if not input_ln(term_in,true) then fatal_error("End of file on the terminal!"); @z @x module 92 [now we get to the new stuff] begin if job_name>0 then selector:=term_and_log @y begin if log_opened then selector:=term_and_log @z @x module 93 error; @y if log_opened then error; @z @x module 527 @!job_name:str_number; {principal file name} @y @!job_name:str_number; {principal file name} @!log_opened:boolean; {has the transcript file been opened?} @z @x module 528 @=job_name:=0; name_in_progress:=false; @y @= job_name:=0; name_in_progress:=false; log_opened:=false; @z @x module 534 selector:=log_only; @y selector:=log_only; log_opened:=true; @z @x module 535 begin if interaction print_file_name(cur_name,cur_area,cur_ext); print("'.");@/ job_name:=0; history:=fatal_error_stop; jump_out; end; {abort the program without a log file} @y begin selector:=term_only; @z @x module 1265 [this change is optional, but it's a slight improvement] if job_name<>0 then selector:=selector+2; @y if log_opened then selector:=selector+2; @z @x module 1333 if job_name>0 then @y if log_opened then @z @x module 1334 if job_name>0 then {the log file is open} @y if log_opened then @z 350. (I sincerely hope that there won't be any more) ######################################################################## Differences between TEX.WEB 2.94 and 2.95 ;COMPARISON OF TX:TEX.WEB.10 AND TX:TEX.WEB.1 ;OPTIONS ARE /E /3 **** FILE TX:TEX.WEB.10, 1-33 (2181) % A reward of $81.92 will be paid to the first finder of any remaining bug. **** FILE TX:TEX.WEB.1, 1-32 (2179) % Version 2.95 solves that problem a better way (December 1988). % A reward of $81.92 will be paid to the first finder of any remaining bug. *************** **** FILE TX:TEX.WEB.10, 2-93 (9365) @d banner=='This is TeX, Version 2.94' {printed when \TeX\ starts} @ Different \PASCAL s have slightly different conventions, and the present **** FILE TX:TEX.WEB.1, 2-93 (9431) @d banner=='This is TeX, Version 2.95' {printed when \TeX\ starts} @ Different \PASCAL s have slightly different conventions, and the present *************** **** FILE TX:TEX.WEB.10, 7-319 (85645) begin if job_name>0 then selector:=term_and_log else selector:=term_only; **** FILE TX:TEX.WEB.1, 7-319 (85711) begin if log_opened then selector:=term_and_log else selector:=term_only; *************** **** FILE TX:TEX.WEB.10, 7-329 (85988) error; @!debug if interaction>batch_mode then debug_help;@+gubed@;@/ **** FILE TX:TEX.WEB.1, 7-329 (86054) if log_opened then error; @!debug if interaction>batch_mode then debug_help;@+gubed@;@/ *************** **** FILE TX:TEX.WEB.10, 30-312 (429711) @ Initially |job_name=0|; it becomes nonzero as soon as the true name is known. **** FILE TX:TEX.WEB.1, 30-311 (429794) @!log_opened:boolean; {has the transcript file been opened?} @ Initially |job_name=0|; it becomes nonzero as soon as the true name is known. *************** **** FILE TX:TEX.WEB.10, 30-316 (429948) @=job_name:=0; name_in_progress:=false; @ Here is a routine that manufactures the output file names, assuming that **** FILE TX:TEX.WEB.1, 30-317 (430095) @= job_name:=0; name_in_progress:=false; log_opened:=false; @ Here is a routine that manufactures the output file names, assuming that *************** **** FILE TX:TEX.WEB.10, 30-399 (433094) selector:=log_only; @; **** FILE TX:TEX.WEB.1, 30-401 (433262) selector:=log_only; log_opened:=true; @; *************** **** FILE TX:TEX.WEB.10, 30-413 (433677) Therefore the program is careful not to call |prompt_file_name| if a fatal error could result. The normal idea of |batch_mode| is that nothing at all should be written **** FILE TX:TEX.WEB.1, 30-415 (433863) The |prompt_file_name| routine can result in a |fatal_error|, but the |error| routine will not be invoked because |log_opened| will be false. The normal idea of |batch_mode| is that nothing at all should be written *************** **** FILE TX:TEX.WEB.10, 30-426 (434205) begin if interaction print_file_name(cur_name,cur_area,cur_ext); print("'.");@/ job_name:=0; history:=fatal_error_stop; jump_out; end; {abort the program without a log file} prompt_file_name("transcript file name",".log"); **** FILE TX:TEX.WEB.1, 30-428 (434438) begin selector:=term_only; prompt_file_name("transcript file name",".log"); *************** **** FILE TX:TEX.WEB.10, 50-796 (956324) if job_name<>0 then selector:=selector+2; end; **** FILE TX:TEX.WEB.1, 50-796 (956264) if log_opened then selector:=selector+2; end; *************** **** FILE TX:TEX.WEB.10, 52-107 (986057) if job_name>0 then begin wlog_cr; a_close(log_file); selector:=selector-2; **** FILE TX:TEX.WEB.1, 52-107 (985996) if log_opened then begin wlog_cr; a_close(log_file); selector:=selector-2; *************** **** FILE TX:TEX.WEB.10, 52-122 (986549) if job_name>0 then {the log file is open} begin wlog_ln(' '); **** FILE TX:TEX.WEB.1, 52-122 (986488) if log_opened then begin wlog_ln(' '); *************** ######################################################################## Additions to MF84.BUG 546. By popular request, undo #544 and fix the bug a more complex way. @x module 66 [this undoes chan44] if not input_ln(term_in,true) n_in; @y if not input_ln(term_in,true) then fatal_error("End of file on the terminal!"); @z @x module 87 [now we get to the new stuff] begin if job_name>0 selector:=term_and_log @y begin if log_opened then selector:=term_and_log @z @x module 88 error; @y if log_opened then error; @z @x module 782 @!job_name:str_number; {principal file name} @y @!job_name:str_number; {principal file name} @!log_opened:boolean; {has the transcript file been opened?} @z @x module 783 @=job_name:=0; @y @=job_name:=0; log_opened:=false; @z @x module 788 selector:=log_only; @y selector:=log_only; log_opened:=true; @z @x module 789 begin if interaction print_file_name(cur_name,cur_area,cur_ext); print("'.");@/ job_name:=0; history:=fatal_error_stop; jump_out; end; {abort the program without a log file} @y begin selector:=term_only; @z @x module 1023 [this change is optional, but it's a slight improvement] if job_name<>0 then selector:=selector+2; @y if log_opened then selector:=selector+2; @z @x module 1205 if job_name>0 then @y if log_opened then @z @x module 1208 if job_name>0 then {the log file is open} @y if log_opened then @z 547. (I sincerely hope that there won't be any more) ######################################################################## Differences between MF.WEB 1.6 and 1.7 ;COMPARISON OF PS:MF.WEB.5 AND PS:MF.WEB.1 ;OPTIONS ARE /E /3 **** FILE PS:MF.WEB.5, 1-18 (1093) % A few "harmless" optimizations have been made without changing versions. **** FILE PS:MF.WEB.1, 1-18 (1093) % Version 1.7 solves that problem a better way (December 1988). % A few "harmless" optimizations have been made without changing versions. *************** **** FILE PS:MF.WEB.5, 2-81 (7745) @d banner=='This is METAFONT, Version 1.6' {printed when \MF\ starts} @ Different \PASCAL s have slightly different conventions, and the present **** FILE PS:MF.WEB.1, 2-81 (7810) @d banner=='This is METAFONT, Version 1.7' {printed when \MF\ starts} @ Different \PASCAL s have slightly different conventions, and the present *************** **** FILE PS:MF.WEB.5, 7-324 (80761) begin if job_name>0 then selector:=term_and_log else selector:=term_only; **** FILE PS:MF.WEB.1, 7-324 (80826) begin if log_opened then selector:=term_and_log else selector:=term_only; *************** **** FILE PS:MF.WEB.5, 7-334 (81103) error; @!debug if interaction>batch_mode then debug_help;@+gubed@;@/ **** FILE PS:MF.WEB.1, 7-334 (81168) if log_opened then error; @!debug if interaction>batch_mode then debug_help;@+gubed@;@/ *************** **** FILE PS:MF.WEB.5, 39-307 (650905) @!log_name:str_number; {full name of the log file} **** FILE PS:MF.WEB.1, 39-307 (650989) @!log_opened:boolean; {has the transcript file been opened?} @!log_name:str_number; {full name of the log file} *************** **** FILE PS:MF.WEB.5, 39-313 (651196) @=job_name:=0; @ Here is a routine that manufactures the output file names, assuming that **** FILE PS:MF.WEB.1, 39-314 (651342) @=job_name:=0; log_opened:=false; @ Here is a routine that manufactures the output file names, assuming that *************** **** FILE PS:MF.WEB.5, 39-386 (653986) selector:=log_only; @; **** FILE PS:MF.WEB.1, 39-387 (654151) selector:=log_only; log_opened:=true; @; *************** **** FILE PS:MF.WEB.5, 39-399 (654528) Therefore the program is careful not to call |prompt_file_name| if a fatal error could result. The normal idea of |batch_mode| is that nothing at all should be written **** FILE PS:MF.WEB.1, 39-400 (654711) The |prompt_file_name| routine can result in a |fatal_error|, but the |error| routine will not be invoked because |log_opened| will be false. The normal idea of |batch_mode| is that nothing at all should be written *************** **** FILE PS:MF.WEB.5, 39-412 (655056) begin if interaction print_file_name(cur_name,cur_area,cur_ext); print("'.");@/ job_name:=0; history:=fatal_error_stop; jump_out; end; {abort the program without a log file} prompt_file_name("transcript file name",".log"); **** FILE PS:MF.WEB.1, 39-413 (655286) begin selector:=term_only; prompt_file_name("transcript file name",".log"); *************** **** FILE PS:MF.WEB.5, 45-46 (803909) if job_name<>0 then selector:=selector+2; get_x_next; **** FILE PS:MF.WEB.1, 45-46 (803846) if log_opened then selector:=selector+2; get_x_next; *************** **** FILE PS:MF.WEB.5, 50-116 (916496) if job_name>0 then begin wlog_cr; **** FILE PS:MF.WEB.1, 50-116 (916432) if log_opened then begin wlog_cr; *************** **** FILE PS:MF.WEB.5, 50-161 (918333) if job_name>0 then {the log file is open} begin wlog_ln(' '); **** FILE PS:MF.WEB.1, 50-161 (918269) if log_opened then begin wlog_ln(' '); *************** ######################################################################## Extracts from ERRATA.TeX (differences as compared with previous version) ;COMPARISON OF TX:ERRATA.TEX.14 AND TX:ERRATA.NEW.1 ;OPTIONS ARE /E /3 **** FILE TX:ERRATA.TEX.15, 2-83 (4289) \bugonpage A465, entry for {\tt\char`\\everymath} (12/12/87) **** FILE TX:ERRATA.NEW.1, 2-83 (4289) \bugonpage A464, left column, under Displays (12/8/88) \eightpoint\indent\quad non-centered, 186, 326, 375--376, 420--421. \bugonpage A465, entry for {\tt\char`\\everymath} (12/12/87) *************** **** FILE TX:ERRATA.TEX.15, 3-6 (5033) \bugonpage B2, line 32 (11/6/88) \ninepoint\noindent\hskip10pt {\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$% {\tt This\]is\]TeX,\]Version\]2.94\char'23}\quad $\{\,$printed when \TeX\ starts$\,\}$ \bugonpage B30, line 3 from the bottom (11/6/88) \ninepoint\noindent\hskip10pt {\bf if} $\lnot\\{input\_ln}(\\{term\_in},\\{true})$ {\bf then} \\{t\_open\_in}; \bugonpage B38, lines 7--9 from the bottom (11/6/88) \tenpoint\noindent[Delete this paragraph; it is being moved to page B214.] \bugonpage B52, line 5 (8/13/87) **** FILE TX:ERRATA.NEW.1, 3-6 (5163) \bugonpage B2, line 32 (12/14/88) \ninepoint\noindent\hskip10pt {\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$% {\tt This\]is\]TeX,\]Version\]2.95\char'23}\quad $\{\,$printed when \TeX\ starts$\,\}$ \bugonpage B38, lines 7--9 from the bottom (11/6/88) \tenpoint\noindent[Delete this paragraph; it is being moved to page B214.] \bugonpage B38, line 5 from the bottom (12/14/88) \ninepoint\noindent\kern10pt {\bf begin if\/} \\{log\_opened} {\bf then} $\\{selector}\gets\\{term\_and\_log}$ \bugonpage B39, line 5 (12/14/88) \ninepoint\noindent\kern50pt {\bf if\/} \\{log\_opened} {\bf then} \\{error}; \bugonpage B52, line 5 (8/13/87) *************** **** FILE TX:ERRATA.TEX.15, 3-193 (11136) \bugonpage B214, new paragraph after line 3 (11/6/88) \tenpoint\noindent\hskip10pt The normal idea of \\{batch\_mode} is that nothing at all should be written **** FILE TX:ERRATA.NEW.1, 3-197 (11385) \bugonpage B211, new line of code before the mini-index (12/14/88) \ninepoint\noindent \\{log\_opened}: \\{boolean};\quad$\{\,$has the transcript file been opened?$\,\}$ \bugonpage B212, line 5 (12/14/88) \ninepoint\noindent\kern10pt $\\{job\_name}\gets0$; \ $\\{name\_in\_progress}\gets\\{false}$; \ $\\{log\_opened}\gets\\{false}$; \bugonpage B213, line 24 (12/14/88) \ninepoint\noindent\kern10pt $\\{log\_name}\gets\\{a\_make\_name\_string}(\\{log\_file})$; \ $\\{selector}\gets\\{log\_only}$; \ $\\{log\_opened}\gets\\{true}$; \bugonpage B214, lines 2 and 3 (12/14/88) \tenpoint\noindent messages or even to \\{show\_context}. The \\{prompt\_file\_name} routine can result in a \\{fatal\_error}, but the \\{error} routine will not be invoked because \\{log\_opened} will be false. \par\noindent\hskip10pt The normal idea of \\{batch\_mode} is that nothing at all should be written *************** **** FILE TX:ERRATA.TEX.15, 3-201 (11451) \bugonpage B214, lines 8--9 (11/6/88) \ninepoint\noindent\hskip20pt {\bf begin} $\\{selector}\gets\\{term\_only}$; \ \\{print\_err}({\tt\char`\"I\]can't\]write\]on\]file\]`\char`\"});\par \noindent\hskip20pt \\{print\_file\_name}$(\\{cur\_name},\\{cur\_area},\\{cur\_ext})$; \ \\{print}({\tt\char`\"'.\char`\"}); \bugonpage B224, second-last line (4/28/87) **** FILE TX:ERRATA.NEW.1, 3-228 (12455) \bugonpage B214, lines 7--11 reduce to a single line (12/14/88) \ninepoint\noindent\hskip10pt {\bf begin} $\\{selector}\gets\\{term\_only}$; \bugonpage B224, second-last line (4/28/87) *************** **** FILE TX:ERRATA.TEX.15, 3-390 (17709) \bugonpage B547, right column (9/20/87) **** FILE TX:ERRATA.NEW.1, 3-413 (18534) \bugonpage B507, line 13 (12/14/88) \ninepoint\noindent\kern10pt {\bf if\/} \\{log\_opened} {\bf then} $\\{selector}\gets\\{selector}+2$; \bugonpage B527, line 21 (12/14/88) \ninepoint\noindent\kern10pt {\bf if\/} \\{log\_opened} {\bf then} \bugonpage B528, line 5 (12/14/88) \ninepoint\noindent\kern10pt {\bf if\/} \\{log\_opened} {\bf then} \bugonpage B547, right column (9/20/87) *************** **** FILE TX:ERRATA.TEX.15, 3-417 (18382) \bugonpage B559, right column (8/13/87) **** FILE TX:ERRATA.NEW.1, 3-455 (19571) \bugonpage B559, new entry (12/14/88) \eightpoint\noindent \\{log\_opened}, 92--93, $\underline{527}$, 528, 534--535, 1265, 1333--1334. \bugonpage B559, right column (8/13/87) *************** **** FILE TX:ERRATA.TEX.15, 5-6 (20908) \bugonpage D2, line 27 (11/6/88) \ninepoint\noindent\hskip10pt {\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$% {\tt This\]is\]METAFONT,\]Version\]1.6\char'23}\quad $\{\,$printed when \MF\ starts$\,\}$ \bugonpage D28, line 7 from the bottom (11/6/88) \ninepoint\noindent\hskip10pt {\bf if} $\lnot\\{input\_ln}(\\{term\_in},\\{true})$ {\bf then} \\{t\_open\_in}; \bugonpage D36, lines 3--5 (11/6/88) \tenpoint\noindent[Delete this paragraph; it is being moved to page D349.] \bugonpage D66, lines 34--35 (7/9/88) **** FILE TX:ERRATA.NEW.1, 5-6 (22240) \bugonpage D2, line 27 (12/14/88) \ninepoint\noindent\hskip10pt {\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$% {\tt This\]is\]METAFONT,\]Version\]1.7\char'23}\quad $\{\,$printed when \MF\ starts$\,\}$ \bugonpage D36, lines 3--5 (11/6/88) \tenpoint\noindent[Delete this paragraph; it is being moved to page D349.] \bugonpage D36, line 7 (12/14/88) \ninepoint\noindent\kern10pt {\bf begin if\/} \\{log\_opened} {\bf then} $\\{selector}\gets\\{term\_and\_log}$ \bugonpage D36, line 16 (12/14/88) \ninepoint\noindent\kern50pt {\bf if\/} \\{log\_opened} {\bf then} \\{error}; \bugonpage D66, lines 34--35 (7/9/88) *************** **** FILE TX:ERRATA.TEX.15, 5-32 (21773) \bugonpage D349, new paragraph after line 7 (11/6/88) \tenpoint\noindent\hskip10pt The normal idea of \\{batch\_mode} is that nothing at all should be written **** FILE TX:ERRATA.NEW.1, 5-36 (23209) \bugonpage D347, new line of code after line 5 (12/14/88) \ninepoint\noindent \\{log\_opened}: \\{boolean};\quad$\{\,$has the transcript file been opened?$\,\}$ \bugonpage D347, line 11 (12/14/88) \ninepoint\noindent\kern10pt $\\{job\_name}\gets0$; \ $\\{log\_opened}\gets\\{false}$; \bugonpage D348, line 4 from the bottom (12/14/88) \ninepoint\noindent\kern10pt $\\{log\_name}\gets\\{a\_make\_name\_string}(\\{log\_file})$; \ $\\{selector}\gets\\{log\_only}$; \ $\\{log\_opened}\gets\\{true}$; \bugonpage D349, lines 6 and 7 (12/14/88) \tenpoint\noindent print error messages or even to \\{show\_context}. The \\{prompt\_file\_name} routine can result in a \\{fatal\_error}, but the \\{error} routine will not be invoked because \\{log\_opened} will be false. \par\noindent\hskip10pt The normal idea of \\{batch\_mode} is that nothing at all should be written *************** **** FILE TX:ERRATA.TEX.15, 5-40 (22088) \bugonpage D349, lines 12--13 (11/6/88) \ninepoint\noindent\hskip20pt {\bf begin} $\\{selector}\gets\\{term\_only}$; \ \\{print\_err}({\tt\char`\"I\]can't\]write\]on\]file\]`\char`\"});\par \noindent\hskip20pt \\{print\_file\_name}$(\\{cur\_name},\\{cur\_area},\\{cur\_ext})$; \ \\{print}({\tt\char`\"'.\char`\"}); \bugonpage D420, bottom line (5/25/88) **** FILE TX:ERRATA.NEW.1, 5-67 (24256) \bugonpage D349, lines 11--15 reduce to a single line (12/14/88) \ninepoint\noindent\hskip10pt {\bf begin} $\\{selector}\gets\\{term\_only}$; \bugonpage D420, bottom line (5/25/88) *************** **** FILE TX:ERRATA.TEX.15, 5-63 (22896) \bugonpage D545, left column (10/31/87) **** FILE TX:ERRATA.NEW.1, 5-86 (24884) \bugonpage D444, line 8 from the bottom (12/14/88) \ninepoint\noindent\kern10pt {\bf if\/} \\{log\_opened} {\bf then} $\\{selector}\gets\\{selector}+2$; \bugonpage D510, line 14 (12/14/88) \ninepoint\noindent\kern10pt {\bf if\/} \\{log\_opened} {\bf then} \bugonpage D511, line 11 (12/14/88) \ninepoint\noindent\kern10pt {\bf if\/} \\{log\_opened} {\bf then} \bugonpage D530, new entry (12/14/88) \eightpoint\noindent \\{log\_opened}, 87--88, $\underline{782}$, 783, 788--789, 1023, 1205, 1208. \bugonpage D545, left column (10/31/87) *************** **** FILE TX:ERRATA.TEX.15, 6-21 (23635) \bugonpage E353, lines 38--39 (8/12/87) **** FILE TX:ERRATA.NEW.1, 6-21 (26146) \bugonpage E333, line 11 (12/11/88) \ninepoint \line{{\bf if\/} not \\{monospace}: $r:={\rm hround}(x_5+x_1)+l$; {\bf fi}\hfill \% change width for better fit} \bugonpage E353, lines 38--39 (8/12/87) *************** **** FILE TX:ERRATA.TEX.15, 6-46 (24394) \bugonpage E485, line 4 (8/7/87) **** FILE TX:ERRATA.NEW.1, 6-53 (27077) \bugonpage E471, line 5 (12/11/88) \ninepoint\noindent $x_2=\\{good}.x\,.5w$; \ $\\{center\_on}(x_2)$; \bugonpage E471, insert two lines below the rule at bottom of page (12/11/88) \ninepoint \line{{\bf def\/} \\{center\_on}({\bf expr} $x) =\null$ {\bf if\/} not \\{monospace}:\hfill \% change width for symmetric fit} \leftline{\kern10pt $r:=r+2x-w$; \ $w:=2x$; \ {\bf fi} {\bf enddef};} \bugonpage E477, line 20 (12/11/87) \ninepoint\noindent $x_4=x_8=\\{good}.x\,.5w$; \ $\\{center\_on}(x_4)$; \ $x_2=w-x_6=\\{good}.x(x_4+a)$; \bugonpage E483, third line of elementary division operator (12/11/88) \ninepoint\noindent $x_3-.5\\{dot\_size}={\rm hround}(.5w-.5\\{dot\_size})$; \ $\\{center\_on}(x_3)$; \bugonpage E485, line 4 (8/7/87) *************** **** FILE TX:ERRATA.TEX.15, 6-58 (24810) \bugonpage E550, new line after line 23 (8/15/87) **** FILE TX:ERRATA.NEW.1, 6-91 (28231) \bugonpage E515, lines 5 and 12 (12/11/88) \ninepoint\noindent $.5[x_1,x_2]=x_3=\\{good}.x\,.5w$; \ $\\{center\_on}(x_3)$; \ $\\{lft}\,x_1={\rm hround}(.5w-u*{\rm sqrt}48)$; \bugonpage E521, lines 4 and 14 (12/12/88) \ninepoint\noindent $x_1=x_2=\\{good}.x\,.5w$; \ $\\{center\_on}(x_1)$; \ $\\{lft}\,x_3={\rm hround}\,u$; \ $x_4=w-x_3$; \bugonpage E537, line 6 (12/11/88) \ninepoint\noindent $x_1=x_2=x_3=x_4$; \ $x_1-.5\\{stem}={\rm hround}(.5w-.5\\{stem})$; \ $\\{center\_on}(x_1)$; \bugonpage E537, line 19 (12/11/88) \ninepoint\noindent $x_1=x_2=x_3$; \ $x_1-.5\\{stem}={\rm hround}(.5w-.5\\{stem})$; \ $\\{center\_on}(x_1)$; \bugonpage E539, line 4 (12/11/88) \ninepoint\noindent $x_1=x_4=x_{30}=x_{33}=\\{good}.x\,.5w$; \ $\\{center\_on}(x_1)$; \bugonpage E539, line 21 (12/11/88) \ninepoint\noindent $x_1=x_4=\\{good}.x\,.5w$; \ $\\{center\_on}(x_1)$; \bugonpage E541, line 4 (12/11/88) \ninepoint\noindent $x_1=x_5=\\{good}.x\,.5w$; \ $\\{center\_on}(x_1)$; \bugonpage E541, line 17 (12/11/88) \ninepoint\noindent $x_1=x_{10}=\\{good}.x\,.5w$; \ $\\{center\_on}(x_1)$; \bugonpage E550, new line after line 23 (8/15/87) *************** **** FILE TX:ERRATA.TEX.15, 6-62 (24960) {\bf if} $\hbox{\$}<3$: $\hbox{\$}:=3$; {\bf fi endfor} \smallskip\noindent **** FILE TX:ERRATA.NEW.1, 6-141 (29521) {\bf if\/} $\hbox{\$}<3$: $\hbox{\$}:=3$; {\bf fi endfor} \smallskip\noindent *************** **** FILE TX:ERRATA.TEX.15, 6-71 (25320) \\{cap\_bar},\\{cap\_band}$; \bye **** FILE TX:ERRATA.NEW.1, 6-150 (29883) \\{cap\_bar},\\{cap\_band})$; \bugonpage E572, new entry at bottom (12/11/88) \eightpoint\noindent \\{center\_on}, $\underline{473}$, 477, 483, 515, 521, 537--541. \bye *************** ######################################################################## Additions to CM85.BUG @x in BIGOP, the \displaystyle coproduct sign lft x11=hround u; x1l-x11=x2l-x12=x22-x2r=hround cap_jut; @y lft x11=hround u; x1l-x11=x2l-x12=x22-x2r=hround 1.6cap_jut; @z @x in ROMANL, the letter m if not monospace: r:=hround(x5+x1)-l; fi % change width for better fit @y if not monospace: r:=hround(x5+x1)+l; fi % change width for better fit @z @x a new routine for CMBASE, following change_width @y def center_on(expr x) = if not monospace: % change width for symmetric fit r:=r+2x-w; w:=2x; fi enddef; @z @x in SYMBOL, the elementary division operator x3-.5dot_size=hround(.5w-.5dot_size); w:=r:=2x3; @y x3-.5dot_size=hround(.5w-.5dot_size); center_on(x3); @z Similarly, whenever the construction "w:=r:=2x*" appears, change it to "center_on(x*)". This happens in the programs for elementary division operator (as noted above), large triangle, large inverted triangle, lattice top, lattice bottom, dagger mark, double dagger mark, club/diamond/heart/spade suit (all in SYMBOL), plus the diamond operator and universal quantifier in SYM. The following additional change needs to be made in the programs for lattice top and lattice bottom: @x x1=x2=good.x .5w; center_on(x1); lft x3=hround u; x4=r-x3; @y x1=x2=good.x .5w; center_on(x1); lft x3=hround u; x4=w-x3; @z (I sincerely hope there won't be any more!) ######################################################################## Differences in CMBASE.MF ;COMPARISON OF PS:CMBASE.MF.11 AND PS:CMBASE.MF.12 ;OPTIONS ARE /E /3 **** FILE PS:CMBASE.MF.11, 1-490 (21001) def padded expr del_sharp = **** FILE PS:CMBASE.MF.12, 1-490 (21001) def center_on(expr x) = if not monospace: % change width for symmetric fit r:=r+2x-w; w:=2x; fi enddef; def padded expr del_sharp = *************** ######################################################################## Differences in SYM.MF ;COMPARISON OF PS:SYM.MF.8 AND PS:SYM.MF.9 ;OPTIONS ARE /E /3 **** FILE PS:SYM.MF.8, 1-218 (9135) x2=good.x .5w; w:=r:=2x2; lft x1=0; x3=w-x1; **** FILE PS:SYM.MF.9, 1-218 (9135) x2=good.x .5w; center_on(x2); lft x1=0; x3=w-x1; *************** **** FILE PS:SYM.MF.8, 1-354 (14154) x4=x8=good.x .5w; w:=r:=2x4; x2=w-x6=good.x(x4+a); y2=y6=.5[y4,y8]=math_axis; y8=good.y(y2+a); **** FILE PS:SYM.MF.9, 1-354 (14158) x4=x8=good.x .5w; center_on(x4); x2=w-x6=good.x(x4+a); y2=y6=.5[y4,y8]=math_axis; y8=good.y(y2+a); *************** ######################################################################## Differences in SYMBOL.MF ;COMPARISON OF PS:SYMBOL.MF.7 AND PS:SYMBOL.MF.8 ;OPTIONS ARE /E /3 **** FILE PS:SYMBOL.MF.7, 1-47 (1929) x3-.5dot_size=hround(.5w-.5dot_size); w:=r:=2x3; y3+.5dot_size=vround(math_spread[.5x_hei+.5dot_size); **** FILE PS:SYMBOL.MF.8, 1-47 (1929) x3-.5dot_size=hround(.5w-.5dot_size); center_on(x3); y3+.5dot_size=vround(math_axis+math_spread[.5x_height,.6x_height]+.5dot_size); *************** **** FILE PS:SYMBOL.MF.7, 1-500 (21343) .5[x1,x2]=x3=good.x .5w; w:=r:=2x3; lft x1=hround(.5w-u*sqrt48); draw z1--zle; % stroke **** FILE PS:SYMBOL.MF.8, 1-500 (21347) .5[x1,x2]=x3=good.x .5w; center_on(x3); lft x1=hround(.5w-u*sqrt48); draw z1--z2--z3--cycle; % stroke *************** **** FILE PS:SYMBOL.MF.7, 1-508 (21625) .5[x1,x2]=x3=good.x .5w; w:=r:=2x3; lft x1=hround(.5w-u*sqrt48); draw z1--z2--z3--cycle; % stroke **** FILE PS:SYMBOL.MF.8, 1-508 (21633) .5[x1,x2]=x3=good.x .5w; center_on(x3); lft x1=hround(.5w-u*sqrt48); draw z1--z2--z3--cycle; % stroke *************** **** FILE PS:SYMBOL.MF.7, 1-615 (26376) x1=x2=good.x .5w; w:=r:=2x1; lft x3=hround u; x4=r-x3; bot y1=0; y2-y1=x4-x3; **** FILE PS:SYMBOL.MF.8, 1-615 (26388) x1=x2=good.x .5w; center_on(x1); lft x3=hround u; x4=w-x3; bot y1=0; y2-y1=x4-x3; *************** **** FILE PS:SYMBOL.MF.7, 1-626 (26691) x1=x2=good.x .5w; w:=r:=2x1; lft x3=hround u; x4=r-x3; bot y1=0; y2-y1=x4-x3; **** FILE PS:SYMBOL.MF.8, 1-626 (26707) x1=x2=good.x .5w; center_on(x1); lft x3=hround u; x4=w-x3; bot yy2-y1=x4-x3; *************** **** FILE PS:SYMBOL.MF.7, 1-932 (39305) x1=x2=x3=x4; x1-.5stem=hround(.5w-.5stem); w:=r:=2x1; x5-.5stem=hround u; x6=w-x5; **** FILE PS:SYMBOL.MF.8, 1-932 (39325) x1=x2=x3=x4; x1-.5stem=hround(.5w-.5stem); center_on(x1); x5-.5hround u; x6=w-x5; *************** **** FILE PS:SYMBOL.MF.7, 1-946 (39921) x1=x2=x3; x1-.5stem=hround(.5w-.5stem); w:=r:=2x1; x4-.5hround u; x5=w-x4; **** FILE PS:SYMBOL.MF.8, 1-946 (39945) x1=x2=x3; x1-.5stem=hround(.5w-.5stem); center_on(x1); x4-.5d u; x5=w-x4; *************** **** FILE PS:SYMBOL.MF.7, 1-979 (41448) x1=x4=x30=x33=good.x .5w; w:=r:=2x1; x2=good.x(x1-.5u)-eps; lft x1-rt x10=hround .5pt; lft x12=hround .5u; **** FILE PS:SYMBOL.MF.8, 1-979 (41476) x1=x4=x30=x33=good.x .5w; center_on(x1); x2=good.x(x1-.5u)-eps; lft x1-rt x10=hround .5pt; lft x12=hround .5u; *************** **** FILE PS:SYMBOL.MF.7, 1-997 (42416) x1=x4=good.x .5w; w:=r:=2x1; lft x2=hround u; x3=w-x2; **** FILE PS:SYMBOL.MF.8, 1-997 (42448) x1=x4=good.x .5w; center_on(x1); lft x2=hround u; x3=w-x2; *************** **** FILE PS:SYMBOL.MF.7, 1-1009 (42973) x1=x5=good.x .5w; w:=r:=2x1; lft x7=hround u; x8=4u; x2+x8=x3+x7=x4+x6=w; **** FILE PS:SYMBOL.MF.8, 1-1009 (43009) x1=x5=good.x .5w; center_on(x1); lft x7=hround u; x8=4u; x2+x8=x3+x7=x4+x6=w; *************** **** FILE PS:SYMBOL.MF.7, 1-1023 (43554) x1=x10=good.x .5w; w:=r:=2x1; x2=good.x(x1-.5u)-eps; lft x1-rt x6=hround .5pt; x5=x6; **** FILE PS:SYMBOL.MF.8, 1-1023 (43594) x1=x10=good.x .5w; center_on(x1); x2=good.x(x1-.5u)-eps; lft x1-rt x6=hround .5pt; x5=x6; *************** ######################################################################## Differences between TANGLE.WEB 2.8 and 2.9 ;COMPARISON OF PS:TANGLE.WEB.4 AND PS:TANGLE.WEB.1 ;OPTIONS ARE /E /3 **** FILE PS:TANGLE.WEB.4, 1-15 (889) % Here is TeX material that gets inserted after \input webmac **** FILE PS:TANGLE.WEB.1, 1-14 (887) % Version 2.9 allows nonnumeric macros before their definition (December, 1988). % Here is TeX material that gets inserted after \input webmac *************** **** FILE PS:TANGLE.WEB.4, 1-32 (1590) \centerline{(Version 2.8)} \vfill} **** FILE PS:TANGLE.WEB.1, 1-33 (1672) \centerline{(Version 2.9)} \vfill} *************** **** FILE PS:TANGLE.WEB.4, 1-61 (2855) @d banner=='This is TANGLE, Version 2.8' @ The program begins with a fairly normal header, made up of pieces that **** FILE PS:TANGLE.WEB.1, 2-26 (2936) @d banner=='This is TANGLE, Version 2.9' @ The program begins with a fairly normal header, made up of pieces that *************** **** FILE PS:TANGLE.WEB.4, 1-1003 (43139) if p<>name_ptr then @ else @; **** FILE PS:TANGLE.WEB.1, 7-114 (43215) if p<>name_ptr then @ else @; *************** **** FILE PS:TANGLE.WEB.4, 1-1026 (43934) @ If a macro has appeared before it was defined, \.{TANGLE} will still work all right; after all, such behavior is typical of the replacement **** FILE PS:TANGLE.WEB.1, 7-138 (44028) @ If a nonnumeric macro has appeared before it was defined, \.{TANGLE} will still work all right; after all, such behavior is typical of the replacement *************** **** FILE PS:TANGLE.WEB.4, 1-1031 (44245) so \.{TANGLE} finds it simplest to make a blanket rule that macros should be defined before they are used. The following routine gives an error message **** FILE PS:TANGLE.WEB.1, 7-143 (44350) so \.{TANGLE} finds it simplest to make a blanket rule that numeric macros should be defined before they are used. The following routine gives an error message *************** **** FILE PS:TANGLE.WEB.4, 1-1037 (44544) begin err_print('! This identifier has already appeared'); @.This identifier has already...@> **** FILE PS:TANGLE.WEB.1, 7-149 (44657) begin if t=numeric then err_print('! This identifier has already appeared'); @.This identifier has already...@> *************** ######################################################################## [ end of message 011 ] -------