summaryrefslogtreecommitdiff
path: root/info/digests/tex-implementors/024
diff options
context:
space:
mode:
Diffstat (limited to 'info/digests/tex-implementors/024')
-rw-r--r--info/digests/tex-implementors/0241054
1 files changed, 1054 insertions, 0 deletions
diff --git a/info/digests/tex-implementors/024 b/info/digests/tex-implementors/024
new file mode 100644
index 0000000000..2a939b131c
--- /dev/null
+++ b/info/digests/tex-implementors/024
@@ -0,0 +1,1054 @@
+Date: 27 Mar 90 Message No: 024
+
+To: TeX implementors and distributors
+
+From: Barbara Beeton
+
+Subject: TeX 3.0 is here; BibTeX; inquiry from Peter Breitenlohner
+
+
+The files for TeX 3.0 were installed at labrea on Sunday, Mar 25.
+I shall confine this message to just a few items: the differences
+between TeX 2.993 and 3.0, updates to TEX82.BUG, and a list of the
+files that have been updated at labrea since 6 Jan 90. (That is a
+random date, but I think it should include just about everything
+that is really important, and should save some of you from having
+to spend the time getting a directory.)
+
+There have been some new names added to the list, and some address
+changes, so I would appreciate an acknowledgement that everyone has
+received this message.
+
+I am still trying to figure out how to get copies of the TRIP and TRAP
+files to everyone. I have received simple C programs for encoding and
+decoding files, and that may be a practical option. Please send the
+following information along with your acknowledgement:
+
+ 1 Do you have access to FTP? (In other words, you can get all the
+ files you need direct from labrea.)
+ 2 Would you be willing to provide copies of the TRIP files to other
+ implementors in your area? (That is, I would have to send copies
+ of the TRIP and TRAP files to fewer people, but everyone would
+ still be taken care of.)
+ 3 Do you have a C compiler? (In other words, if I sent copies of
+ the encoding/decoding programs, you could compile them and then
+ use them to convert files encoded here and sent to you back into
+ useful form.)
+ 4 Would you prefer getting the TRIP and TRAP files on diskette, and
+ if so, in what format? (I can create only IBM PC compatible
+ diskettes myself, and that isn't really convenient. To get other
+ formats, I will have to find someone else to do it. So either of
+ these options may take longer than electronic mail.)
+ 5 If you have any other suggestions, I'd be delighted to hear them.
+
+On another topic, I spoke yesterday with Oren Patashnik, who has finally
+finished his dissertation and is now working on BibTeX 1.0. Although
+he does not want to be deluged with requests for new features, he did
+express a concern that he may have missed some things that are important
+to European users of BibTeX. He is also interested in hearing about any
+bugs that may still be present in the code. If anyone has anything to
+say about either concern, I am preparing a summary of the things I've
+seen mentioned in UKTeX, TEX-NL and GUT (he already watches TeXhax) to
+send to him, and will be happy to include other information. Or you
+could send your comments directly to him:
+ opbibtex@Neon.Stanford.EDU
+
+Peter Breitenlohner (PEB@DM0MPI11.Bitnet) reported this problem:
+ When running the TRIP/TRAP test on the CMS versions of TeX/MF
+ I get a discrepancy in the buf_stack usage. To be precise I
+ get one less than the files from Stanford say.
+ In the TRIP test I get:
+ 5i,7n,9p,113b,38s stack positions out of 200i,...
+ instead of:
+ 5i,7n,9p,114b,38s stack positions out of 200i,...
+ in the TRIP test I get:
+ 8i,43n,14r,8p,167b stack positions out of 30i,...
+ instead of:
+ 8i,43n,14r,8p,168b stack positions out of 30i,...
+ Yes we have modified the function input_ln for efficiency,
+ but I have tried to check very carefully that max_buf_stack
+ is computed as in the original version.
+ To be sure I just redid the TRIP test with all modifications of
+ input_ln removed (i.e. with the original version of input_ln).
+ I still get the same discrepancy ????????????????
+ Do you know of anyone else having a similar problem.
+Can anyone help?
+
+By the way, if anyone wants to send a message to this list, it should
+be very easy. The address is on the Internet:
+ TeX-implementors@Math.AMS.com
+Be warned, though, that depending on the phase of the moon and the whim
+of the mail forwarding software at various gateways, some addresses may
+get bounced, and some may just fall into the void. There are several
+implementors who don't have any e-mail access at all, and if you would
+like them included in a message distribution, please send me a separate
+note, and I will ask the TUG office to handle the postal distribution.
+
+
+########################################################################
+
+Differences between TEX.WEB 2.993 and 3.0
+
+;COMPARISON OF TX:<TEX.TEX>TEX-2-993.WEB.1 AND TX:<TEX.NEW>TEX-3-0.WEB.1
+;OPTIONS ARE /E /3
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-41 (2739)
+% 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.)
+
+% Although considerable effort has been expended to make the TeX program
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-40 (2737)
+% 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.
+
+% Although considerable effort has been expended to make the TeX program
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-186 (10245)
+@d banner=='This is TeX, Version 2.993' {printed when \TeX\ starts}
+
+@ Different \PASCAL s have slightly different conventions, and the present
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-186 (10278)
+@d banner=='This is TeX, Version 3.0' {printed when \TeX\ starts}
+
+@ Different \PASCAL s have slightly different conventions, and the present
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-434 (23068)
+ 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|}
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-434 (23099)
+ about |(mem_max-mem_min)/10|}
+@d hash_prime=1777 {a prime number equal to about 85\pct! of |hash_size|}
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-1012 (48416)
+@<Report overflow of the input buffer, and abort@>=
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-1011 (48409)
+(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.)
+
+@<Report overflow of the input buffer, and abort@>=
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-1829 (81516)
+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.
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-1833 (81705)
+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.
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-6151 (274364)
+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
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-6155 (274555)
+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
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-6523 (291727)
+@!input_file : array[1..max_in_open] of alpha_file;
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-6528 (291941)
+@!open_parens : 0..max_in_open; {the number of open text files}
+@!input_file : array[1..max_in_open] of alpha_file;
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-7053 (313800)
+in_open:=0; max_buf_stack:=0;
+param_ptr:=0; max_param_stack:=0;
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-7059 (314079)
+in_open:=0; open_parens:=0; max_buf_stack:=0;
+param_ptr:=0; max_param_stack:=0;
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-7497 (331520)
+ begin if (end_line_char<0)or(end_line_char>127) then incr(limit);
+ if limit=start then {previous line was empty}
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-7503 (331815)
+ begin if end_line_char_inactive then incr(limit);
+ if limit=start then {previous line was empty}
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-7531 (332655)
+ begin print_char(")"); force_eof:=false;
+ update_terminal; {show user that file has been read}
+ end_file_reading; {resume previous level}
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-7537 (332934)
+ begin print_char(")"); decr(open_parens);
+ update_terminal; {show user that file has been read}
+ force_eof:=false;
+ end_file_reading; {resume previous level}
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-8039 (354643)
+end
+
+@ If |long_state=outer_call|, a runaway argument has already been reported.
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-8046 (354944)
+end {a white lie; the \.{\\par} won't always trigger a runaway}
+
+@ If |long_state=outer_call|, a runaway argument has already been reported.
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-9811 (423493)
+$$\vbox{\halign{\.{#}\hfil\cr
+ {}\\def\\a\{\\c\}\cr
+ {}\\def\\b\{\\d\}\cr
+ {}\\def\\c\{\}\cr
+ {}\\def\\d\{\}\cr}}$$
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-9818 (423854)
+$$\vbox{\halign{\.{#}\hfil&\qquad\.{#}\hfil\cr
+ {}\\def\\a\{\\c\}&
+ {}\\def\\c\{\}\cr
+ {}\\def\\b\{\\d\}&
+ {}\\def\\d\{\}\cr}}$$
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-9819 (423724)
+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
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-9826 (424098)
+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
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-10334 (445117)
+print_char("("); print(name); update_terminal; state:=new_line;
+if name=str_ptr-1 then {we can conserve string pool space now}
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-10343 (445539)
+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}
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-10348 (445589)
+begin if not input_ln(cur_file,false) then do_nothing;
+firm_up_the_line;
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-10358 (446031)
+begin if input_ln(cur_file,false) then do_nothing;
+firm_up_the_line;
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-14297 (620139)
+@<Convert \(m)math glue to ordinary glue@>=
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-14306 (620575)
+@!@:non_script_}{\.{\\nonscript} primitive@>
+
+@<Convert \(m)math glue to ordinary glue@>=
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-15757 (682439)
+ 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);
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-15768 (682923)
+ 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);
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-16291 (708908)
+@!artificial_badness:boolean; {has |b| been forced to zero?}
+@!save_link:pointer; {temporarily holds value of |link(cur_p)|}
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-16303 (709433)
+@!artificial_demerits:boolean; {has |d| been forced to zero?}
+@!save_link:pointer; {temporarily holds value of |link(cur_p)|}
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-16327 (710517)
+@!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}
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-16339 (711043)
+@!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}
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-16372 (712390)
+minimum_demerits:=minimum_demerits+abs(adj_demerits);
+for fit_class:=very_loose_fit to tight_fit do
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-16384 (712918)
+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
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-16648 (724003)
+begin @!stat artificial_badness:=false;@+tats@/
+@^inner loop@>
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-16662 (724624)
+begin artificial_demerits:=false;@/
+@^inner loop@>
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-16715 (726855)
+ begin b:=0; {set badness zero, this break is forced}
+ @!stat artificial_badness:=true;@+tats
+ end
+else if b>threshold then goto deactivate;
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-16729 (727464)
+ artificial_demerits:=true {set demerits zero, this break is forced}
+else if b>threshold then goto deactivate;
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-16730 (727496)
+@<Compute the demerits, |d|, from |r| to |cur_p|@>;
+@!stat if tracing_paragraphs>0 then
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-16742 (728071)
+if artificial_demerits then d:=0
+else @<Compute the demerits, |d|, from |r| to |cur_p|@>;
+@!stat if tracing_paragraphs>0 then
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-16759 (728599)
+if artificial_badness then print_char("*")@+else print_int(b);
+@.*\relax@>
+print(" p="); print_int(pi);
+print(" d="); print_int(d);
+end
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-16772 (729213)
+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
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-16789 (729635)
+d:=line_penalty+b; d:=d*d;
+if pi<>0 then
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-16802 (730290)
+begin d:=line_penalty+b;
+if abs(d)>=10000 then d:=100000000@+else d:=d*d;
+if pi<>0 then
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-16796 (729893)
+if abs(fit_class-fitness(r))>1 then d:=d+adj_demerits
+
+@ When an active node disappears, we must delete an adjacent delta node if the
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-16810 (730596)
+if abs(fit_class-fitness(r))>1 then d:=d+adj_demerits;
+end
+
+@ When an active node disappears, we must delete an adjacent delta node if the
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-17443 (757502)
+label common_ending,done,found,found1,not_found,not_found+1,exit;
+var @<Local variables for hyphenation@>@;
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-17458 (758211)
+label common_ending,done,found,found1,found2,not_found,exit;
+var @<Local variables for hyphenation@>@;
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-17573 (762590)
+if type(hb)=ligature_node then if odd(subtype(hb)) then
+ bchar:=font_bchar[hf];
+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|}
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-17588 (763294)
+if not is_char_node(hb) then
+ if type(hb)=ligature_node then if odd(subtype(hb)) then
+ bchar:=font_bchar[hf];
+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|}
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-17590 (763293)
+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);
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-17612 (764306)
+found2: s:=ha; j:=0; hu[0]:=256; init_lig:=false; init_list:=null;
+common_ending: flush_node_list(r);
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-19734 (856246)
+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
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-19752 (857149)
+else begin wait:=false; s:=last_ins_ptr(r); link(s):=ins_ptr(p);
+ if best_ins_ptr(r)=p then
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-19752 (856951)
+ split_top_skip:=split_top_ptr(p);
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-19769 (857831)
+ link(s):=null;
+ split_top_skip:=split_top_ptr(p);
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-19759 (857236)
+ link(s):=null;
+ end;
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-19777 (858136)
+ end;
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-19816 (859123)
+begin if loc<>null then @<Recover from an unbalanced output routine@>;
+end_token_list; {conserve stack space in case more outputs are triggered}
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-19833 (860003)
+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}
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-19836 (859949)
+help2("Your sneaky output routine has fewer real {'s than }'s.")@/
+("I can't handle that very well; good luck."); error;
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-19855 (860894)
+help2("Your sneaky output routine has problematic {'s and/or }'s.")@/
+("I can't handle that very well; good luck."); error;
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-19840 (860108)
+end
+
+@ @<Ensure that box 255 is empty after output@>=
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-19859 (861056)
+end {loops forever if reading from a file, since |null=min_halfword<=0|}
+
+@ @<Ensure that box 255 is empty after output@>=
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-20367 (883423)
+ build_page; {append \.{\\hbox to \\hsize\{\}\\vss\\penalty-'10000000000}}
+ end;
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-20386 (884440)
+ build_page; {append \.{\\hbox to \\hsize\{\}\\vfill\\penalty-'10000000000}}
+ end;
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-20568 (891433)
+@ 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);
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-20587 (892452)
+@ @<Drop current token and complain that it was unmatched@>=
+begin print_err("Extra "); print_cmd_chr(cur_cmd,cur_chr);
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-22187 (951719)
+removed when they surround a single Ord character or, when they
+surround an accent that is the nucleus of an Ord atom.
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-22203 (952606)
+removed when they surround a single Ord without sub/superscripts, or when they
+surround an accent that is the nucleus of an Ord atom.
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-22278 (954827)
+ begin cur_mlist:=p; cur_style:=text_style; mlist_penalties:=false;
+ mlist_to_hlist; a:=hpack(link(temp_head),natural);
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-22294 (955729)
+ begin @<Check that another \.\$ follows@>;
+ cur_mlist:=p; cur_style:=text_style; mlist_penalties:=false;
+ mlist_to_hlist; a:=hpack(link(temp_head),natural);
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-22282 (955044)
+ if danger then flush_math;
+ m:=mode; p:=fin_mlist(null);
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-22299 (955986)
+ 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);
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-22287 (955165)
+else begin @<Check that another \.\$ follows@>;
+ @<Finish displayed math@>;
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-22306 (956229)
+else begin if a=null then @<Check that another \.\$ follows@>;
+ @<Finish displayed math@>;
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-22365 (958481)
+adjust_tail:=adjust_head; b:=hpack(p,natural);
+t:=adjust_tail; adjust_tail:=null;@/
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-22384 (959560)
+adjust_tail:=adjust_head; b:=hpack(p,natural); p:=list_ptr(b);
+t:=adjust_tail; adjust_tail:=null;@/
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-22425 (960728)
+ if p<>null then if type(p)=glue_node then d:=0;
+ end
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-22444 (961823)
+ if p<>null then if not is_char_node(p) then if type(p)=glue_node then d:=0;
+ end
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-22458 (961923)
+shift_amount(b):=s+d; append_to_vlist(b);
+if t<>adjust_head then
+ begin link(tail):=link(adjust_head); tail:=t;
+ end
+
+@ @<Append the glue or equation number following the display@>=
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-22477 (963046)
+shift_amount(b):=s+d; append_to_vlist(b)
+
+@ @<Append the glue or equation number following the display@>=
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-22468 (962255)
+ tail_append(new_penalty(post_display_penalty));
+ end
+else begin tail_append(new_penalty(post_display_penalty));
+ tail_append(new_param_glue(g2));
+ end
+
+@ When \.{\\halign} appears in a display, the alignment routines operate
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-22484 (963296)
+ 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))
+
+@ When \.{\\halign} appears in a display, the alignment routines operate
+***************
+
+**** FILE TX:<TEX.TEX>TEX-2-993.WEB.1, 1-24221 (1024814)
+if cur_level>level_one then
+**** FILE TX:<TEX.NEW>TEX-3-0.WEB.1, 1-24239 (1025936)
+while open_parens>0 do
+ begin print(" )"); decr(open_parens);
+ end;
+if cur_level>level_one then
+***************
+
+
+########################################################################
+
+Updates to TEX82.BUG
+
+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)
+
+
+########################################################################
+
+New files at labrea.stanford.edu since 6 Jan 90
+
+/tex:
+-rw-rw-r-- 1 0 5 1444 Jan 8 22:34 CHANGES.Jan90 *
+-rw-rw-r-- 1 0 5 928 Mar 25 16:44 CHANGES.Mar90 *
+-rw-rw-r-- 1 0 5 3283 Mar 25 16:43 README *
+
+/tex/cm:
+-rw-r--r-- 1 0 5 39792 Mar 25 16:16 romanl.mf *
+-rw-r--r-- 1 0 5 43157 Mar 25 16:16 symbol.mf *
+
+/tex/errata:
+-rw-r--r-- 1 0 5 39891 Mar 25 16:16 cm85.bug *
+-rw-r--r-- 1 0 5 12359 Mar 25 16:16 errata.tex *
+-rw-r--r-- 1 0 5 121688 Mar 25 16:17 errorlog.tex *
+-rw-r--r-- 1 0 5 78087 Mar 25 16:17 mf84.bug *
+-rw-r--r-- 1 0 5 293189 Mar 25 16:17 tex82.bug *
+
+/tex/etc:
+-rw-r--r-- 1 0 5 87839 Feb 7 11:25 vftovp.web *
+-rw-r--r-- 1 0 5 122079 Jan 30 09:48 vptovf.web *
+
+/tex/fonts:
+-rw-rw-r-- 1 0 5 256 Mar 19 13:52 logo9.tfm *
+-rw-rw-r-- 1 0 5 552 Jan 28 1989 ransom10.tfm *
+
+/tex/gf:
+-rw-r--r-- 1 0 5 7464 Jan 28 1989 ransom10.300gf *
+
+/tex/latex:
+ [ lcircle*.mf renamed from circle*.mf ]
+-rw-rw-r-- 1 0 5 125 Apr 3 1986 lcircle10.mf *
+-rw-rw-r-- 1 0 5 125 Apr 3 1986 lcirclew10.mf *
+
+/tex/lib:
+-rw-r--r-- 1 0 5 22394 Mar 25 16:17 plain.mf *
+-rw-r--r-- 1 0 5 43760 Mar 25 16:17 plain.tex *
+-rw-r--r-- 1 0 5 9204 Mar 25 16:17 testfont.tex *
+-rw-r--r-- 1 0 5 9992 Mar 25 16:18 webmac.tex *
+
+/tex/latex:
+ [ lcircle*.mf renamed from circle*.mf ]
+-rw-rw-r-- 1 0 5 125 Apr 3 1986 lcircle10.mf *
+-rw-rw-r-- 1 0 5 125 Apr 3 1986 lcirclew10.mf *
+
+/tex/local/etc:
+-rw-r--r-- 1 0 5 772 Jan 3 18:10 Makefile *
+-rw-r--r-- 1 0 5 10843 Mar 25 16:18 vftovp.ch *
+-rw-r--r-- 1 0 5 4384 Jan 3 23:26 vptovf.ch *
+
+/tex/local/lib:
+-rw-r--r-- 1 0 5 5307 Jan 7 22:39 epsf.tex *
+-rw-r--r-- 1 0 5 3201 Jan 6 02:17 fontchart.tex *
+-rw-r--r-- 1 0 5 33672 Jan 7 13:32 gkpmac.tex *
+-rw-r--r-- 1 0 5 4300 Jan 8 09:59 letter.tex *
+-rw-r--r-- 1 0 5 1485 Jan 5 18:24 list.tex *
+-rw-r--r-- 1 0 5 2083 Jan 5 20:22 llist.tex *
+-rw-r--r-- 1 0 5 8220 Mar 25 16:18 picmac.tex *
+-rw-r--r-- 1 0 5 1936 Jan 7 22:39 rotate.tex *
+
+/tex/local/man1:
+-rwxr--r-- 1 0 5 6513 Oct 29 20:13 tex.1 *
+-rw-r--r-- 1 0 5 791 Dec 30 23:07 vftovp.1 *
+-rw-r--r-- 1 0 5 848 Dec 30 23:14 vptovf.1 *
+
+/tex/local/mf:
+-rw-r--r-- 1 0 5 1958 Jan 7 21:53 Makefile *
+-rw-r--r-- 1 0 5 54080 Mar 25 16:18 inimf.ch *
+-rw-r--r-- 1 0 5 22157 Mar 25 16:18 mf.pool *
+-rw-r--r-- 1 0 5 690 Mar 25 16:18 plain.log *
+
+/tex/local/mfware:
+-rw-r--r-- 1 0 5 996 Nov 8 11:59 Makefile *
+-rw-r--r-- 1 0 5 11456 Nov 23 00:04 gftopk.ch *
+-rw-r--r-- 1 0 5 8404 Nov 18 21:58 pktype.ch *
+-rw-r--r-- 1 0 5 47330 Nov 18 21:56 pktype.web *
+
+/tex/local/tex:
+-rw-r--r-- 1 0 5 1873 Jan 7 21:51 Makefile *
+-rwxr--r-- 1 0 5 664 Oct 30 18:21 ini_to_trip *
+-rwxr--r-- 1 0 5 447 Nov 30 14:03 ini_to_vir *
+-rw-r--r-- 1 0 5 53593 Mar 25 16:18 initex.ch *
+-rw-r--r-- 1 0 5 165468 Jan 8 00:31 plain.fmt *
+-rw-r--r-- 1 0 5 2367 Mar 25 16:18 plain.log *
+-rw-r--r-- 1 0 5 25675 Mar 25 16:18 tex.pool *
+
+/tex/local/texware:
+-rw-r--r-- 1 0 5 809 Dec 11 23:14 Makefile *
+-rw-r--r-- 1 0 5 16127 Jan 2 18:07 dvitype.ch *
+-rw-r--r-- 1 0 5 4454 Jan 3 23:30 pltotf.ch *
+-rw-r--r-- 1 0 5 7033 Dec 10 23:40 tftopl.ch *
+
+/tex/local/web:
+-rw-r--r-- 1 0 5 682 Nov 8 12:00 Makefile *
+-rw-r--r-- 1 0 5 20055 Mar 25 16:18 weave.ch *
+
+/tex/mf:
+total 2013
+-rw-r--r-- 1 0 5 916616 Mar 25 16:20 mf.web *
+-rw-r--r-- 1 0 5 938281 Mar 25 16:21 mfbook.tex *
+-rw-r--r-- 1 0 5 1703 Mar 25 16:21 trap.fot *
+-rw-r--r-- 1 0 5 121719 Mar 25 16:21 trap.log *
+-rw-r--r-- 1 0 5 11842 Mar 25 16:21 trap.mf *
+-rw-r--r-- 1 0 5 10388 Dec 20 13:04 trap.pl
+-rw-r--r-- 1 0 5 4550 Mar 25 16:21 trap.typ *
+-rw-r--r-- 1 0 5 4586 Mar 25 16:21 trapin.log *
+-rw-r--r-- 1 0 5 18249 Dec 4 20:32 trapman.tex
+
+/tex/mfware:
+-rw-r--r-- 1 0 5 186565 Jan 2 14:16 gftodvi.web *
+-rw-r--r-- 1 0 5 92291 Nov 23 00:04 gftopk.web *
+-rw-r--r-- 1 0 5 74981 Dec 4 16:19 mft.web *
+
+/tex/patches:
+total 131
+-rw-rw-r-- 1 0 5 842 Mar 25 16:40 TeX3.0.patch1 *
+-rw-rw-r-- 1 0 5 2999 Mar 25 16:40 TeX3.0.patch2 *
+-rw-rw-r-- 1 0 5 48519 Mar 25 16:40 TeX3.0.patch3 *
+-rw-rw-r-- 1 0 5 39542 Mar 25 16:40 TeX3.0.patch4 *
+-rw-rw-r-- 1 0 5 40546 Mar 25 16:40 TeX3.0.patch5 *
+
+/tex/tex:
+total 2662
+-rw-r--r-- 1 0 5 1025443 Mar 25 16:23 tex.web *
+-rw-r--r-- 1 0 5 1381711 Mar 25 16:25 texbook.tex *
+-rw-r--r-- 1 0 5 2437 Mar 25 16:25 trip.fot *
+-rw-r--r-- 1 0 5 182686 Mar 25 16:25 trip.log *
+-rw-r--r-- 1 0 5 16990 Oct 6 09:35 trip.pl
+-rw-r--r-- 1 0 5 22555 Mar 25 16:25 trip.tex *
+-rw-r--r-- 1 0 5 18025 Mar 25 16:25 trip.typ *
+-rw-r--r-- 1 0 5 12931 Mar 25 16:25 tripin.log *
+-rw-r--r-- 1 0 5 19227 Dec 4 19:51 tripman.tex
+-rw-r--r-- 1 0 5 58 May 30 1983 tripos.tex
+
+/tex/tugboat:
+-rw-r--r-- 1 0 5 32405 Feb 26 13:36 guidepro.tex *
+-rw-r--r-- 1 0 5 12488 Feb 26 13:35 ltugboat.sty *
+-rw-r--r-- 1 0 5 22349 Feb 26 13:35 tugboat.com *
+-rw-r--r-- 1 0 5 64456 Feb 26 13:35 tugboat.sty *
+-rw-r--r-- 1 0 5 6154 Feb 26 13:35 tugproc.sty *
+
+/tex/web:
+total 416
+-rw-r--r-- 1 0 5 129556 Oct 6 17:57 tangle.web
+-rw-r--r-- 1 0 5 185497 Mar 25 16:26 weave.web *
+-rw-r--r-- 1 0 5 89194 Mar 25 16:26 webman.tex *
+
+
+########################################################################
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Character code reference
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Upper case letters: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+% Lower case letters: abcdefghijklmnopqrstuvwxyz
+% Digits: 0123456789
+% Square, curly, angle braces, parentheses: [] {} <> ()
+% Backslash, slash, vertical bar: \ / |
+% Punctuation: . ? ! , : ;
+% Underscore, hyphen, equals sign: _ - =
+% Quotes--right left double: ' ` "
+%"at", "number" "dollar", "percent", "and": @ # $ % &
+% "hat", "star", "plus", "tilde": ^ * + ~
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+[ end of message 024 ]