postscritpㄏ基本入門
作者:csc  (2003/2/17)
(本 文參考:blue book(tutorial and cookbook)adobe出版的及A first guide to postscript)
Postscript 是一種頁面的描述語言(一種文件格式),類似現在最流行的PDF檔案,都是為了最佳化列印或顯示或可攜性(不同電腦間的交換),它最早出現在Apple Laser Writer 印表機上,簡單的說在任何電腦上產生的ps檔案,都可以直接丟到可以接受ps的印表機上列印,而不用管要輸出在那一種印表機上,其列印結果都不會差太多, (其實不同廠商的印表機,有不同的印表機列印語言,用來描述欲列印的資料,如何在印表機中列印,例如:HP的印表機一般是使用hp pcl(page control language),而epson 是使用ESC語言[有點類似dos下使用在倚天的印表控制語言], 通常一般的印表機語言,都有兩種模式,一為資料,另一為控制,而控制模式都會使用一跳脫符號,然後後面接著控制指令)。

Ps是一種類似fortan(它是一種用在工程計算的程式語言) 的一種語言,它是具備程式語言的功能,我們可以使用Ps寫程式,而它".Ps"檔本身就是一種程式,為了要熟悉它的語法,我們免費下載Gnu ghostscript並安裝它,它可直接模擬PS印表機,並下Ps的指令給它並和它互動。

我們略過安裝:在安裝完畢後它會在你的安裝目錄下產生gsx.xx的 目錄(x.xx是版本如7.05),在windwos版本有二種執行檔gswin32.exe 及gswin32c.exe(一個是在windows下執行,另一個是在consle,dos命令列下),端看你要在視窗或是命令列下執行
其外觀如下(視窗):



#GS>是提示符號,你可以在這媬擗J命令
#在提示符號輸入命令時會在右邊加入註解:
 <- 代表你的輸入
 -> 代表程式回應
 而註解的符號為%
 有些部份的程式回應會略過,在你熟悉之後,也就是比較後面的部 份,一律不標示

 程式的基本觀念
1.程式是以stack(堆疊)的模式下來操作(有點像CPU的運算方式有一堆暫存器來存值)
GS>5
GS<1>
GS<1>6
GS<2>
% <-
% ->
% <-
% ->

你可能發覺為什麼會有GS<1>,GS<2>呢?
它代表你的堆疊中的個數
GS>5 6
GS<2>
% <-
% ->

堆疊有兩個5及6

GS>5 6 add      % <-
這堿O使用到運算子add(加法),其原理如下:共四個步驟

5
6
5
-
-

11

->stack 2
->stack 1

先推入5,再推入6,而 add則取出5及6,加總為11後再推回11
同理加減乘除(add,sub,mul,div,idiv(除取整數),mod(相除取餘數))(注意:為小寫)
GS>5 6 add
GS<1>7 3 sub
GS<2>
% <-
% <-
% ->


如何取出或是丟棄呢?
pstack(秀出所有的堆疊的資料)或 stack
#(abc)為字串,字串在使用括號括起來
GS>5 6 7 (abc)
GS<4>
GS<4>pstack
abc
7
6
5
% <-
% ->
% <-
% ->
pop(取出堆疊最上層(不顯示)並丟棄)
GS>5 6 add
GS<1>pop
GS>
% <-
% <-
% ->
==(顯示堆疊最上層並丟棄,試過一個"="也 可以)
GS>5 6 add
GS<1>=
11
% <-
% <-
% ->
clear(清除堆疊的所有內容)
GS>5 6 add
GS<1>
GS<1>7 8 sub
GS<2>clear
GS>
% <-
% ->
% <-
% <-
% ->
交換堆疊(exch)
GS>5 6
GS<2>exch
% <-
% ->
原來是6,5(堆疊順序(top-> bottom)),執行exch
變為5,6
重複堆疊(dup)
GS>5 dup
GS<2>

GS>5 5
GS<2>
% <-
% ->

% <-
% ->

roll(位移)
GS> 1 2 3 4 5 6 3 1 roll     
記住:roll的前面兩個數字,前面3是指6 5 4 3 2 1 (依次數來第3個,就是4)
     至於roll前面的1是向右移1個,如果有-代表向左移
     例:1 2 3 4 5 6 3 1  roll   
      由6往前數3個為  4 5 6 ->向右移一位 6 4 5          
     結果:
      1 2 3 6 4 5
      
     例:1 2 3 4 5 6 3 -1 roll   
       同上 4 5 6 ->向左移一位5 6 4   
     結果:
        1 2 3 5 6 4

2.字串、變數、陣列和函式
(1)字串是用小括號括起來(abcd)
   GS>(abcd)         
   GS<1>=            
   abcd              
(2)變數
    /abc 15 def
   定義變數abc=15,要定義變數前面記的要加/反斜線,而後面要加def
    /aaa (this is a test) def
   #引用要使用 aaa就好了,/只有在定義時才要
   #注意這堥瓣ㄛO堆疊在先前operand中而是另一個叫?,因此不會顯示在出來,而這個stack是以名稱及    值,一對來堆疊
(3)陣列
    [1 12 45],三個數字的陣列
    [1 12 (this is a test)] ,兩個數字一個字串的陣列
(4)函式
    /func {y y mul} def
    函式名稱func,而函式內容使用大括號括起來,最後再加def
(5)保留字\,()[]特殊符號\n,\s,\w .........)
   如果要在字串中表示\或是()[],請加\,也就是\\,或\(、\)、\[、\]
(6)常見誤用:
   例如: x=x+1
   /x 2 def
   /x  x 1 add def        ->這是錯的,因為無法重複使用,它是變數非函式
  



3.條件控制(if,ifelse)
比較運算式
符號
大於
gt
大於等於
ge
小於
lt
小於等於
le
等於
eq
不等於
ne
條件 {op1} if
條件如果為true 則作大括號內的動作
條件 {op1} {op2} ifelse
如果條件成立,執行{op1} 否則執行{op2}
例如:如果2>1印出greate
2 1 gt {(greate)} if
2 1 gt {(greate)}{(little)} ifelse


4.迴圈(for,repeat,loop,exit)
    起始值  間隔   結尾值 { 你要做的事 } for
     12      40    300   { 750 moveto (test) show} for
   作:12  750 moveto  (test) show
      52  750 moveto  (test) show
        ..
      292 750 moveto (test) show
     執行次數 { 要做的事} repeat
     {要做的事} loop


  
5.頁面配置
  使用的座標系,其原點在左下角
y
    x
  一般常用頁面為A4(210mmx297mm)或(8.5x11英吋),每英吋為72點,也就是612X792點,如果是以12點的字,第一
  個字的位置在0,780。由於ps是以點來定位置,因此並沒有按行的符號,因此要自己定義函式來做換行運算,至  於橫向列印,要使用到變型,請參考6,你可以使用currentpoint

6.列印文字
  步驟如下:
  1.設定要使用的字型   findfont
  2.設定字型大小(點數) scalefont
  3.設定字型           setfont
  4.輸入要顯示的字串   show
  /Courier findfont
  12 scalefont
  setfont
  (test) show
  showpage         ->當我們要顯示一整頁之後它會釋放先前的設定,如果使用copypage則會沿用先前的設定
                     如果要將圖面變為白色請用erasepage

  

7.畫圖
  步驟如下:
  1.定義path(圖徑) (newpath)
  2.移到指定的位置  (moveto,rmoveto)
  3.使用不同畫圖工具 (arcto,lineto,curvto,rlineto,rarcto,rcurvto)
  4.定義線寬及顏色 (setlinewidth,setrgbcolor,setgray)
  5.畫圖(fill,eofill,stroke,如果是fill請注意必須是一個封閉的path)
 

8.變型
    主要有三個指令(translate,scale,rotate)
   1.translate:轉換座標,x-coord y-coord translate (你可以想成把一個東西移動(x,y)距離)
   2.scale:縮放
   3.rotate:旋轉  angle rotate(角度如果是正值是反時鐘方向旋轉,負的則為順時鐘方向旋轉)
     以下說明如何旋轉文字(90度)
     因為座標旋轉因此頁面的起始點為(0,0),而長及寬對調,因此變為792X612
         y                             x
      -x + x  =>90度旋轉(反時鐘)     y + -y
        -y                            -x
     而可顯示的區域仍在第一象限,因此y 是負的
     90 rotate
     12 -12 moveto
     (test) show


9.堆疊式語言的特點
  堆疊式語言有一個很大的特點就是直接利用堆疊來交換變數,也就是說我可以先將變數放在堆疊中,
  稍後再由另一個程序取出加以運用,但是某些資料是我們不需要,或是順序不對,因此我們可以用
  pop exch 或roll 加以運用
  例如:有一個座標是x1,y1 ,我們要y1而不要x1
       x1,y1
       exch
       pop
       如此堆疊中就剩下y1
  同一個名稱你可能使用/a {a 15 add } def
  如此是可以定義但不是你想像的a=a+15 ,初始值20
   /a 20 def
   /a {a 15 add }def
   會產生迴圈
   解法:
   /y 20 def
   /x {y 15 add /y exch def y} def  
   為了要在使用在x的函式中重新定義因此y 15 add 運算之後變為35  /y  exch ,變為/y 35 ,加def
   *但是我們要在堆疊中取得值因此重複y
   對於單一變數函數如(x2+2x)
   都可套用下列原則:只要在任何運算結束之後加 /變數名稱 exch def 變數名稱
    /y 2 def
    /x { y dup mul y 2 mul add /y exch def y } def
   (先將y變成兩個y dup ,再相乘mul,如此堆疊中有一個值y*y ,我們再設定y 2 uml , 結果堆疊中有兩個值,我們取出來相    加add,接下來就是上述原則


10.如何建立換行及換頁所何設定(直式)?
  頁面基本的設定(上邊界、下邊界、左邊界、右邊界、頁長、字型大小)
換行:
    1. 變數如右:top,left,line_space,pagesize ,y(y軸所在位置),(下邊界交給寫入程式)
    2. y=pagesize-top
    3. x,y位置:left,y
    4. 位罝的移動: (left,y-line_space),但是不可以小於0
    
程式:/top 10 def
     /left 10 def
     /pagesize 792 def
     /line_space 12 def
     /y  pagesize top sub line_space sub def
     /newline { y line_space sub  0 lt {/y  pagesize top sub line_space sub def}
                {/y y line_space sub def} ifelse left y moveto }def


換頁:重置y 不要使用showpage ,最好使用copypage,會保留之前的設定
      /y pagesize top sub line_space sub def
      copypage

11.橫向列印:
   參考旋轉的功能rotate
   我們把頁面A4固定在第一象限,而座標軸逆時鐘方向轉90度,所以(x,y)由(612,792)變為(792,-612)
   所以(x=0 至 792),(y=0 至 -612)
   ,由此可以想像其它角度的運算就比較難了,因此一般的運算我都會轉為原來的角度,而一般的畫線等畫圖功
   能都在不旋轉的狀況上設定

12.鑲入其它的ps檔
   你應該知道ps可以包含文字及圖,但是如果你有一個PS檔案要包含另一個有圖或文字的PS檔該怎麼辦,如果有這個需求要使用到Encapsulated PostScript(eps),相關規格在http://partners.adobe.com/asn/developer/pdfs/tn/5002.EPSF_Spec.pdf
   你也可以參考我的另一編文章EPS檔案解析
13.PS檔案的常用檔頭
   第一行帶出版本,如果沒有給也可以但是最好是給
   %!PS-Adobe-3.0
   其它:
%!PS-Adobe-3.0
%%Title: (Untitled2) 抬頭
%%Creator: (Microsoft Word: LaserWriter 8 8.4.2) 建立程式
%%CreationDate: (3:40 PM Friday, May 9, 1997) 建立日期
%%For: (dubois) 作者
%%Routing: (mailto:\000dubois@primate.wisc.edu)
%%Pages: 157 總頁數
%%PageOrder: Ascend 頁面排方式
%%Orientation: Portrait 橫向或直向
%%DocumentMedia: Default 612 792 0 () ()
頁面大小
%%EndComments 結束註解
14.浮水印(watermark)
浮水印是一種印在文件上的比較淡的文字,在ps 中要加在
%%Page:說明      --之後
以下是A first guide to postscript所提供的參考程式            
 
gsave
.75 setgray
/Helvetica-Bold findfont 72 scalefont setfont
80 80 800
{ 306 exch moveto                  % move to the center of the line
(Draft) dup
stringwidth pop 2 div neg 0 rmoveto % Center the text horizontally
show                                % Show the text
} for                               % and keep doinging it grestore

你可以修改文字Draft為別的字及其它