diff options
author | Takuji Tanaka <ttk@t-lab.opal.ne.jp> | 2024-02-10 09:42:44 +0000 |
---|---|---|
committer | Takuji Tanaka <ttk@t-lab.opal.ne.jp> | 2024-02-10 09:42:44 +0000 |
commit | e50928cec6ab5ebd6b6a240787811784e3a96b43 (patch) | |
tree | 9010862285877455b87f34bf039d59862a504122 /Build/source/texk/web2c/euptexdir/eptex.ech | |
parent | 90a8327e9b036ece000905d54a316b792d891e0b (diff) |
{,e}uptex: Copy {,e}ptex source files to clean up building environment
git-svn-id: svn://tug.org/texlive/trunk@69767 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/euptexdir/eptex.ech')
-rw-r--r-- | Build/source/texk/web2c/euptexdir/eptex.ech | 804 |
1 files changed, 804 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/euptexdir/eptex.ech b/Build/source/texk/web2c/euptexdir/eptex.ech new file mode 100644 index 00000000000..bb4d31519f4 --- /dev/null +++ b/Build/source/texk/web2c/euptexdir/eptex.ech @@ -0,0 +1,804 @@ +% eptexdir/eptex.ech: changefile used to build e-pTeX, see eptexdir/eptex-base.ch for details. +% Public domain. Originally written by Peter Breitenlohner <tex-live@tug.org>. + +%% new primitives by e-pTeX +%% +%% \epTeXversion +%% \epTeXinputencoding <euc|sjis|jis|utf8> +%% +%% \currentspacingmode: 1 iff auto_spacing +%% \currentxspacingmode: 1 iff auto_xspacing +%% \lastnodechar: the (internal) character code of the last node +%% -1: non-character or null +%% \lastnodesubtype: the (internal) subtype of the last node +%% note: returns a value from the type if the node is s math noad. +%% -1: null +%% fallback to 0 if not explicitly set +%% \readpapersizespecial +%% 1: papersize special automatically sets \pdfpage{width,height} (quick hack). +%% 0: off +%% The default value is 1. +%% + +@x e-pTeX: logo +\def\eTeX{$\varepsilon$-\TeX} +@y +\def\eTeX{$\varepsilon$-\TeX} +\def\epTeX{$\varepsilon$-\pTeX} +@z + +@x [1.2] l.190 - epTeX: +@d eTeX_version_string=='-2.6' {current \eTeX\ version} +@y +@d eTeX_version_string=='-2.6' {current \eTeX\ version} +@# +@d epTeX_version_string=='-230214' +@d epTeX_version_number==230214 +@z + +@x e-pTeX: banner + {printed when \pTeX\ starts} +@y + {printed when \pTeX\ starts} +@# +@d epTeX_version==pTeX_version_string,epTeX_version_string,eTeX_version_string +@d epTeX_banner=='This is e-pTeX, Version 3.141592653',epTeX_version +@d epTeX_banner_k==epTeX_banner + {printed when \epTeX\ starts} +@z + +@x [1.2] +@d banner==pTeX_banner +@d banner_k==pTeX_banner_k +@y +@d banner==epTeX_banner +@d banner_k==epTeX_banner_k +@z + +@x [10.135] l.2895 - e-pTeX: box_lr and box_dir +In \eTeX\ the |subtype| field records the box direction mode |box_lr|. +@y +In \eTeX\ the |subtype| field records the box direction mode |box_lr|. +In \epTeX\ the |subtype| field is |qi(16*box_lr+box_dir)|. +@z + +@x +@d box_dir(#) == (qo(subtype(#))-dir_max) {direction of a box} +@d set_box_dir(#) == subtype(#):=set_box_dir_end +@y +@d box_dir(#) == ((qo(subtype(#)))mod 16 - dir_max) {direction of a box} +@d set_box_dir(#) == subtype(#):=box_lr(#)*16+set_box_dir_end +@z + +@x [17] +@d saving_hyph_codes_code=etex_int_base+8 {save hyphenation codes for languages} +@d eTeX_state_code=etex_int_base+9 {\eTeX\ state variables} +@y +@d saving_hyph_codes_code=etex_int_base+8 {save hyphenation codes for languages} +@d read_papersize_special_code=etex_int_base+9 +@d eTeX_state_code=etex_int_base+10 {\eTeX\ state variables} +@z + +@x [17] +@d saving_hyph_codes==int_par(saving_hyph_codes_code) +@y +@d saving_hyph_codes==int_par(saving_hyph_codes_code) +@d read_papersize_special==int_par(read_papersize_special_code) +@z + +@x [26.???] prepare for |scan_font_ident| to recognize \lastnodefont +@p procedure@?scan_int; forward; {scans an integer value} +@y +@p procedure@?scan_int; forward; {scans an integer value} +procedure@?scan_something_internal_ident; forward; +@z + +@x [26.413] l.8343 - e-pTeX: scan_something_internal +var m:halfword; {|chr_code| part of the operand token} +@y +label exit; +var m:halfword; {|chr_code| part of the operand token} +@z + +@x [26.???] add |scan_something_internal_ident| (used in |scan_font_ident|) +@<Fix the reference count, if any, and negate |cur_val| if |negative|@>; +end; +@y +@<Fix the reference count, if any, and negate |cur_val| if |negative|@>; +end; + +@ @p procedure scan_something_internal_ident; + begin scan_something_internal(ident_val,false); end; +@z + +@x +@d input_line_no_code=glue_val+2 {code for \.{\\inputlineno}} +@d badness_code=glue_val+2 {code for \.{\\badness}} +@y +@d last_node_subtype_code=glue_val+2 {code for \.{\\lastnodesubtype}} +@d last_node_char_code=glue_val+3 {code for \.{\\lastnodechar}} +@d last_node_font_code=glue_val+4 {code for \.{\\lastnodefont}} +@d input_line_no_code=glue_val+5 {code for \.{\\inputlineno}} +@d badness_code=glue_val+6 {code for \.{\\badness}} +@z + +@x +@d ptex_minor_version_code=ptex_version_code+1 {code for \.{\\ptexminorversion}} +@y +@d eptex_version_code=ptex_version_code+1 {code for \.{\\epTeXversion}} +@d ptex_minor_version_code=eptex_version_code+1 {code for \.{\\ptexminorversion}} +@z + +@x e-pTeX: \current(x)spacingmode +@d eTeX_dim=eTeX_int+8 {first of \eTeX\ codes for dimensions} +@y +@d eTeX_dim=eTeX_int+10 {first of \eTeX\ codes for dimensions} +@z + +@x +primitive("ptexminorversion",last_item,ptex_minor_version_code); +@!@:ptexminorversion_}{\.{\\ptexminorversion} primitive@> +@y +primitive("epTeXversion",last_item,eptex_version_code); +@!@:epTeXversion_}{\.{\\epTeXversion} primitive@> +primitive("ptexminorversion",last_item,ptex_minor_version_code); +@!@:ptexminorversion_}{\.{\\ptexminorversion} primitive@> +@z + +@x + ptex_minor_version_code: print_esc("ptexminorversion"); +@y + eptex_version_code: print_esc("epTeXversion"); + ptex_minor_version_code: print_esc("ptexminorversion"); +@z + +@x [26.420] l.8474 - pTeX: Fetch a box dimension: dir_node +begin scan_eight_bit_int; q:=box(cur_val); +@y +begin scan_register_num; fetch_box(q); +@z + +@x [26.424] l.8508 - e-pTeX: TeXXeT and disp_node +node of the current list. +@y +node of the current list. +The macro |find_effective_tail_epTeX| sets |tx| to the last non-\.{\\endM} +non-|disp_node| of the current list. +@z + +@x [26.424] l.8510 - e-pTeX: last node +@d find_effective_tail==find_effective_tail_pTeX +@y +@d find_effective_tail_epTeX== +tx:=tail; +if not is_char_node(tx) then if type(tx)=disp_node then tx:=prev_node; +if not is_char_node(tx) then + if (type(tx)=disp_node) {|disp_node| from a discretionary} + or((type(tx)=math_node)and(subtype(tx)=end_M_code)) then + begin r:=head; q:=link(head); + while q<>tx do + begin if is_char_node(q) then r:=q + else if (type(q)<>disp_node)and + ((type(q)<>math_node)or(subtype(q)<>end_M_code)) then r:=q; + q:=link(q); + end; + tx:=r; + end +@# +@d find_effective_tail==find_effective_tail_epTeX +@# +@d find_last_char== +if font_dir[font(tx)]<>dir_default then cur_val:=KANJI(info(link(tx))) +else cur_val:=qo(character(tx)) + +@d ignore_font_kerning== +begin if ((type(tx)=glue_node) and (subtype(tx)=jfm_skip+1)) + or ((type(tx)=penalty_node) and (subtype(tx)=kinsoku_pena)) then + tx:=last_jchr +else if (type(tx)=kern_node) and (subtype(tx)=normal) then + begin r:=head; q:=link(head); + while q<>tx do + begin r:=q; + if is_char_node(q) then if font_dir[font(q)]<>dir_default then q:=link(q); + q:=link(q); + end; + if ((type(r)=penalty_node) and (subtype(r)=kinsoku_pena)) then tx:=last_jchr else tx:=r; + end; +end +@z + +@x + ptex_minor_version_code: cur_val:=pTeX_minor_version; +@y + eptex_version_code: cur_val:=epTeX_version_number; + ptex_minor_version_code: cur_val:=pTeX_minor_version; +@z + +@x [26.424] e-pTeX: node char + if cur_chr=last_node_type_code then + begin cur_val_level:=int_val; + if (tx=head)or(mode=0) then cur_val:=-1; + end + else cur_val_level:=cur_chr; +@y + if (cur_chr=last_node_type_code)or(cur_chr=last_node_subtype_code) then + begin cur_val_level:=int_val; + if (tx=head)or(mode=0) then cur_val:=-1; + end + else if cur_chr=last_node_char_code then + begin cur_val_level:=int_val; cur_val:=-1; + end + else if cur_chr=last_node_font_code then + begin cur_val_level:=ident_val; cur_val:=null_font+font_id_base; + end + else cur_val_level:=cur_chr; + if (cur_chr=last_node_char_code)or(cur_chr=last_node_font_code) then + if is_char_node(tx)and(tx<>head) then begin + { |tx| might be ``second node'' of a KANJI character; so we need to look the node before |tx| } + r:=head; q:=head; + while q<>tx do begin r:=q; q:=link(q); end; { |r| is the node just before |tx| } + if (r<>head)and is_char_node(r) then if font_dir[font(r)]<>dir_default then tx:=r; + if cur_chr=last_node_char_code then find_last_char + else cur_val:=font(tx)+font_id_base; + end; +@z + +@x [26.424] e-pTeX: node types + last_node_type_code: if type(tx)<=unset_node then cur_val:=type(tx)+1 + else cur_val:=unset_node+2; +@y + last_node_type_code: if type(tx)<=unset_node then + begin if type(tx)=dir_node then tx:=list_ptr(tx); + cur_val:=type(tx); + if cur_val<dir_node then cur_val:=cur_val+1 + else if cur_val>disp_node then cur_val:=cur_val-1; + end + else cur_val:=unset_node; {\epTeX's |unset_node| is \eTeX's |unset_node+2|} + last_node_subtype_code: if type(tx)<=unset_node then cur_val:=subtype(tx) + { non-math nodes } + else begin + cur_val:=type(tx); + if cur_val<unset_node+4 then cur_val:=cur_val-unset_node-1 + { |style_noad|, |choice_noad|, |ord_noad| } + else if cur_val=unset_node+4 then cur_val:=cur_val-unset_node-1+subtype(tx) + else cur_val:=cur_val-unset_node+1; + end; + last_node_char_code: begin + ignore_font_kerning; + if is_char_node(tx) then + find_last_char + else if type(tx)=ligature_node then + {decompose a ligature to original characters} + begin r:=lig_ptr(tx); + while link(r)<>null do r:=link(r); + cur_val:=qo(character(r)); + end + {else: already -1} + end; + last_node_font_code: begin + ignore_font_kerning; + if is_char_node(tx) then + cur_val:=font(tx)+font_id_base + else if type(tx)=ligature_node then + cur_val:=font(lig_char(tx))+font_id_base + {else: already nullfont} + end; +@z + +@x + last_node_type_code: cur_val:=last_node_type; +@y + last_node_type_code: cur_val:=last_node_type; + last_node_subtype_code: cur_val:=last_node_subtype; +@z + +@x e-pTeX: if primitives - leave room for three e-TeX codes +@d if_tdir_code=if_case_code+1 { `\.{\\iftdir}' } +@y +@d if_tdir_code=if_case_code+4 { `\.{\\iftdir}' } +@z + +@x [30.???] |scan_font_ident|: recognize \lastnodefont +else begin print_err("Missing font identifier"); +@y +else if (cur_cmd=last_item)and(cur_chr=last_node_font_code) then + begin scan_something_internal_ident; f:=cur_val-font_id_base; + end +else begin print_err("Missing font identifier"); +@z + +@x +@d box_lr(#) == (qo(subtype(#))) {direction mode of a box} +@d set_box_lr(#) == subtype(#):=set_box_lr_end +@d set_box_lr_end(#) == qi(#) +@y +@d box_lr(#) == ((qo(subtype(#)))div 16) {direction mode of a box} +@d set_box_lr(#) == subtype(#):=box_dir(#)+dir_max+set_box_lr_end +@d set_box_lr_end(#) == qi(16*(#)) +@z + +@x [35] +@<Initialize table entries...@>= +text_baseline_shift_factor:=1000; +@y +@<Initialize table entries...@>= +text_baseline_shift_factor:=1000; +read_papersize_special:=1; +@z + +@x +@!last_node_type:integer; {used to implement \.{\\lastnodetype}} +@y +@!last_node_type:integer; {used to implement \.{\\lastnodetype}} +@!last_node_subtype:integer; {used to implement \.{\\lastnodesubtype}} +@z + +@x +last_node_type:=-1; +@y +last_node_type:=-1; last_node_subtype:=-1; +@z + +@x [45.996] l.19420 +last_node_type:=type(p)+1; +@y +if type(p)<dir_node then last_node_type:=type(p)+1 +else if type(p)=dir_node then last_node_type:=type(list_ptr(p))+1 +else if type(p)<disp_node then last_node_type:=type(p) +else last_node_type:=type(p)-1; {no |disp_node| in a vertical list} +last_node_subtype:=subtype(p); +@z + +@x [47.1079] l.20920 +@!fd:boolean; {a final |disp_node| pair?} +@y +@!s:pointer; {running behind |r|} +@!t:pointer; +@!fm:integer; {1: if |r|, 2: if |p| is a \.{\\beginM} node} +@!gm:integer; {1: if |link(q)|, 2: if |q| is an \.{\\endM} node} +@!fd,@!gd:integer; {same for |disp_node|} +@z + +@x [47.1080] l.20940 +@d check_effective_tail==check_effective_tail_pTeX +@d fetch_effective_tail==fetch_effective_tail_pTeX +@y +@d fetch_effective_tail_epTeX(#)== {extract |tx|, + drop \.{\\beginM} \.{\\endM} pair and\slash or merge |disp_node| pair} +q:=head; p:=null; r:=null; fm:=0; fd:=0; disp:=0; pdisp:=0; +repeat s:=r; r:=p; p:=q; fm:=fm div 2; fd:=fd div 2; +if not is_char_node(q) then + if type(q)=disc_node then + begin for m:=1 to replace_count(q) do + begin p:=link(p); if p=tx then #; end + { |tx| might be a part of discretionary; in this case, nothing will be removed} + end + else if (type(q)=math_node)and(subtype(q)=begin_M_code) then fm:=2 + else if type(q)=disp_node then + begin pdisp:=disp; disp:=disp_dimen(q); fd:=2;@+end; +q:=link(p); +until q=tx; {found |s|$\to$|r|$\to$|p|$\to$|q=tx|} +q:=link(tx); link(p):=q; link(tx):=null; +if q=null then begin tail:=p; gm:=0; gd:=0;@+end +else begin if type(q)=math_node then + begin gm:=2; + if link(q)=null then gd:=0 + else if type(link(q))=disp_node then gd:=1 + else confusion("tail3"); +@:this can't happen tail3}{\quad tail3@> + end + else if type(q)=disp_node then + begin prev_node:=p; gd:=2; + if link(q)=null then gm:=0 + else if type(link(q))=math_node then gm:=1 + else confusion("tail4"); +@:this can't happen tail4}{\quad tail4@> + end + else confusion("tail5"); +@:this can't happen tail5}{\quad tail5@> + end; +if gm=0 then if fm=2 then confusion("tail1") +@:this can't happen tail1}{\quad tail1@> + else if fm=1 then confusion("tail2"); +@:this can't happen tail2}{\quad tail2@> +if (fm+fd)=1 then begin fm:=0; fd:=0;@+end; +if gm=0 then fm:=0; +if gd=0 then fd:=0; +@# +if fd>0 then {merge a |disp_node| pair} + begin if gm=0 then {|p|$\to$|q=disp_node|$to$|null|} + begin t:=q; q:=null; link(p):=q; tail:=p;@+end + else if gm=1 then {|p|$\to$|q=disp_node|$to$|end_M|$to$|null|} + begin t:=q; q:=link(q); link(p):=q; gm:=2;@+end + else {|p|$\to$|q=end_M|$\to$|disp_node|$to$|null|} + begin t:=link(q); link(q):=null; tail:=q;@+end; +@# + if fd=1 then {|s|$\to$|r=disp_node|} + begin prev_node:=s; disp_dimen(r):=disp_dimen(t);@+end + else {|r|$\to$|p=disp_node|} + begin prev_node:=r; disp_dimen(p):=disp_dimen(t);@+end; + prev_disp:=pdisp; free_node(t,small_node_size); gd:=0; + end; +@# +if fm>0 then {drop \.{\\beginM} \.{\\endM} pair} + begin if gd=0 then {|p|$\to$|q=end_M|$to$|null|} + begin t:=q; q:=null; link(p):=q; tail:=p;@+end + else if gd=1 then {|p|$\to$|q=end_M|$to$|disp_node|$to$|null|} + begin t:=q; q:=link(q); link(p):=q; prev_node:=p; link(t):=null + end + else {|p|$\to$|q=disp_node|$\to$|end_M|$to$|null|} + begin t:=link(q); link(q):=null; tail:=q;@+end; +@# + if fm=1 then {|s|$\to$|r=begin_M|$\to$|p=disp_node|} + begin link(s):=p; link(r):=t; t:=r; prev_node:=s;@+end + else {|r|$\to$|p=begin_M|$\to$|q|} + begin link(r):=q; link(p):=t; t:=p; + if q=null then tail:=r@+else prev_node:=r; + end; + flush_node_list(t); + end +@# +@d check_effective_tail(#)==find_effective_tail_epTeX +@d fetch_effective_tail==fetch_effective_tail_epTeX +@z + +@x [47.1105] l.21246 +@!fd:boolean; {a final |disp_node| pair?} +@y +@!s:pointer; {running behind |r|} +@!t:pointer; +@!fm:integer; {1: if |r|, 2: if |p| is a \.{\\beginM} node} +@!gm:integer; {1: if |link(q)|, 2: if |q| is an \.{\\endM} node} +@!fd,@!gd:integer; {same for |disp_node|} +@z + +@x +@d set_language_code=5 {command modifier for \.{\\setlanguage}} +@y +@d set_language_code=5 {command modifier for \.{\\setlanguage}} +@d epTeX_input_encoding_code=6 {command modifier for \.{\\epTeXinputencoding}} +@z + +@x +primitive("setlanguage",extension,set_language_code);@/ +@!@:set_language_}{\.{\\setlanguage} primitive@> +@y +primitive("setlanguage",extension,set_language_code);@/ +@!@:set_language_}{\.{\\setlanguage} primitive@> +primitive("epTeXinputencoding",extension,epTeX_input_encoding_code);@/ +@!@:epTeX_input_encoding_}{\.{\\epTeXinputencoding} primitive@> +@z + +@x + set_language_code:print_esc("setlanguage"); +@y + set_language_code:print_esc("setlanguage"); + epTeX_input_encoding_code:print_esc("epTeXinputencoding"); +@z + +@x +set_language_code:@<Implement \.{\\setlanguage}@>; +@y +set_language_code:@<Implement \.{\\setlanguage}@>; +epTeX_input_encoding_code:@<Implement \.{\\epTeXinputencoding}@>; +@z + +@x +@ @<Finish the extensions@>= +@y +@ @<Declare procedures needed in |do_ext...@>= +procedure eptex_set_input_encoding; +var j,k:integer; +begin + scan_file_name; + pack_cur_name; + if state=token_list then + begin k:=input_ptr-1; j:=-1; + while k>=0 do + begin if input_stack[k].state_field=token_list then decr(k) + else if input_stack[k].name_field>19 then + begin j:=input_stack[k].index_field; k:=-1; end + else begin j:=-(input_stack[k].name_field+1); k:=-1; end + end + end + else if name>19 then j:=index else j:=-(name+1); + if (j>=0) or (j=-1) or (j=-18) then begin + k:=true; + if j>=0 then k:=setinfileenc(input_file[j],stringcast(name_of_file+1)) + else k:=setstdinenc(stringcast(name_of_file+1)); + if k = false then + begin begin_diagnostic; + print_nl("Unknown encoding `"); + slow_print(cur_area); slow_print(cur_name); slow_print(cur_ext); + print("'"); end_diagnostic(false); + end + end + else + begin begin_diagnostic; j:=-j-1; + print_ln; + print_nl("Warning: \epTeXinputencoding is ignored, since I am current reading"); + print_nl("from "); + if j>=18 then print("a pseudo file created by \scantokens.") + else begin print("input stream "); print_int(j); print("."); end; + end_diagnostic(false); + end +end; + +@ @<Implement \.{\\epTeXinputencoding}@>= +eptex_set_input_encoding + +@ @<Finish the extensions@>= +@z + +@x +primitive("lastnodetype",last_item,last_node_type_code); +@!@:last_node_type_}{\.{\\lastnodetype} primitive@> +@y +primitive("lastnodetype",last_item,last_node_type_code); +@!@:last_node_type_}{\.{\\lastnodetype} primitive@> +primitive("lastnodesubtype",last_item,last_node_subtype_code); +@!@:last_node_subtype_}{\.{\\lastnodesubtype} primitive@> +primitive("lastnodechar",last_item,last_node_char_code); +@!@:last_node_char_}{\.{\\lastnodechar} primitive@> +primitive("lastnodefont",last_item,last_node_font_code); +@!@:last_node_font_}{\.{\\lastnodefont} primitive@> +@z + +@x +last_node_type_code: print_esc("lastnodetype"); +@y +last_node_type_code: print_esc("lastnodetype"); +last_node_subtype_code: print_esc("lastnodesubtype"); +last_node_char_code: print_esc("lastnodechar"); +last_node_font_code: print_esc("lastnodefont"); +@z + +@x +primitive("savinghyphcodes",assign_int,int_base+saving_hyph_codes_code);@/ +@!@:saving_hyph_codes_}{\.{\\savinghyphcodes} primitive@> +@y +primitive("savinghyphcodes",assign_int,int_base+saving_hyph_codes_code);@/ +@!@:saving_hyph_codes_}{\.{\\savinghyphcodes} primitive@> +primitive("readpapersizespecial",assign_int,int_base+read_papersize_special_code);@/ +@!@:read_papersize_special_}{\.{\\readpapersizespecial} primitive@> +@z + +@x +saving_hyph_codes_code:print_esc("savinghyphcodes"); +@y +saving_hyph_codes_code:print_esc("savinghyphcodes"); +read_papersize_special_code:print_esc("readpapersizespecial"); +@z + +@x e-pTeX: font_char_{wd,ht,dp,ic}_code l.27306 +font_char_ic_code: begin scan_font_ident; q:=cur_val; scan_char_num; + if (font_bc[q]<=cur_val)and(font_ec[q]>=cur_val) then + begin i:=char_info(q)(qi(cur_val)); + case m of + font_char_wd_code: cur_val:=char_width(q)(i); + font_char_ht_code: cur_val:=char_height(q)(height_depth(i)); + font_char_dp_code: cur_val:=char_depth(q)(height_depth(i)); + font_char_ic_code: cur_val:=char_italic(q)(i); + end; {there are no other cases} + end + else cur_val:=0; + end; +@y +font_char_ic_code: begin scan_font_ident; q:=cur_val; + if font_dir[q]<>dir_default then {Japanese font} + begin scan_int; + if cur_val>=0 then + begin if is_char_kanji(cur_val) then {Japanese Character} + cur_val:=get_jfm_pos(KANJI(cur_val),q) + else cur_val:=-1 + end + else begin + cur_val:=-(cur_val+1); + if (font_bc[q]>cur_val)or(font_ec[q]<cur_val) then cur_val:=-1 + end; + if cur_val<>-1 then + begin + i:=orig_char_info(q)(qi(cur_val)); + case m of + font_char_wd_code: cur_val:=char_width(q)(i); + font_char_ht_code: cur_val:=char_height(q)(height_depth(i)); + font_char_dp_code: cur_val:=char_depth(q)(height_depth(i)); + font_char_ic_code: cur_val:=char_italic(q)(i); + end; {there are no other cases} + end + else cur_val:=0; + end + else begin scan_ascii_num; + if (font_bc[q]<=cur_val)and(font_ec[q]>=cur_val) then + begin i:=orig_char_info(q)(qi(cur_val)); + case m of + font_char_wd_code: cur_val:=char_width(q)(i); + font_char_ht_code: cur_val:=char_height(q)(height_depth(i)); + font_char_dp_code: cur_val:=char_depth(q)(height_depth(i)); + font_char_ic_code: cur_val:=char_italic(q)(i); + end; {there are no other cases} + end + else cur_val:=0; + end + end; +@z + +@x e-pTeX: displacement value when typesetting right-to-left l.27798 +@!LR_ptr:pointer; {stack of LR codes for |hpack|, |ship_out|, and |init_math|} +@y +@!revdisp:scaled; {temporary value of displacement} +@!LR_ptr:pointer; {stack of LR codes for |hpack|, |ship_out|, and |init_math|} +@z + +@x e-pTeX: reverse nodes of an hlist l.28010 +var l:pointer; {the new list} +@y +var l,la:pointer; {the new list} +disp,disp2: scaled; { displacement } disped: boolean; +@z +@x e-pTeX: reverse nodes of an hlist l.28010 +begin g_order:=glue_order(this_box); g_sign:=glue_sign(this_box); +@y +begin g_order:=glue_order(this_box); g_sign:=glue_sign(this_box); +disp:=revdisp; disped:=false; +@z +@x e-pTeX: reverse nodes of an hlist l.28010 +done:reverse:=l; +@y +done: {if the beginning node of the new list isn't |disp_node|, + we insert |disp_node| to fix.} +if (l<>null)and(type(l)<>disp_node) then begin + p:=get_node(small_node_size); type(p):=disp_node; + disp_dimen(p):=disp; link(p):=l; reverse:=p; + end +else reverse:=l; +@z +@x e-pTeX: reverse nodes of an hlist l.28010 + q:=link(p); link(p):=l; l:=p; p:=q; +@y + if font_dir[f]<>dir_default then begin + q:=link(p); la:=l; l:=p; p:=link(q); link(q):=la; + end + else begin q:=link(p); link(p):=l; l:=p; p:=q; end; +@z +@x e-pTeX: reverse nodes of an hlist l.28010 +othercases goto next_p +@y +disp_node: begin + disp2:=disp_dimen(p); disp_dimen(p):=disp; disp:=disp2; + if not disped then disped:=true; end; +othercases goto next_p +@z + +@x e-pTeX: just_copy + hlist_node,vlist_node: begin r:=get_node(box_node_size); +@y + dir_node, + hlist_node,vlist_node: begin r:=get_node(box_node_size); +@z +@x e-pTeX: just_copy + mem[r+6]:=mem[p+6]; mem[r+5]:=mem[p+5]; {copy the last two words} +@y + mem[r+7]:=mem[p+7]; + mem[r+6]:=mem[p+6]; mem[r+5]:=mem[p+5]; {copy the last three words} + add_glue_ref(space_ptr(r)); add_glue_ref(xspace_ptr(r)); +@z + +@x e-pTeX: pseudo file + buffer[last]:=w.b0; buffer[last+1]:=w.b1; + buffer[last+2]:=w.b2; buffer[last+3]:=w.b3; +@y + buffer[last]:=w.b0 mod @"100; buffer[last+1]:=w.b1 mod @"100; + buffer[last+2]:=w.b2 mod @"100; buffer[last+3]:=w.b3 mod @"100;@/ + buffer2[last]:=0; buffer2[last+1]:=0; + buffer2[last+2]:=0; buffer2[last+3]:=0; +@z + +@x e-pTeX: \readline +@ @<Handle \.{\\readline} and |goto done|@>= +if j=1 then + begin while loc<=limit do {current line not yet finished} + begin cur_chr:=buffer[loc]; incr(loc); + if cur_chr=" " then cur_tok:=space_token + @+else cur_tok:=cur_chr+other_token; +@y +@ @<Handle \.{\\readline} and |goto done|@>= +if j=1 then + begin while loc<=limit do {current line not yet finished} + begin cur_chr:=buffer[loc]; incr(loc); + if multistrlen(ustringcast(buffer), limit+1, loc-1)=2 then + begin cur_tok:=fromBUFF(ustringcast(buffer), limit+1, loc-1); incr(loc); + end + else if cur_chr=" " then cur_tok:=space_token + @+else cur_tok:=cur_chr+other_token; +@z + +@x e-pTeX: ifcsname l.28620 + buffer[m]:=info(p) mod @'400; incr(m); p:=link(p); +@y + if check_kanji(info(p)) then {|wchar_token|} + begin buffer[m]:=Hi(info(p)); buffer2[m]:=1; incr(m); buffer2[m]:=1; + end + else buffer2[m]:=0; + buffer[m]:=Lo(info(p)); incr(m); p:=link(p); +@z + +@x e-pTeX: if_font_char_code l.28633 +if_font_char_code:begin scan_font_ident; n:=cur_val; scan_char_num; + if (font_bc[n]<=cur_val)and(font_ec[n]>=cur_val) then + b:=char_exists(char_info(n)(qi(cur_val))) + else b:=false; + end; +@y +if_font_char_code:begin scan_font_ident; n:=cur_val; + if font_dir[n]<>dir_default then {Japanese font} + begin scan_int; + if cur_val>=0 then b:=is_char_kanji(cur_val) + { In u\pTeX, $\hbox{|is_char_kanji|} = \lambda x\mathpunct{.} x\ge 0$ } + else begin + cur_val:=-(cur_val+1); + b:=(font_bc[n]<=cur_val)and(font_ec[n]>=cur_val) + end + end + else begin scan_ascii_num; + if (font_bc[n]<=cur_val)and(font_ec[n]>=cur_val) then @/ + b:=char_exists(orig_char_info(n)(qi(cur_val))) + else b:=false; + end; + end; +@z + +@x e-pTeX: pTeX has \showmode, follow showstream.ch r61589 +@<Show the current japanese processing mode@>= +begin print_nl("> "); +@y +@<Show the current japanese processing mode@>= +begin + @<Adjust |selector| based on |show_stream|@> + print_nl("> "); +@z + +@x +procedure print_direction(@!d:integer); {print the direction represented by d} +@y +procedure print_direction_alt(@!d:integer); +var x: boolean; +begin x:=false; +case abs(d) of +dir_yoko: begin print(", yoko"); x:=true; end; +dir_tate: begin print(", tate"); x:=true; end; +dir_dtou: begin print(", dtou"); x:=true; end; +end; +if x then begin if d<0 then print("(math)"); +print(" direction"); end; +end; +@# +procedure print_direction(@!d:integer); {print the direction represented by d} +@z + +@x e-pTeX: fetch \(no)auto(x)spacing status +@* \[54] System-dependent changes. +@y +@ The \.{\\currentspacingmode} and \.{\\currentxspacingmode} commands +return the current \pTeX's status of \.{\\(no)autospacing} and +\.{\\(no)autoxspacing} respectively. + +@d current_spacing_mode_code=eTeX_int+8 {code for \.{\\currentspacingmode}} +@d current_xspacing_mode_code=eTeX_int+9 {code for \.{\\currentxspacingmode}} + +@<Generate all \eTeX...@>= +primitive("currentspacingmode",last_item,current_spacing_mode_code); +@!@:current_spacing_mode_}{\.{\\currentspacingmode} primitive@> +primitive("currentxspacingmode",last_item,current_xspacing_mode_code); +@!@:current_xspacing_mode_}{\.{\\currentxspacingmode} primitive@> + +@ @<Cases of |last_item| for |print_cmd_chr|@>= +current_spacing_mode_code: print_esc("currentspacingmode"); +current_xspacing_mode_code: print_esc("currentxspacingmode"); + +@ @<Cases for fetching an integer value@>= +current_spacing_mode_code: cur_val:=auto_spacing; +current_xspacing_mode_code: cur_val:=auto_xspacing; + +@* \[54] System-dependent changes. +@z |