[XeTeX] Omega bidirectional primitives or more primitives for RTL typesetting
Vafa Khalighi
vafa at users.berlios.de
Wed Jul 15 16:53:29 CEST 2009
This is a some parts of the code for implementing \beginspecial and
\endspecial
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% [53.1344]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@x
@d immediate_code=4 {command modifier for \.{\\immediate}}
@d set_language_code=5 {command modifier for \.{\\setlanguage}}
@y
@d beginspecial_node=6 {|subtype| in whatsits that represent
\.{\\beginspecial}}
@d endspecial_node=7 {|subtype| in whatsits that represent \.{\\endspecial}}
@d LR_node=8 {|subtypes| in whatsits that represent \beginL, etc.}
@d immediate_code=9 {command modifier for \.{\\immediate}}
@d set_language_code=10 {command modifier for \.{\\setlanguage}}
@z
@x
@!@:open_out_}{\.{\\openout} primitive@>
@y
@!@:open_out_}{\.{\\openout} primitive@>
@z
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% [53.1348]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@x open_R_node, eqwrite_node
open_node:@<Implement \.{\\openout}@>;
write_node:@<Implement \.{\\write}@>;
@y
open_node,open_R_node:@<Implement \.{\\openout}@>;
eqwrite_node,write_node:@<Implement \.{\\write}@>;
@z
@x beginspecial_node, endspecial_node
special_node:@<Implement \.{\\special}@>;
@y
special_node,beginspecial_node,endspecial_node:@<Implement \.{\\special}@>;
@z
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% [53.1354]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@x special_switch
begin new_whatsit(special_node,write_node_size); write_stream(tail):=null;
p:=scan_toks(false,true); write_tokens(tail):=def_ref;
end
@y
begin i := cur_speech; j := cur_direction; k:=cur_chr;
if not eqspcial then begin cur_speech := Lftlang; cur_direction := L_to_R;
end;
new_whatsit(k,write_node_size);
if k = endspecial_node then
if is_open_SPC then begin
p := info (SPCsp); pop_SPC;
write_tokens(tail):=write_stream (p);
add_token_ref (write_tokens(tail));
end
else begin print_err("Extra \endspecial, ignored");
help1("\endspecial must be match with \beginspecial.");
error; write_tokens(tail):=null;
end
else begin p:=scan_toks(false,true); write_tokens(tail):=def_ref; end;
if k = beginspecial_node then begin
q:=scan_toks(false,true); write_stream(tail):=def_ref;
push_SPC(tail);
end
else write_stream(tail):=null;
cur_speech := i; cur_direction := j;
end
@z
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% [53.1356]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@x eqwrite_node
write_node:begin print_write_whatsit("write",p);
@y
eqwrite_node,write_node:begin
if subtype(p) = eqwrite_node then print_write_whatsit("eqwrite",p)
else print_write_whatsit("write",p);
@z
@x open_R_node, LR_node, beginspecial_node and endspecial_node
othercases print("whatsit?")
@y
@<Print LR |whatsit|@>@/
othercases print("whatsit?")
@z
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% [53.1357]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@x open_R_node
open_node: begin r:=get_node(open_node_size); words:=open_node_size;
@y
open_node,open_R_node:
begin r:=get_node(open_node_size); words:=open_node_size;
@z
@x eqwrite_node
write_node,special_node: begin r:=get_node(write_node_size);
@y
eqwrite_node,write_node,special_node,beginspecial_node,endspecial_node:
begin r:=get_node(write_node_size);
if subtype(p) = beginspecial_node then add_token_ref (write_stream(p));
@z
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% [53.1358]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@x open_R_node, eqwrite_node, beginspecial_node and endspecial_node
open_node: free_node(p,open_node_size);
write_node,special_node: begin delete_token_ref(write_tokens(p));
@y
open_node,open_R_node: free_node(p,open_node_size);
eqwrite_node,write_node,special_node,beginspecial_node,endspecial_node:
begin delete_token_ref(write_tokens(p));
if subtype(p) = beginspecial_node then
delete_token_ref(write_stream(p));
@z
@x LR_node
close_node,language_node: free_node(p,small_node_size);
@y
close_node,language_node,LR_node: free_node(p,small_node_size);
@z
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% [53.1373]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@x open_R_node, eqwrite_node
open_node,write_node,close_node:@<Do some work that has been queued up
for \.{\\write}@>;
special_node:special_out(p);
@y
open_node,open_R_node,write_node,eqwrite_node,close_node:
@<Do some work that has been queued up for \.{\\write}@>;
beginspecial_node,endspecial_node,special_node:special_out(p);
@z
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://tug.org/pipermail/xetex/attachments/20090716/fdca10b9/attachment-0001.html>
More information about the XeTeX
mailing list