def 定義するとエラーが発生します。

初めまして最近仕事でDTPをやり始めた若輩プログラマーです。

毎週処理されるPSファイル作成を自動化するため、Quarkなどを通さずプログラムで直に作成できるようにしようとPSコマンドを色々試していたところ、イメージの処理で謎のエラーが起きてしまいました。

newpath

%省略

gsave
20 20 translate
32 32 scale
16 8 4
[ 16 0 0 -8 0 8]
{ currentfile picstr readhexstring pop }
image
0123456789ABCDEF
123456789ABCDEF0
23456789ABCDEF01
3456789ABCDEF012
456789ABCDEF0123
56789ABCDEF01234
6789ABCDEF012345
789ABCDEF0123456

grestore

showpage

上記の用にnewpath後にイメージ処理を直に書き込むと問題なく表示できるのですが、

/TestData {

gsave
20 20 translate
32 32 scale
16 8 4
[ 16 0 0 -8 0 8]
{ currentfile picstr readhexstring pop }
image
0123456789ABCDEF
123456789ABCDEF0
23456789ABCDEF01
3456789ABCDEF012
456789ABCDEF0123
56789ABCDEF01234
6789ABCDEF012345
789ABCDEF0123456

grestore

} def

newpath

%省略

TestData

showpage

のようにdefで定義してから表示しようとすると、

%%[ Error: undefined; OffendingCommand: 0123456789ABCDEF ]%%

Stack:
3

%%[ Flushing: rest of job (to end-of-file) will be ignored ]%%
%%[ Warning: PostScript error. No PDF file produced. ] %%

とエラーになってしまいます。
もちろんラインや文字などはdefで定義しても問題なく表示されます。

イメージデータではdefによる置換などはできないのでしょうか?
» > { currentfile picstr readhexstring pop }

これは現在のファイルから16進文字列を読み込んで画像のデータソースにするということを表しています。
辞書に登録した内容はファイル上に展開されTestDataを置換するわけではなく、あくまで一連の手続きとして実行されるだけです。
現在のファイルマークはTestDataのあとにあるわけですからreadstringはそのあとをよみにいきます。
showpageから始まる文字列が読まれるわけですね。

その後0123456789ABCDEFが名前オブジェクトとして実行されるところでエラーになっているのだと思います。

で、解決策ですが、今回のように短いデータなら

20 20 translate
32 32 scale
16 8 4
[ 16 0 0 -8 0 8]
{<0123456789ABCDEF
123456789ABCDEF0
23456789ABCDEF01
3456789ABCDEF012
456789ABCDEF0123
56789ABCDEF01234
6789ABCDEF012345
789ABCDEF0123456>}
image

とかでうまくいきませんか?
Postscriptは普段使い慣れてないんでこっちではテストできないですけど。

データソースが長くなるなら

1. あらかじめデータソースのfilepositionを辞書登録
2. TestData冒頭部分で現在のfilepositionを一時辞書に登録
3. filepositionを1で登録した値に変更
4. image実行
5. filepositionを元に戻す

てな感じでいけそうな気がしますが。
» > Postscriptは普段使い慣れてないんでこっちではテストできないですけど。

だいじょぶそうですね。以下のデータをDistillerにかけたらちゃんと画像が4個描画できてました。

/TestData {
gsave

translate
32 32 scale
16 8 4
[ 16 0 0 -8 0 8]
{<0123456789ABCDEF
123456789ABCDEF0
23456789ABCDEF01
3456789ABCDEF012
456789ABCDEF0123
56789ABCDEF01234
6789ABCDEF012345
789ABCDEF0123456>}
image

grestore
} def

20 20 TestData
20 100 TestData
100 100 TestData
100 20 TestData
showpage
» ほんとだあ~。感激。
» なるほど、def定義したものは展開時に置き換えられると思いこんでました(^^;
後はイメージデータをPSファイル用のフォーマットで出力するプログラムを作成すれば下データは問題なく出力できますね。
ありがとうございます。

問題はQuarkillustratorのデータを何とかすることか。
……手作業かなあ?(T_T)