[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