diff options
Diffstat (limited to 'Build/source/texk/web2c/ptexdir/ptex-base.ch')
-rw-r--r-- | Build/source/texk/web2c/ptexdir/ptex-base.ch | 101 |
1 files changed, 47 insertions, 54 deletions
diff --git a/Build/source/texk/web2c/ptexdir/ptex-base.ch b/Build/source/texk/web2c/ptexdir/ptex-base.ch index 85aa811c5de..7fe65d7d6df 100644 --- a/Build/source/texk/web2c/ptexdir/ptex-base.ch +++ b/Build/source/texk/web2c/ptexdir/ptex-base.ch @@ -44,6 +44,7 @@ % (08/17/2009) ST pTeX p3.1.11 % (05/23/2010) AK Bug fix by Hironori Kitagawa. % (31/12/2010) AK Bug fix and accent Kanji by Hironori Kitagawa. +% (19/01/2011) PB Let \lastkern etc act through disp node. % @x [1.2] l.200 - pTeX: @d banner==TeX_banner @@ -337,10 +338,10 @@ if last<>first then for k:=first to last-1 do print(buffer[k]); @d box_node_size=8 {number of words to allocate for a box node} @# @d box_dir(#) == subtype(#) {direction mode of a box} -@d dir_default == qi(0) {direction of the box, default Left to Right} -@d dir_dtou == qi(1) {direction of the box, Bottom to Top} -@d dir_tate == qi(3) {direction of the box, Top to Bottom} -@d dir_yoko == qi(4) {direction of the box, equal default} +@d dir_default = 0 {direction of the box, default Left to Right} +@d dir_dtou = 1 {direction of the box, Bottom to Top} +@d dir_tate = 3 {direction of the box, Top to Bottom} +@d dir_yoko = 4 {direction of the box, equal default} @d any_dir == dir_yoko,dir_tate,dir_dtou @# @d width_offset=1 {position of |width| field in a box node} @@ -958,7 +959,7 @@ kern_node,disp_node,math_node,penalty_node: @y @<Types...@>= @!list_state_record=record@!mode_field:-mmode..mmode;@+ - @!dir_field,@!adj_dir_field: -dir_dtou..dir_dtou; + @!dir_field,@!adj_dir_field: -dir_yoko..dir_yoko; @!pdisp_field: scaled; @!head_field,@!tail_field,@!pnode_field,@!last_jchr_field: pointer; @z @@ -1965,6 +1966,32 @@ else end; @z +@x [26.424] l.8690 - pTeX: Fetch an item ...: disp_node + 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; + end; +@y + begin if (type(tail)=disp_node)and not is_char_node(prev_node) then q:=prev_node + else q:=tail; + case cur_chr of + int_val: if type(q)=penalty_node then cur_val:=penalty(q); + dimen_val: if type(q)=kern_node then cur_val:=width(q); + glue_val: if type(q)=glue_node then + begin cur_val:=glue_ptr(q); + if subtype(q)=mu_glue then cur_val_level:=mu_val; + end; +@z +@x [26.424] l.8690 - pTeX: Fetch an item ...: disp_node + end {there are no other cases} +@y + end; {there are no other cases} + end +@z + @x [26.435] l.8940 - pTeX: scan_char_num procedure scan_char_num; begin scan_int; @@ -4520,29 +4547,8 @@ q:pointer; @z @x [47.1076] l.21553 - pTeX: box_dir adjust -begin if cur_box<>null then begin shift_amount(cur_box):=box_context; - if abs(mode)=vmode then - begin append_to_vlist(cur_box); - if adjust_tail<>null then - begin if adjust_head<>adjust_tail then - begin link(tail):=link(adjust_head); tail:=adjust_tail; - end; - adjust_tail:=null; - end; - if mode>0 then build_page; - end - else begin if abs(mode)=hmode then space_factor:=1000 - else begin p:=new_noad; - math_type(nucleus(p)):=sub_box; - info(nucleus(p)):=cur_box; cur_box:=p; - end; - link(tail):=cur_box; tail:=cur_box; - end; - end; -end @y -begin if cur_box<>null then begin p:=link(cur_box); link(cur_box):=null; while p<>null do begin q:=p; p:=link(p); @@ -4558,27 +4564,6 @@ begin if cur_box<>null then if box_dir(cur_box)<>abs(direction) then cur_box:=new_dir_node(cur_box,abs(direction)); shift_amount(cur_box):=box_context; - if abs(mode)=vmode then - begin append_to_vlist(cur_box); - if adjust_tail<>null then - begin if adjust_head<>adjust_tail then - begin link(tail):=link(adjust_head); tail:=adjust_tail; - end; - adjust_tail:=null; - end; - if mode>0 then build_page; - end - else begin - if abs(mode)=hmode then - space_factor:=1000 - else begin p:=new_noad; - math_type(nucleus(p)):=sub_box; - info(nucleus(p)):=cur_box; cur_box:=p; - end; - link(tail):=cur_box; tail:=cur_box; - end; -end; -end @z @x [47.1078] l.21585 - pTeX: box_dir adjust @@ -4622,6 +4607,14 @@ var @!p,@!q:pointer; {run through the current list} @!f:boolean; {will |d| free?} @z +@x [47.1080] l.21625 - pTeX: disp_node, check head=tail +@ Note that the condition |not is_char_node(tail)| implies that |head<>tail|, +since |head| is a one-word node. +@y +@ Note that in \TeX\ the condition |not is_char_node(tail)| implies that +|head<>tail|, since |head| is a one-word node; this is not so for p\TeX. +@z + @x [47.1080] l.21636 - pTeX: disp_node, check head=tail else begin if not is_char_node(tail) then if (type(tail)=hlist_node)or(type(tail)=vlist_node) then @@ -4936,7 +4929,7 @@ else begin begin if prev_disp=disp_dimen(d) then {|free_node(tail,small_node_size)|} else disp_dimen(tail):=disp_dimen(d); - if f then free_node(d,small_node_size) + if f then free_node(d,small_node_size) else begin prev_node:=tail; prev_disp:=disp; tail_append(d) end end else @@ -5192,7 +5185,7 @@ tail:=new_kern(-a-delta); subtype(tail):=acc_kern; link(p):=tail; p:=q; @y tail:=new_kern(-a-delta); subtype(tail):=acc_kern; if h=x then begin - if font_dir[font(p)]<>dir_default then link(link(p)):=tail + if font_dir[font(p)]<>dir_default then link(link(p)):=tail else link(p):=tail; end else link(p):=tail; { bugfix: if |p| is KANJI char, |link(p)|:=|tail| collapses |p| and kern after accent. } @@ -6327,21 +6320,21 @@ while p<>null do ligature_node: @<Insert ligature surround spacing@>; penalty_node,disp_node: @<Insert penalty or displace surround spacing@>; kern_node: if (subtype(p)=explicit) then insert_skip:=no_skip - else if (subtype(p)=acc_kern) then begin + else if (subtype(p)=acc_kern) then begin { When we insert \.{\\xkanjiskip}, we first ignore accent (and kerns) and insert \.{\\xkanjiskip}, then we recover the accent. } if q=p then begin t:=link(p); { if p is beginning on the list, we have only to ignore nodes. } - if is_char_node(t) then + if is_char_node(t) then if font_dir[font(t)]<>dir_default then t:=link(t); - p:=link(link(t)); - if font_dir[font(p)]<>dir_default then + p:=link(link(t)); + if font_dir[font(p)]<>dir_default then begin p:=link(p); insert_skip:=after_wchar; end else insert_skip:=after_schar; end else begin a:=p; t:=link(p); - if is_char_node(t) then + if is_char_node(t) then if font_dir[font(t)]<>dir_default then t:=link(t); t:=link(link(t)); link(q):=t; p:=t; @<Insert a space around the character |p|@>; incr(i); |