@x primitive("radical",radical,0);@/ @!@:radical_}{\.{\\radical} primitive@> @y primitive("radical",radical,0);@/ @!@:radical_}{\.{\\radical} primitive@> primitive("genradical",radical,1);@/ @!@:genradical_}{\.{\\genradical} primitive@> @z @x radical: print_esc("radical"); @y radical: if chr_code=0 then print_esc("radical") else print_esc("genradical"); @z @x @d radical_noad_size=5 {number of |mem| words in a radical noad} @y @d radical_noad_size=6 {number of |mem| words in a radical noad} @d is_null_delimiter(#) == ((mem[#].qqqq.b0=0) and (mem[#].qqqq.b1=min_quarterword) and (mem[#].qqqq.b2=0) and (mem[#].qqqq.b3=min_quarterword)) @z @x radical_noad: begin print_esc("radical"); print_delimiter(left_delimiter(p)); end; @y radical_noad: if subtype(p)=normal then begin print_esc("radical"); print_delimiter(left_delimiter(p)); end else begin print_esc("genradical"); print_delimiter(left_delimiter(p)); print_delimiter(right_delimiter(p)); end; @z @x procedure make_radical(@!q:pointer); var x,@!y:pointer; {temporary registers for box construction} @!delta,@!clr:scaled; {dimensions involved in the calculation} begin x:=clean_box(nucleus(q),cramped_style(cur_style)); if cur_style0 then clr:=clr+half(delta); {increase the actual clearance} shift_amount(y):=-(height(x)+clr); link(y):=overbar(x,clr,height(y)); info(nucleus(q)):=hpack(y,natural); math_type(nucleus(q)):=sub_box; end; @y procedure make_radical(@!q:pointer); var x,@!y,z:pointer; {temporary registers for box construction} @!delta,@!clr,ht:scaled; {dimensions involved in the calculation} begin x:=clean_box(nucleus(q),cramped_style(cur_style)); if cur_style0 then clr:=clr+half(delta); {increase the actual clearance} shift_amount(y):=-(height(x)+clr); ht:=height(y); if subtype(q)=normal then link(y):=overbar(x,clr,ht) else begin z:=var_delimiter(right_delimiter(q),cur_size,height(x)+depth(x)+clr+ default_rule_thickness); shift_amount(z):=-(height(x)+clr); if height(z)>ht then ht:=height(z); link(y):=overbar(x,clr,ht); link(link(y)):=z; end; info(nucleus(q)):=hpack(y,natural); math_type(nucleus(q)):=sub_box; end; @z @x type(tail):=radical_noad; subtype(tail):=normal; @y type(tail):=radical_noad; subtype(tail):=cur_chr; @z @x {before |scan_math| in |math_radical|} @y if subtype(tail)=normal then mem[right_delimiter(tail)].qqqq:=null_delimiter else scan_delimiter(right_delimiter(tail),true); {before |scan_math| in |math_radical|} @z