summaryrefslogtreecommitdiff
path: root/Build/source
diff options
context:
space:
mode:
authorAkira Kakuto <kakuto@fuk.kindai.ac.jp>2016-09-12 00:02:27 +0000
committerAkira Kakuto <kakuto@fuk.kindai.ac.jp>2016-09-12 00:02:27 +0000
commitce47903626f63f03f8d5c4f2cd634537eb2bafd2 (patch)
tree53619be18973734b0cffee3464860eb85be61bf3 /Build/source
parent5e5242f5c5595c835c4f4969b1dae2c6d61461d3 (diff)
ptexdir: patch from H. Kitagawa
git-svn-id: svn://tug.org/texlive/trunk@42040 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source')
-rw-r--r--Build/source/texk/web2c/ptexdir/ChangeLog4
-rw-r--r--Build/source/texk/web2c/ptexdir/ptex-base.ch122
2 files changed, 71 insertions, 55 deletions
diff --git a/Build/source/texk/web2c/ptexdir/ChangeLog b/Build/source/texk/web2c/ptexdir/ChangeLog
index f0e1e4e62f9..bd88b7ee975 100644
--- a/Build/source/texk/web2c/ptexdir/ChangeLog
+++ b/Build/source/texk/web2c/ptexdir/ChangeLog
@@ -1,3 +1,7 @@
+2016-09-12 Hironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
+
+ * ptex-base.ch: New primitive \ifmbox to realize better box in math mode.
+
2016-09-06 Hironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
* ptex-base.ch: Allow only 8bit arguments for \catcode etc.
diff --git a/Build/source/texk/web2c/ptexdir/ptex-base.ch b/Build/source/texk/web2c/ptexdir/ptex-base.ch
index a40aa7a78c3..3f31f30f89e 100644
--- a/Build/source/texk/web2c/ptexdir/ptex-base.ch
+++ b/Build/source/texk/web2c/ptexdir/ptex-base.ch
@@ -363,9 +363,10 @@ In p\TeX\ the |subtype| field records the box direction |box_dir|.
@d hlist_node=0 {|type| of hlist nodes}
@d box_node_size=8 {number of words to allocate for a box node}
@#
-@d box_dir(#) == (qo(subtype(#))) {direction of a box}
+@d dir_max = 5 {the maximal absolute value of direction}
+@d box_dir(#) == (qo(subtype(#))-dir_max) {direction of a box}
@d set_box_dir(#) == subtype(#):=set_box_dir_end
-@d set_box_dir_end(#) == qi(#)
+@d set_box_dir_end(#) == qi(#)+dir_max
@#
@d dir_default = 0 {direction of the box, default Left to Right}
@d dir_dtou = 1 {direction of the box, Bottom to Top}
@@ -401,7 +402,7 @@ glue_sign(p):=normal; glue_order(p):=normal; set_glue_ratio_zero(glue_set(p));
@y
width(p):=0; depth(p):=0; height(p):=0; shift_amount(p):=0; list_ptr(p):=null;
glue_sign(p):=normal; glue_order(p):=normal; set_glue_ratio_zero(glue_set(p));
-space_ptr(p):=zero_glue; xspace_ptr(p):=zero_glue;
+space_ptr(p):=zero_glue; xspace_ptr(p):=zero_glue; set_box_dir(p)(dir_default);
add_glue_ref(zero_glue); add_glue_ref(zero_glue);
@z
@@ -418,7 +419,7 @@ add_glue_ref(zero_glue); add_glue_ref(zero_glue);
var p:pointer; {the new node}
begin if type(b)>vlist_node then confusion("new_dir_node:not box");
p:=new_null_box; type(p):=dir_node; set_box_dir(p)(dir);
-case box_dir(b) of
+case abs(box_dir(b)) of
dir_yoko: @<Yoko to other direction@>;
dir_tate: @<Tate to other direction@>;
dir_dtou: @<DtoU to other direction@>;
@@ -468,7 +469,7 @@ end;
@d rule_node=3 {|type| of rule nodes}
@z
-@x [10.140] l.3083 - pTeX: renumber ins_node, add ins_dir field
+@x [10.140] l.3083 - pTeX: renumber ins_node, add ins_dirh field
@d ins_node=3 {|type| of insertion nodes}
@d ins_node_size=5 {number of words to allocate for an insertion}
@d float_cost(#)==mem[#+1].int {the |floating_penalty| to be used}
@@ -480,7 +481,8 @@ end;
@d float_cost(#)==mem[#+1].int {the |floating_penalty| to be used}
@d ins_ptr(#)==info(#+4) {the vertical list to be inserted}
@d split_top_ptr(#)==link(#+4) {the |split_top_skip| to be used}
-@d ins_dir(#)==subtype(#+5) {direction of |ins_node|}
+@d ins_dir(#)==(subtype(#+5)-dir_max) {direction of |ins_node|}
+@d set_ins_dir(#) == subtype(#+5):=set_box_dir_end
@z
@x [10.141] l.3089 - pTeX: disp_node
@@ -659,7 +661,7 @@ print(", natural size "); print_scaled(height(p));
@y
@ @<Display insertion |p|@>=
begin print_esc("insert"); print_int(qo(subtype(p)));
-print_dir(ins_dir(p));
+print_dir(abs(ins_dir(p)));
print(", natural size "); print_scaled(height(p));
@z
@@ -2035,7 +2037,7 @@ if box(cur_val)=null then cur_val:=0 @+else cur_val:=mem[box(cur_val)+m].sc;
begin scan_eight_bit_int; q:=box(cur_val);
if q=null then cur_val:=0
else begin qx:=q;
- while (q<>null)and(box_dir(q)<>abs(direction)) do q:=link(q);
+ while (q<>null)and(abs(box_dir(q))<>abs(direction)) do q:=link(q);
if q=null then
begin r:=link(qx); link(qx):=null;
q:=new_dir_node(qx,abs(direction)); link(qx):=r;
@@ -2346,6 +2348,7 @@ string_code:if cur_cs<>0 then sprint_cs(cur_cs)
@d if_tbox_code=if_mdir_code+1 { `\.{\\iftbox}' }
@d if_ybox_code=if_tbox_code+1 { `\.{\\ifybox}' }
@d if_dbox_code=if_ybox_code+1 { `\.{\\ifdbox}' }
+@d if_mbox_code=if_dbox_code+1 { `\.{\\ifmbox}' }
@z
@x [28.487] l.9887 - pTeX: iftdir, ifydir, ifddir, iftbox, ifybox, ifdbox
@@ -2368,6 +2371,8 @@ primitive("ifybox",if_test,if_ybox_code);
@!@:if_ybox_}{\.{\\ifybox} primitive@>
primitive("ifdbox",if_test,if_dbox_code);
@!@:if_dbox_}{\.{\\ifdbox} primitive@>
+primitive("ifmbox",if_test,if_mbox_code);
+@!@:if_mbox_}{\.{\\ifmbox} primitive@>
@z
@x [28.488] l.9907 - pTeX: iftdir, ifydir, ifddir, iftbox, ifybox, ifdbox
@@ -2381,6 +2386,7 @@ primitive("ifdbox",if_test,if_dbox_code);
if_tbox_code:print_esc("iftbox");
if_ybox_code:print_esc("ifybox");
if_dbox_code:print_esc("ifdbox");
+ if_mbox_code:print_esc("ifmbox");
@z
@x [28.501] l.10073 - pTeX: iftdir, ifydir, ifddir, iftbox, ifybox, ifdbox
@@ -2390,7 +2396,7 @@ if_tdir_code: b:=(abs(direction)=dir_tate);
if_ydir_code: b:=(abs(direction)=dir_yoko);
if_ddir_code: b:=(abs(direction)=dir_dtou);
if_mdir_code: b:=(direction<0);
-if_void_code, if_hbox_code, if_vbox_code, if_tbox_code, if_ybox_code, if_dbox_code:
+if_void_code, if_hbox_code, if_vbox_code, if_tbox_code, if_ybox_code, if_dbox_code, if_mbox_code:
@<Test box register status@>;
@z
@@ -2406,9 +2412,10 @@ else begin
if type(p)=dir_node then p:=list_ptr(p);
if this_if=if_hbox_code then b:=(type(p)=hlist_node)
else if this_if=if_vbox_code then b:=(type(p)=vlist_node)
- else if this_if=if_tbox_code then b:=(box_dir(p)=dir_tate)
- else if this_if=if_ybox_code then b:=(box_dir(p)=dir_yoko)
- else b:=(box_dir(p)=dir_dtou);
+ else if this_if=if_tbox_code then b:=(abs(box_dir(p))=dir_tate)
+ else if this_if=if_ybox_code then b:=(abs(box_dir(p))=dir_yoko)
+ else if this_if=if_dbox_code then b:=(abs(box_dir(p))=dir_dtou)
+ else b:=(box_dir(p)<0);
end
@z
@@ -3169,7 +3176,7 @@ if type(p)=dir_node then
free_node(del_node,box_node_size);
end;
flush_node_list(link(p)); link(p):=null;
-if box_dir(p)<>dir_yoko then p:=new_dir_node(p,dir_yoko);
+if abs(box_dir(p))<>dir_yoko then p:=new_dir_node(p,dir_yoko);
@<Ship box |p| out@>;
@z
@@ -3230,6 +3237,7 @@ var r:pointer; {the box node that will be returned}
q:=r+list_offset; link(q):=p;@/
h:=0; @<Clear dimensions to zero@>;
@y
+set_box_dir(r)(dir_default);
space_ptr(r):=cur_kanji_skip; xspace_ptr(r):=cur_xkanji_skip;
add_glue_ref(cur_kanji_skip); add_glue_ref(cur_xkanji_skip);
k:=cur_kanji_skip;
@@ -3344,7 +3352,7 @@ begin last_badness:=0; r:=get_node(box_node_size); type(r):=vlist_node;
subtype(r):=min_quarterword; shift_amount(r):=0;
@y
begin last_badness:=0; r:=get_node(box_node_size); type(r):=vlist_node;
-subtype(r):=min_quarterword; shift_amount(r):=0;
+subtype(r):=min_quarterword; shift_amount(r):=0; set_box_dir(r)(dir_default);
space_ptr(r):=zero_glue; xspace_ptr(r):=zero_glue;
add_glue_ref(zero_glue); add_glue_ref(zero_glue);
@z
@@ -3526,15 +3534,19 @@ function shift_sub_exp_box(@!q:pointer):pointer;
{ We assume that |math_type(q)=sub_exp_box| }
var d: halfword; {displacement}
begin
- if direction=dir_tate then d:=t_baseline_shift
- else d:=y_baseline_shift;
- if cur_style<script_style then
- d:=xn_over_d(d,text_baseline_shift_factor, 1000)
- else if cur_style<script_script_style then
- d:=xn_over_d(d,script_baseline_shift_factor, 1000)
- else
- d:=xn_over_d(d,scriptscript_baseline_shift_factor, 1000);
- shift_amount(info(q)):=shift_amount(info(q))-d;
+ if abs(direction)=abs(box_dir(info(q))) then begin
+ if abs(direction)=dir_tate then begin
+ if box_dir(info(q))=dir_tate then d:=t_baseline_shift
+ else d:=y_baseline_shift end
+ else d:=y_baseline_shift;
+ if cur_style<script_style then
+ d:=xn_over_d(d,text_baseline_shift_factor, 1000)
+ else if cur_style<script_script_style then
+ d:=xn_over_d(d,script_baseline_shift_factor, 1000)
+ else
+ d:=xn_over_d(d,scriptscript_baseline_shift_factor, 1000);
+ shift_amount(info(q)):=shift_amount(info(q))-d;
+ end;
math_type(q):=sub_box;
shift_sub_exp_box:=info(q);
end;
@@ -3948,7 +3960,7 @@ glue_order(q):=glue_order(p); glue_sign(q):=glue_sign(p);
glue_set(q):=glue_set(p); shift_amount(q):=o;
r:=link(list_ptr(q)); s:=link(list_ptr(p));
@y
-set_box_dir(q)(abs(direction));
+set_box_dir(q)(direction);
glue_order(q):=glue_order(p); glue_sign(q):=glue_sign(p);
glue_set(q):=glue_set(p); shift_amount(q):=o;
r:=link(list_ptr(q)); s:=link(list_ptr(p));
@@ -3964,7 +3976,7 @@ s:=link(s); link(u):=new_null_box; u:=link(u); t:=t+width(s);
if mode=-vmode then width(u):=width(s)@+else
begin type(u):=vlist_node; height(u):=width(s);
end;
-set_box_dir(u)(abs(direction))
+set_box_dir(u)(direction)
@z
@x [37.810] l.16564 - pTeX: unset box -> BOX
@@ -3972,7 +3984,7 @@ width(r):=w; type(r):=hlist_node;
end
@y
width(r):=w; type(r):=hlist_node;
-set_box_dir(r)(abs(direction));
+set_box_dir(r)(direction);
end
@z
@@ -3980,7 +3992,7 @@ end
height(r):=w; type(r):=vlist_node;
@y
height(r):=w; type(r):=vlist_node;
-set_box_dir(r)(abs(direction));
+set_box_dir(r)(direction);
@z
@x [38.816] l.16687 - pTeX: init chain, delete disp_node
@@ -4451,7 +4463,7 @@ else height(r):=height(box(n))+depth(box(n));
@y
if box(n)=null then height(r):=0
else
- begin if ins_dir(p)<>box_dir(box(n)) then
+ begin if abs(ins_dir(p))<>abs(box_dir(box(n))) then
begin print_err("Insertions can only be added to a same direction vbox");
@.Insertions can only...@>
help3("Tut tut: You're trying to \insert into a")@/
@@ -4478,9 +4490,9 @@ else begin wait:=false; s:=last_ins_ptr(r); link(s):=ins_ptr(p);
if best_ins_ptr(r)=null then wait:=true
else begin wait:=false;
n:=qo(subtype(p));
- case box_dir(box(n)) of
+ case abs(box_dir(box(n))) of
any_dir:
- if ins_dir(p)<>box_dir(box(n)) then begin
+ if abs(ins_dir(p))<>abs(box_dir(box(n))) then begin
print_err("Insertions can only be added to a same direction vbox");
@.Insertions can only...@>
help3("Tut tut: You're trying to \insert into a")@/
@@ -4490,7 +4502,7 @@ else begin wait:=false;
box(n):=new_null_box; last_ins_ptr(r):=box(n)+list_offset;
end;
othercases
- set_box_dir(box(n))(ins_dir(p));
+ set_box_dir(box(n))(abs(ins_dir(p)));
endcases;
s:=last_ins_ptr(r); link(s):=ins_ptr(p);
@z
@@ -4511,7 +4523,7 @@ delete_glue_ref(space_ptr(box(n)));
delete_glue_ref(xspace_ptr(box(n)));
flush_node_list(link(box(n)));
free_node(box(n),box_node_size);
-box(n):=vpack(temp_ptr,natural); set_box_dir(box(n))(ins_dir(p));
+box(n):=vpack(temp_ptr,natural); set_box_dir(box(n))(abs(ins_dir(p)));
@z
@x [46.1030] l.20687 - pTeX:main_control
@@ -4807,7 +4819,7 @@ q:pointer;
begin p:=link(cur_box); link(cur_box):=null;
while p<>null do begin
q:=p; p:=link(p);
- if box_dir(q)=abs(direction) then
+ if abs(box_dir(q))=abs(direction) then
begin list_ptr(q):=cur_box; cur_box:=q; link(cur_box):=null;
end
else begin
@@ -4816,7 +4828,7 @@ q:pointer;
free_node(q,box_node_size);
end;
end;
- if box_dir(cur_box)<>abs(direction) then
+ if abs(box_dir(cur_box))<>abs(direction) then
cur_box:=new_dir_node(cur_box,abs(direction));
shift_amount(cur_box):=box_context;
@z
@@ -4839,7 +4851,7 @@ q:pointer;
begin p:=link(cur_box); link(cur_box):=null;
while p<>null do
begin q:=p; p:=link(p);
- if box_dir(q)=abs(direction) then
+ if abs(box_dir(q))=abs(direction) then
begin list_ptr(q):=cur_box; cur_box:=q; link(cur_box):=null;
end
else begin
@@ -4848,7 +4860,7 @@ q:pointer;
free_node(q,box_node_size);
end;
end;
- if box_dir(cur_box)<>abs(direction) then
+ if abs(box_dir(cur_box))<>abs(direction) then
cur_box:=new_dir_node(cur_box,abs(direction));
end;
leader_ptr(tail):=cur_box;
@@ -4947,7 +4959,7 @@ if type(cur_box)=dir_node then
list_ptr(link(cur_box)):=null;
end
else
- if box_dir(cur_box)=dir_default then set_box_dir(cur_box)(abs(direction));
+ if box_dir(cur_box)=dir_default then set_box_dir(cur_box)(direction);
end
@z
@@ -5009,10 +5021,10 @@ begin d:=box_max_depth;
unsave; save_ptr:=save_ptr-3;
if mode=-hmode then begin
cur_box:=hpack(link(head),saved(2),saved(1));
- set_box_dir(cur_box)(abs(direction)); pop_nest;
+ set_box_dir(cur_box)(direction); pop_nest;
end else begin
cur_box:=vpackage(link(head),saved(2),saved(1),d);
- set_box_dir(cur_box)(abs(direction)); pop_nest;
+ set_box_dir(cur_box)(direction); pop_nest;
if c=vtop_code then
@<Readjust the height and depth of |cur_box|, for \.{\\vtop}@>;
end;
@@ -5041,7 +5053,7 @@ vmode+letter,vmode+other_char,vmode+char_num,vmode+char_given,
push_nest; mode:=hmode; space_factor:=1000; set_cur_lang; clang:=cur_lang;
@y
inhibit_glue_flag := false;
-push_nest; adjust_dir:=abs(direction);
+push_nest; adjust_dir:=direction;
mode:=hmode; space_factor:=1000; set_cur_lang; clang:=cur_lang;
@z
@@ -5085,19 +5097,19 @@ insert_group: begin end_graf; q:=split_top_skip; add_glue_ref(q);
insert_group: begin end_graf; q:=split_top_skip; add_glue_ref(q);
d:=split_max_depth; f:=floating_penalty; unsave; decr(save_ptr);
{now |saved(0)| is the insertion number, or 255 for |vadjust|}
- p:=vpack(link(head),natural); set_box_dir(p)(abs(direction)); pop_nest;
+ p:=vpack(link(head),natural); set_box_dir(p)(direction); pop_nest;
if saved(0)<255 then
begin r:=get_node(ins_node_size);
type(r):=ins_node; subtype(r):=qi(saved(0));
height(r):=height(p)+depth(p); ins_ptr(r):=list_ptr(p);
split_top_ptr(r):=q; depth(r):=d; float_cost(r):=f;
- ins_dir(r):=box_dir(p);
+ set_ins_dir(r)(box_dir(p));
if not is_char_node(tail)and(type(tail)=disp_node) then
prev_append(r)
else tail_append(r);
end
else begin
- if box_dir(p)<>adjust_dir then
+ if abs(box_dir(p))<>abs(adjust_dir) then
begin print_err("Direction Incompatible.");
help1("\vadjust's argument and outer vlist must have same direction.");
error; flush_node_list(list_ptr(p));
@@ -5203,9 +5215,9 @@ if (abs(mode)=mmode)or((abs(mode)=vmode)and(type(p)<>vlist_node))or@|
("And I can't open any boxes in math mode.");@/
error; return;
end;
-case box_dir(p) of
+case abs(box_dir(p)) of
any_dir:
- if abs(direction)<>box_dir(p) then begin
+ if abs(direction)<>abs(box_dir(p)) then begin
print_err("Incompatible direction list can't be unboxed");
help2("Sorry, Pandora. (You sneaky devil.)")@/
("I refuse to unbox a box in differrent direction.");@/
@@ -5602,8 +5614,8 @@ vcenter_group: begin end_graf; unsave; save_ptr:=save_ptr-2;
@y
vcenter_group: begin end_graf; unsave; save_ptr:=save_ptr-2;
p:=vpack(link(head),saved(1),saved(0));
- set_box_dir(p)(abs(direction)); pop_nest;
- if box_dir(p)<>abs(direction) then p:=new_dir_node(p,abs(direction));
+ set_box_dir(p)(direction); pop_nest;
+ if abs(box_dir(p))<>abs(direction) then p:=new_dir_node(p,abs(direction));
tail_append(new_noad); type(tail):=vcenter_noad;
math_type(nucleus(tail)):=sub_box; info(nucleus(tail)):=p;
end;
@@ -5692,7 +5704,7 @@ end
@x [48.1200] l.23203 - pTeX: adjust direction
push_nest; mode:=hmode; space_factor:=1000; set_cur_lang; clang:=cur_lang;
@y
-push_nest; adjust_dir:=abs(direction);
+push_nest; adjust_dir:=direction;
mode:=hmode; space_factor:=1000; set_cur_lang; clang:=cur_lang;
@z
@@ -5888,10 +5900,10 @@ scan_normal_dimen;
if box(b)<>null then
begin q:=box(b); p:=link(q);
while p<>null do
- begin if abs(direction)=box_dir(p) then q:=p;
+ begin if abs(direction)=abs(box_dir(p)) then q:=p;
p:=link(p);
end;
- if box_dir(q)<>abs(direction) then
+ if abs(box_dir(q))<>abs(direction) then
begin p:=link(box(b)); link(box(b)):=null;
q:=new_dir_node(q,abs(direction)); list_ptr(q):=null;
link(q):=p; link(box(b)):=q;
@@ -6838,16 +6850,16 @@ begin this_box:=temp_ptr;
temp_ptr:=list_ptr(this_box);
if (type(temp_ptr)<>hlist_node)and(type(temp_ptr)<>vlist_node) then
confusion("dir_out");
- case box_dir(this_box) of
+ case abs(box_dir(this_box)) of
dir_yoko:
- case box_dir(temp_ptr) of
+ case abs(box_dir(temp_ptr)) of
dir_tate: {Tate in Yoko}
begin cur_v:=cur_v-height(this_box); cur_h:=cur_h+depth(temp_ptr) end;
dir_dtou: {DtoU in Yoko}
begin cur_v:=cur_v+depth(this_box); cur_h:=cur_h+height(temp_ptr) end;
endcases;
dir_tate:
- case box_dir(temp_ptr) of
+ case abs(box_dir(temp_ptr)) of
dir_yoko: {Yoko in Tate}
begin cur_v:=cur_v+depth(this_box); cur_h:=cur_h+height(temp_ptr) end;
dir_dtou: {DtoU in Tate}
@@ -6857,7 +6869,7 @@ begin this_box:=temp_ptr;
end;
endcases;
dir_dtou:
- case box_dir(temp_ptr) of
+ case abs(box_dir(temp_ptr)) of
dir_yoko: {Yoko in DtoU}
begin cur_v:=cur_v-height(this_box); cur_h:=cur_h+depth(temp_ptr) end;
dir_tate: {Tate in DtoU}
@@ -6867,7 +6879,7 @@ begin this_box:=temp_ptr;
end;
endcases;
endcases;
- cur_dir_hv:=box_dir(temp_ptr);
+ cur_dir_hv:=abs(box_dir(temp_ptr));
if type(temp_ptr)=vlist_node then vlist_out@+else hlist_out;
end;