PostScript

オプションに -dAutoRotatePages=/None を指定しないと意図しないところで180度回転する。(ps2pdf)

GhostScriptには色んな機能がありパラメータが複雑です。ps2pdfはPostScript から PDFを生成する機能に特化したツールで内部でGhostScriptを呼んでいます。 GhostScriptのコマンドで書くとこんな感じ。 gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile…

スタックに渡された値を辞書に登録する様子

スタックに積んで渡された値を辞書に登録するとローカル変数のように使えて便利です。 登録は以下のような手続きで行います。 /valueName exch def スタックの値を登録するのに exch でスタックの順番を入れ替えて def しています。 その様子を見てみます。 …

文字の輪郭を描く

「PostScript実習マニュアル 3.8.12 文字列の輪郭」に文字列の輪郭の輪郭を描く例があります。 (文字列) false charpath false は、塗りつぶすのに適したパスを作成するか、線を描画するのに適したパスを作成するかを示すもので、この場合は線を描画するのに…

枠内におさまるように文字列の横幅を自動調整2(PostScript)。

PostScriptで表を作るとき、長い文字列でも枠からはみ出さないように文字列の横幅を自動調整して印字する手続きを作りましたが、今度は同じ機能ですが、横幅をスタックにつんで渡すバージョンです。辞書によるローカル変数を使っていますのでコードがすっき…

文字列を指定された幅の文字列に分割して配列に入れる。

表の枠内に印字するときに1行に収まらないときは改行するというのは作りました。 今度は1行に収まるときは縦位置を中央に、2行、3行と増えても縦位置を中央に印字したいのです。 そのために文字の幅に応じて文字列を分割し、配列に入れて表示する手続きに渡…

指定された幅の文字列と残り文字列に分割する。

%!PS-Adobe-3.0 2.834645669 2.834645669 scale newpath /vPosition 297 20 sub def % A4 297mm /newLineHight 12 def /Left 20 def /Space 3 def /hPosition Left Space add def /newline { /vPosition vPosition newLineHight sub def hPosition Space add…

配列にオブジェクトを追加する。

配列にオブジェクトを一個追加する手続きです。 % 配列にオブジェクトを追加する。 % stack : obj array /s3dict 1 dict def /addToArray { s3dict begin /obj exch def % 追加するobj /baseArray exch def % 受け取った配列 /baseLen baseArray length def …

二つの文字列を連結する手続き(PostScript)

スタックに詰まれた二つの文字列を連結する手続きです。 % stack : string string /s2dict 1 dict def /joinString { s2dict begin /str exch def /strBase exch def /baseLen strBase length def /strLen str length def /newString baseLen strLen add str…

PostScript でフラクタル

PostScript TUTORIAL and COOKBOOKの72ページ。72 Chapter 7: LOOPS AND CONDITIONALS に再帰でフラクタルを描くサンプルがあります。パラメータを変えると図形も変ります。 /depth 0 def /maxdepth 15 def /down {/depth depth 1 add def} def /up {/depth …

PostScriptでフィボナッチ数列を計算

PostScriptで再帰が出来るのだからとフィボナッチ数列を計算してみました。 %! /fib { dup 0 eq { pop 1} {dup 1 eq { pop 1 } { dup 1 sub fib exch 2 sub fib add } ifelse }ifelse } def 0 1 20 {fib ==} for else へ値を渡すのには dup によりスタックの…

PostScriptの配列が構築される様子

PostScriptの配列が構築される様子が面白い。 配列の先頭の'['はスタックにマークを作るためのオペレータです。 '['が実行されるとスタックにマークオブジェクトが作られます。 PostScriptの配列が構築される様子を見てみます。 GS>[ % マークオブジェクトが…

PostScript で再帰により階乗計算をする様子

PostScript TUTORIAL and COOKBOOKの70ページ。70 Chapter 7: LOOPS AND CONDITIONALS に再帰で階乗計算の結果を印刷するサンプルがあります。その階乗計算の部分。 /factorial %stack: n --- n! (after) { dup 1 gt {dup 1 sub factorial mul} if } def pri…

loop で無限ループを作りexitで脱出する(PostScript)

repeat、forが繰り返す条件を指定して手続きを呼ぶのに対し、loopは無限ループを作り実行中に条件を判定して脱出します。 GPL Ghostscript 9.06 (2012-08-08) Copyright (C) 2012 Artifex Software, Inc. All rights reserved. This software comes with NO …

100 /xpos exch def という動作(スタックマシンの動作)

スタックに 100 が積まれているときに /xpos exch def という動作はどのようになるのか追ってみます。 %!PS-Adobe-3.0 GPL Ghostscript 9.06 (2012-08-08) Copyright (C) 2012 Artifex Software, Inc. All rights reserved. This software comes with NO WAR…

PostScript でShift-JISの1バイト文字、2バイト文字判定

先の「文字列が枠内におさまるように自動改行しながら印刷する(PostScript)」はEUC-JPバージョンでした。これを Shift-JIS で行うには1文字と残りの文字列に分けるための判定方法を変更する必要があります。 Shift-JISの半角文字は0x80〜0x9F、0xE0〜0xFF を…

PostScript で 機種依存文字でも文字化けのないPDFを作る(Windows限定)。

今までは以下の理由でEUC-JPのフォントを使ってきました。 Shift-JIS は0x5cを含む文字が文字化けを起こす。 UTF-8 はデフォルトでインストールされていないこともある。 日本語文字列出力を参考に、EUC-JPでテキストを作り、/Ryumin-Light-EUC-H のように E…

ps2pdf で Windows TrueTypeフォントを使う。(PostScript )

Cygwin + Ghostscrpit + Windows TrueTypeフォントに Ghostscrpit で Windows TrueTypeフォントを使う方法が掲載されていました。 GhostscrpitはC:\Program Files\gs\gs9.06\lib\cidfmap に記載されているフォント使いますので、ここにフォントを追加します…

文字列が枠内におさまるように自動改行しながら印刷する(PostScript)。

PostScriptで表を作るとき、長い文字列でも枠からはみ出さないように自動改行しながら印刷します。 %!PS-Adobe-3.0 % EUC-JP で記述すること。 2.834645669 2.834645669 scale % これでポイントだった単位がミリになります。 newpath /Ryumin-Light-EUC-H fi…

1バイト、2バイト、3バイト文字の入り乱れたEUC-JP文字列を1文字ずつ出力する(PostScript)。

文字列を出力して行末に達したときは、改行して次の行の先頭から表示しなければなりません。 行末に達したかどうかは currentpoint で現在の位置を求め、 stringwidth で印刷しようとする文字列の幅を求めれば良いのですが、長い文章全体の幅を求めても意味…

文字列が枠内におさまるように文字列の横幅を自動調整する(PostScript)。

PostScriptで表を作るとき、長い文字列でも枠からはみ出さないように文字列の横幅を自動調整します。 %!PS-Adobe-3.0 2.834645669 2.834645669 scale newpath /vPosition 297 20 sub def % A4 297mm /Space 3 def /CellW 100 def /ADJW CellW Space 2 mul su…

PostScript の文字列長、文字幅

PostScript で日本語の文字列を扱う場合、半角文字は1文字を長さ1と数えますが、全角文字は1文字を長さ2として計算します。 %! /Ryumin-Light-EUC-H findfont 20 scalefont setfont % 文字列の長さ (1) length == % -> 1 (日) length == % -> 2 (abcあいう) …

PostScript で printf デバッグ

PostScript TUTORIAL and COOKBOOKの51ページに星の形を描くプログラムがあります。文字列を表示する print とスタックを表示する pstack を使って動作する様子を追いかけてみます。 Chapter 6: MORE GRAPHICS (Saving the Graphics State) /starside { 72 0…

右寄せ印刷(PostScript TUTORIAL and COOKBOOK 42 ページ)

PostScript TUTORIAL and COOKBOOKの42ページ。右寄せ印刷の動作が分かりにくいので追ってみます。 /rightshow % stk: string { dup stringwidth pop %get length of string 120 exch sub %calc. white space 0 rmoveto %Move over that much show } def %sh…

PostScript で日本語を表示してみました。

EUC で記述し、EUC-H、EUC-V のフォントを使用すれば日本語をそのまま表示することが出来ます。 %!PS-Adobe-3.0 EPSF-3.0 % bluebook P40 Chapter 5: PRINTING TEXT % EUC で保存。 % mm の定義 % 10 mm と記述すれば 10 * 2.834645669 の値となり、10 mmを…

PosScript の型

PosScript の型を調べる命令 type を見つけたので表示させてみます。 GPL Ghostscript 9.06 (2012-08-08) Copyright (C) 2012 Artifex Software, Inc. All rights reserved. This software comes with NO WARRANTY: see the file PUBLIC for details. % 1 が…

PostScriptのスタック操作と手続きの合成

私は日本語訳の本を見ているのですが、PostScript TUTORIAL and COOKBOOKの39ページに内部でexchを使ってスタックの状態を入れ替えている手続きの定義がわかりづらかったので追ってみました。 x 座標、y 座標をスタックに積んで showGorilla を呼ぶと指定さ…