[NTG-pdftex] [ pdftex-Bugs-437 ] Two \immediate cancel themselves

noreply at sarovar.org noreply at sarovar.org
Mon Oct 17 19:27:46 CEST 2005


Bugs item #437, was opened at 2005-10-15 23:57
You can respond by visiting: 
http://sarovar.org/tracker/?func=detail&atid=493&aid=437&group_id=106

Category: None
Group: v1.30.0
>Status: Closed
Resolution: Fixed
Priority: 5
Submitted By: Heiko Oberdiek (oberdiek)
Assigned to: Hartmut Henkel (hhenkel)
Summary: Two \immediate cancel themselves

Initial Comment:
Hello,

Vladimir Volovich found the following bug, I quote
his bug report from the ntg-pdftex list here:

> consider the following Plain TeX file:
> 
> \immediate\immediate\openout1=test.out
> \immediate\write1 {line 1}
> \immediate\write1 {line 2}
> \immediate\closeout1
> 
> \bye
> 
> (it was reduced from a real-life example).
> 
> if i process it with vanilla TeX engine (i.e. not
> with pdfetex, but with TeX), you get what i expect:
> two lines are written to the file test.out, and
> there are no pages of output (no DVI file generated).
> 
> however, if i process this file with pdfetex, i do
> not get what i would expect: instead, the lines are
> written to terminal, test.out is created and is
> empty, and there is also a 1-page PDF file generated.
> 
> the bug goes away if i remove the second \immediate,
> but as i said this is a simplified example converted
> from a real-life usage.

It is indeed a bug:

this is the original code of "Implement \immediate":

| begin get_x_token;
| if (cur_cmd=extension)and(cur_chr<=close_node) then
|   begin p:=tail; do_extension;{append a whatsit node}
|   out_what(tail); {do the action immediately}
|   flush_node_list(tail); tail:=p; link(p):=null;
|   end
| else back_input;
| end

A token is read. If the token hears to \immediate,
it is executed with the immediate setting.
Otherwise the token is just put back.
  Now pdfTeX has more commands that obey \immediate:

| begin get_x_token;
| if cur_cmd=extension then begin
|    if cur_chr<=close_node then
|       begin <<original action>> end
|     else case cur_chr of
|         pdf_obj_code: begin <<...>> end;
|         pdf_xform_code: begin <<...>> end;
|         pdf_ximage_code: begin <<...>> end;
|         end;
|     endcases;
| end 
| else
|     back_input;
| end

Cases:
a) cur_cmd != extension
   --> nothing is changed (back_input)
b) cur_cmd == extension && cur_chr <= close_node
   --> nothing is changed (original action)
c) cur_cmd == extension
   && cur_chr in (pdf_{obj,xform,ximage}_code)
   --> new behaviour for pdfTeX
d) cur_cmd == extension && cur_chr > close_node
   && cur_chr not in (pdf_{obj,xform,ximage}_code)
   --> no action

Case d) is the bug. \immediate is an extension primitive
with cur_chr > close_node. Thus the second \immediate
is read, but then dropped. The effect is:
  \immediate\immediate\openout is same as \openout
Instead of "no action" there should be "back_input".
Before "endcases" the following line needs to be added:
    ...
    else case cur_chr of
      ...
      othercases back_input
    endcases;

I have attachted a diff file for pdftexdir/pdftex.ch.

Yours sincerely
  Heiko <oberdiek at uni-freiburg.de>

----------------------------------------------------------------------

Comment By: Martin Schröder (oneiros)
Date: 2005-10-17 19:27

Message:
Logged In: YES 
user_id=421

This has been fixed in 1.30.4

----------------------------------------------------------------------

You can respond by visiting: 
http://sarovar.org/tracker/?func=detail&atid=493&aid=437&group_id=106


More information about the ntg-pdftex mailing list