summaryrefslogtreecommitdiff
path: root/Build/source
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2023-02-13 18:17:01 +0000
committerKarl Berry <karl@freefriends.org>2023-02-13 18:17:01 +0000
commitb4917a53cb17c6b5ceb787aa6a809807b48cfedd (patch)
tree506babfed591f84650677081260d3d506b9a8d91 /Build/source
parent9126877409972187cc26dec15b2a9642ec4834dd (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/source')
-rw-r--r--Build/source/texk/web2c/eptexdir/ChangeLog9
-rw-r--r--Build/source/texk/web2c/eptexdir/pdfutils.ch72
-rw-r--r--Build/source/texk/web2c/xetexdir/ChangeLog9
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,