1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
|
% eptexdir/etex.ch0: changefile used to build e-pTeX, see eptexdir/eptex-base.ch for details.
% Public domain. Originally written by Peter Breitenlohner <tex-live@tug.org>.
@x [10] m.135 l.2895 - e-TeX TeXXeT
|fil|, |fill|, or |filll|). The |subtype| field is not used in \TeX.
@y
|fil|, |fill|, or |filll|). The |subtype| field is not used.
@z
@x [17.236] l.4960 - first web2c, then e-TeX additional integer parameters
@d int_pars=web2c_int_pars {total number of integer parameters}
@#
@d etex_int_base=tex_int_pars {base for \eTeX's integer parameters}
@y
@d int_pars=web2c_int_pars {total number of integer parameters}
@z
@x [18.???] pTeX: ensure buffer2[]=0 in primitive
for j:=0 to l-1 do buffer[first+j]:=so(str_pool[k+j]);
@y
for j:=0 to l-1 do buffer[j]:=so(str_pool[k+j]);
@z
@x [26.413]
{fetch an internal parameter}
label exit;
var m:halfword; {|chr_code| part of the operand token}
@!q,@!r:pointer; {general purpose indices}
@!tx:pointer; {effective tail node}
@y
{fetch an internal parameter}
var m:halfword; {|chr_code| part of the operand token}
@z
@x [26.413]
exit:end;
@y
end;
@z
@x
@d badness_code=input_line_no_code+1 {code for \.{\\badness}}
@y
@d badness_code=glue_val+2 {code for \.{\\badness}}
@z
@x [26.420]
begin scan_register_num; fetch_box(q);
if q=null then cur_val:=0 @+else cur_val:=mem[q+m].sc;
@y
begin scan_eight_bit_int;
if box(cur_val)=null then cur_val:=0 @+else cur_val:=mem[box(cur_val)+m].sc;
@z
@x [26.424]
legal in similar contexts.
@y
legal in similar contexts.
@z
@x [26.424]
@d find_effective_tail==find_effective_tail_eTeX
@y
@z
@x
if m>=eTeX_glue then @<Process an expression and |return|@>@;
else if m>=eTeX_dim then
begin case m of
@/@<Cases for fetching a dimension value@>@/
end; {there are no other cases}
cur_val_level:=dimen_val;
end
else begin case m of
input_line_no_code: cur_val:=line;
badness_code: cur_val:=last_badness;
@/@<Cases for fetching an integer value@>@/
end; {there are no other cases}
@y
begin if cur_chr=input_line_no_code then cur_val:=line
else cur_val:=last_badness; {|cur_chr=badness_code|}
@z
@x [26.424]
find_effective_tail;
@y
@z
@x [26.424]
if not is_char_node(tx)and(mode<>0) then
case cur_chr of
int_val: if type(tx)=penalty_node then cur_val:=penalty(tx);
dimen_val: if type(tx)=kern_node then cur_val:=width(tx);
glue_val: if type(tx)=glue_node then
begin cur_val:=glue_ptr(tx);
if subtype(tx)=mu_glue then cur_val_level:=mu_val;
@y
if not is_char_node(tail)and(mode<>0) then
case cur_chr of
int_val: if type(tail)=penalty_node then cur_val:=penalty(tail);
dimen_val: if type(tail)=kern_node then cur_val:=width(tail);
glue_val: if type(tail)=glue_node then
begin cur_val:=glue_ptr(tail);
if subtype(tail)=mu_glue then cur_val_level:=mu_val;
@z
@x [26.424]
else if (mode=vmode)and(tx=head) then
@y
else if (mode=vmode)and(tail=head) then
@z
@x [27.468]
@d etex_convert_base=5 {base for \eTeX's command codes}
@d eTeX_revision_code=etex_convert_base {command code for \.{\\eTeXrevision}}
@d etex_convert_codes=etex_convert_base+1 {end of \eTeX's command codes}
@d job_name_code=etex_convert_codes {command code for \.{\\jobname}}
@y
@d job_name_code=5 {command code for \.{\\jobname}}
@z
@x [30.581]
@p procedure char_warning(@!f:internal_font_number;@!c:eight_bits);
var old_setting: integer; {saved value of |tracing_online|}
@y
@p procedure char_warning(@!f:internal_font_number;@!c:eight_bits);
@z
@x [32.619]
save_loc:=dvi_offset+dvi_ptr; base_line:=cur_v;
prev_p:=this_box+list_offset;
@<Initialize |hlist_out| for mixed direction typesetting@>;
left_edge:=cur_h;
@y
save_loc:=dvi_offset+dvi_ptr; base_line:=cur_v; left_edge:=cur_h;
@z
@x [32.620]
prev_p:=link(prev_p); {N.B.: not |prev_p:=p|, |p| might be |lig_trick|}
@y
@z
@x [32.624] l.13005 - pTeX: output a box(and dir_node) with disp
cur_h:=edge; cur_v:=base_line;
@y
cur_h:=edge+width(p); cur_v:=base_line;
@z
@x [33.649]
exit: if TeXXeT_en then @<Check for LR anomalies at the end of |hpack|@>;
hpack:=r;
@y
exit: hpack:=r;
@z
@x [44.977]
q:=prune_page_top(q,saving_vdiscards>0);
p:=list_ptr(v); free_node(v,box_node_size);
if q<>null then q:=vpack(q,natural);
change_box(q); {the |eq_level| of the box stays the same}
@y
q:=prune_page_top(q); p:=list_ptr(v); free_node(v,box_node_size);
if q=null then box(n):=null {the |eq_level| of the box stays the same}
else box(n):=vpack(q,natural);
@z
@x [47.1079]
@!r:pointer; {running behind |p|}
@!fm:boolean; {a final \.{\\beginM} \.{\\endM} node pair?}
@!tx:pointer; {effective tail node}
@y
@z
@x [47.1080]
@d check_effective_tail(#)==find_effective_tail_eTeX
@d fetch_effective_tail==fetch_effective_tail_eTeX
@y
@z
@x [47.1080]
else begin check_effective_tail(goto done);
if not is_char_node(tx) then
if (type(tx)=hlist_node)or(type(tx)=vlist_node) then
@<Remove the last box, unless it's part of a discretionary@>;
done:end;
@y
else begin if not is_char_node(tail) then
if (type(tail)=hlist_node)or(type(tail)=vlist_node) then
@<Remove the last box, unless it's part of a discretionary@>;
end;
@z
@x [47.1081]
begin fetch_effective_tail(goto done);
cur_box:=tx; shift_amount(cur_box):=0;
end
@y
begin q:=head;
repeat p:=q;
if not is_char_node(q) then if type(q)=disc_node then
begin for m:=1 to replace_count(q) do p:=link(p);
if p=tail then goto done;
end;
q:=link(p);
until q=tail;
cur_box:=tail; shift_amount(cur_box):=0;
tail:=p; link(p):=null;
done:end
@z
@x [47.1096]
else line_break(false);
@y
else line_break(widow_penalty);
@z
@x [47.1105]
@!r:pointer; {running behind |p|}
@!fm:boolean; {a final \.{\\beginM} \.{\\endM} node pair?}
@!tx:pointer; {effective tail node}
@y
@z
@x [47.1105]
else begin check_effective_tail(return);
if not is_char_node(tx) then if type(tx)=cur_chr then
begin fetch_effective_tail(return);
flush_node_list(tx);
@y
else begin if not is_char_node(tail) then if type(tail)=cur_chr then
begin q:=head;
repeat p:=q;
if not is_char_node(q) then if type(q)=disc_node then
begin for m:=1 to replace_count(q) do p:=link(p);
if p=tail then return;
end;
q:=link(p);
until q=tail;
link(p):=null; flush_node_list(tail); tail:=p;
@z
@x [47.1110]
else begin link(tail):=list_ptr(p); change_box(null);
@y
else begin link(tail):=list_ptr(p); box(cur_val):=null;
@z
@x [48.1145]
else begin line_break(true);@/
@y
else begin line_break(display_widow_penalty);@/
@z
@x [49.1247]
if b<>null then mem[b+c].sc:=cur_val;
@y
if box(b)<>null then mem[box(b)+c].sc:=cur_val;
@z
|