diff options
author | Karl Berry <karl@freefriends.org> | 2023-02-13 18:17:01 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2023-02-13 18:17:01 +0000 |
commit | b4917a53cb17c6b5ceb787aa6a809807b48cfedd (patch) | |
tree | 506babfed591f84650677081260d3d506b9a8d91 /Build | |
parent | 9126877409972187cc26dec15b2a9642ec4834dd (diff) |
eptex: shipout keyword for \special, a la pdftex
git-svn-id: svn://tug.org/texlive/trunk@65815 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build')
-rw-r--r-- | Build/source/texk/web2c/eptexdir/ChangeLog | 9 | ||||
-rw-r--r-- | Build/source/texk/web2c/eptexdir/pdfutils.ch | 72 | ||||
-rw-r--r-- | Build/source/texk/web2c/xetexdir/ChangeLog | 9 |
3 files changed, 84 insertions, 6 deletions
diff --git a/Build/source/texk/web2c/eptexdir/ChangeLog b/Build/source/texk/web2c/eptexdir/ChangeLog index c299d06aab9..c2df77d9d02 100644 --- a/Build/source/texk/web2c/eptexdir/ChangeLog +++ b/Build/source/texk/web2c/eptexdir/ChangeLog @@ -1,3 +1,12 @@ +2023-02-13 Phelype Oleinik <phelype.oleinik@latex-project.org> + + * xetex.web: implement shipout keyword for delayed expansion + with \special, like non-\immediate \write. + (latespecial_node): new @d (4), and step @d for following parameters. + (Implement \.{\\special}): look for `shipout' keyword. + (Display the whatsit) <latespecial_node>: new case. + (special_out): check for latespecial_node. + 2023-01-28 TANAKA Takuji <ttk@t-lab.opal.ne.jp> * am/eptex.am: diff --git a/Build/source/texk/web2c/eptexdir/pdfutils.ch b/Build/source/texk/web2c/eptexdir/pdfutils.ch index efb4dcb3ffb..69701de923e 100644 --- a/Build/source/texk/web2c/eptexdir/pdfutils.ch +++ b/Build/source/texk/web2c/eptexdir/pdfutils.ch @@ -1570,9 +1570,20 @@ init_randoms(random_seed);@/ @z @x -@d epTeX_input_encoding_code=6 {command modifier for \.{\\epTeXinputencoding}} +@d language_node=4 {|subtype| in whatsits that change the current language} @y +@d latespecial_node=4 {|subtype| in whatsits that represent \.{\\special} things} +@d language_node=5 {|subtype| in whatsits that change the current language} +@z + +@x +@d immediate_code=4 {command modifier for \.{\\immediate}} +@d set_language_code=5 {command modifier for \.{\\setlanguage}} @d epTeX_input_encoding_code=6 {command modifier for \.{\\epTeXinputencoding}} +@y +@d immediate_code=5 {command modifier for \.{\\immediate}} +@d set_language_code=6 {command modifier for \.{\\setlanguage}} +@d epTeX_input_encoding_code=7 {command modifier for \.{\\epTeXinputencoding}} @d pdf_save_pos_node=epTeX_input_encoding_code+1 @d set_random_seed_code=pdf_save_pos_node+1 @d reset_timer_code=set_random_seed_code+1 @@ -1596,6 +1607,38 @@ set_random_seed_code: @<Implement \.{\\pdfsetrandomseed}@>; reset_timer_code: @<Implement \.{\\pdfresettimer}@>; @z +@x +@<Implement \.{\\special}@>= +begin new_whatsit(special_node,write_node_size); write_stream(tail):=null; +p:=scan_toks(false,true); write_tokens(tail):=def_ref; +inhibit_glue_flag:=false; +end +@y +@<Implement \.{\\special}@>= +begin if scan_keyword("shipout") then +begin new_whatsit(latespecial_node,write_node_size); write_stream(tail):=null; +p:=scan_toks(false,false); write_tokens(tail):=def_ref; +end else +begin new_whatsit(special_node,write_node_size); write_stream(tail):=null; +p:=scan_toks(false,true); write_tokens(tail):=def_ref; +end; +inhibit_glue_flag:=false; +end +@z + +@x +special_node:begin print_esc("special"); + print_mark(write_tokens(p)); + end; +@y +special_node:begin print_esc("special"); + print_mark(write_tokens(p)); + end; +latespecial_node:begin print_esc("special"); print(" shipout"); + print_mark(write_tokens(p)); + end; +@z + @x \pdfsavepos print_int(what_lhm(p)); print_char(","); print_int(what_rhm(p)); print_char(")"); @@ -1609,6 +1652,12 @@ set_random_seed_code: print_esc("pdfsetrandomseed"); reset_timer_code: print_esc("pdfresettimer"); @z +@x +write_node,special_node: begin r:=get_node(write_node_size); +@y +write_node,special_node,latespecial_node: begin r:=get_node(write_node_size); +@z + @x \pdfsavepos close_node,language_node: begin r:=get_node(small_node_size); words:=small_node_size; @@ -1621,6 +1670,12 @@ pdf_save_pos_node: r := get_node(small_node_size); @z +@x +write_node,special_node: begin delete_token_ref(write_tokens(p)); +@y +write_node,special_node,latespecial_node: begin delete_token_ref(write_tokens(p)); +@z + @x \pdfsavepos close_node,language_node: free_node(p,small_node_size); @y @@ -1632,14 +1687,27 @@ pdf_save_pos_node: free_node(p, small_node_size); procedure special_out(@!p:pointer); var old_setting:0..max_selector; {holds print |selector|} @!k:pool_pointer; {index into |str_pool|} +begin synch_h; synch_v;@/ +old_setting:=selector; selector:=new_string; @y procedure special_out(@!p:pointer); label done; var old_setting:0..max_selector; {holds print |selector|} @!k:pool_pointer; {index into |str_pool|} +@!q,@!r:pointer; {temporary variables for list manipulation} +@!old_mode:integer; {saved |mode|} @!s,@!t,@!cw, @!num, @!denom: scaled; @!bl: boolean; @!i: small_number; +begin synch_h; synch_v;@/ +old_setting:=selector; selector:=new_string; +selector:=old_setting; +if subtype(p)=latespecial_node then + begin @<Expand macros in the token list + and make |link(def_ref)| point to the result@>; + write_tokens(p):=def_ref; + end; +selector:=new_string; @z @x @@ -1651,8 +1719,10 @@ done: pool_ptr:=str_start[str_ptr]; {erase the string} @z @x +special_node:special_out(p); language_node:do_nothing; @y +special_node,latespecial_node:special_out(p); language_node:do_nothing; pdf_save_pos_node: @<Save current position in DVI mode@>; diff --git a/Build/source/texk/web2c/xetexdir/ChangeLog b/Build/source/texk/web2c/xetexdir/ChangeLog index 5a2fcb3c105..d3a4d6b71be 100644 --- a/Build/source/texk/web2c/xetexdir/ChangeLog +++ b/Build/source/texk/web2c/xetexdir/ChangeLog @@ -1,14 +1,13 @@ -2023-01-20 Phelype Oleinik <phelype.oleinik@latex-project.org> +2023-02-13 Phelype Oleinik <phelype.oleinik@latex-project.org> * xetex.web: implement shipout keyword for delayed expansion - with \pdfliteral and \special, like non-\immediate \write. + with \special, like non-\immediate \write. (latespecial_node): new @d (4), and step @d for following parameters. (Implement \.{\\special}): look for `shipout' keyword. - (Display the whatsit) <latespecial_node, <pdf_lateliteral_node>: + (Display the whatsit) <latespecial_node>: new case. (special_out): check for latespecial_node. - new cases. -2021-02-17 Karl Berry <karl@tug.org> +2023-02-09 Karl Berry <karl@tug.org> * NEWS, * xetex_version.h, |