Search code examples
dictionarypostscript

What does LOCAL do in Postscript?


In Thinking in Postscript (pdf), Chapter 5, exercise 3 (pp. 64-65) asks the reader to refactor this code to not store any dictionary entries:

36 750 moveto /Times-Roman 24 selectfont
% works like “show”, leaving current point at proper location
/ushow
% linethickness lineposition (words) ushow -
{ %def
  LOCAL begin
    /text exch def
    /linepos exch def
    /linethick exch def
    gsave
      0 linepos rmoveto
      text stringwidth rlineto
      linethick setlinewidth stroke
    grestore
    text show
  end
} dup 0 4 dict put def
0.5 -4 (test underlined text) ushow

My question is about LOCAL. Ghostscript runs this code without error, and yet LOCAL is not:

  • Defined in the exercise
  • Documented in the Postcript Language Reference, third edition
  • Documented in PostScript Language Tutorial and Cookbook

What, in PostScript, is LOCAL?


Solution

  • It is nothing defined. The code is a bit sneaky as the code dup 0 4 dict put def will take the executable and replace the LOCAL with the result of 4 dict. The executable block (stuff between {}) is copied mainly because put returns nothing. Since its a reference to the same block your left over with

    /ushow {-dict- begin ...rest of the executable...} def
    

    This is all valid because LOCAL is never used anywhere (it is destroyed before its used). It would not matter what you use in place of LOCAL.