DTP駆け込み寺

[ 返信 ]

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による置換などはできないのでしょうか?

KEI 2004/01/29 22:17:33
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

001

> { 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を元に戻す

てな感じでいけそうな気がしますが。

のもと 2004/01/30 12:37:14
Mozilla/4.0 (compatible; MSIE 5.17; Mac_PowerPC)

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

> 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

のもと 2004/01/30 13:52:12
Mozilla/4.0 (compatible; MSIE 5.17; Mac_PowerPC)

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

003

ほんとだあ〜。感激。

無知の外野席 2004/01/30 18:36:28
Mozilla/4.7 [ja] (Macintosh; I; PPC)

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

004

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

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

KEI
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

[60] 旧掲示板 (2004/01/29 Thu 22:17)

  1. [60] def 定義するとエラーが発生します。 旧掲示板 2004/01/29 22:17