符号说明:
-
字典 <</PageSize [809 1150] >>
-
字符串 (aabbcc)
-
ASCII数组 < 3042 3046 3046 >
-
数组 [1 2 3 4]
-
过程体/函数体 { do something }
-
变量名 /VarName
变量定义:
定义 X和Y两个变量,分别赋值1和2
/ X 1 def
/ Y 2 def
和下面的代码等同
2 1
/ X exch def
/ Y exch def
定义字符串,名字是str,值是TestString
/ str /TestString def
定义字符串,名字是StripC,把nCyan数值值转换成字符串的值
/StripC nCyan string def
定义字典:
/MyCallbook <</Huang /88886666 /Zhang /888866667>> def
定义复杂字典:可容纳30个元素
30 dict begin
/Height exch def
/Width exch def
/Y exch def
/X exch def
End
Begin是把这个字典放到操作数栈中,end是从操作数栈中删除字典。
定义数组:
/Decode [1 0 1 0 1 0] def
定义矩阵:
matrix currentmatrix
这个说是定义,有点牵强,因为这个是专门用于定义坐标矩阵。
Matrix指令是新建一个坐标矩阵变量并放入操作数栈,currentmatrix指令是把当前的坐标矩阵的值赋值到新建的坐标矩阵变量中。
定义过程、函数:
/DrawGridLines
{
0 exch 1800 {
dup
0 moveto 0 1800 rlineto
0 exch moveto 1800 0 rlineto
} for
} def
调试,查看变量值:
可以用双等号 == 或print指令输出变量的值。
如:
/nCount 10 def
(nCount = ) print
nCount ==
输出结果是:nCount = 10
==输出的是一行,自动换行;Print换行时需要加“/n”:(/n) print
输出栈顶的元素:
Dup ==
输出栈顶的第二个元素:
Dup 2 pop ==
还有许许多多的关键字、指令或函数,只有去看PostScrip的文档了。
下面实战演习,来解读一段可以生成一个条形码的PostScript程序吧。
% DRAW BARCODE
% left top width height length patternC patternM patternY patternK PatternS1 SpaceType VAR29 --> -
%
% parameters:
% left ... x-coord of barcode's upper-left corner
% top ... y-coord of barcode's upper-left corner
% height ... barcode's height
% width ... barcode's width
% length ... number of bits PatternX includes
% patternC ... pattern of Cyan color space
% patternM ... pattern of Magenta color space
% patternY ... pattern of Yellow color space
% patternK ... pattern of Black color space
% patternS1 ... pattern of Spot1 color space
% patternS2 ... pattern of Spot2 color space
% spacetype ... kinf of color space
PS语言的注视用%号,没发现用于块注释的方法。
/VAR30 11 dict def 定义字典变量VAR30,可容纳11个元素
/VAR31 8 dict def 定义字典变量VAR31,可容纳8个元素
/VAR29 where { pop } { where指令是在字典栈中查找VAR29变量,如果有,执行pop指令,把VAR29变量的内容(函数体)放入操作数栈。否则执行VAR29函数的定义
/VAR29 { 定义VAR29函数
VAR30 begin 新建VAR30字典,压入操作数栈
/SpaceType exch def 从这儿以下的变量定义及赋值,是和函数传入的参数
/PatternS2 exch def 一一对应的。
/PatternS1 exch def Exch指令是交换操作数栈顶两个元素位置。
/PatternK exch def 这里需要注意栈的先进后出特性以及每个指令出入
/PatternY exch def 栈的操作数的数量。
/PatternM exch def 变量名声明进栈一次,exch进出栈各两次,
/PatternC exch def def出栈两次,每个变量定义需要操作栈7次。
/Length exch def
/Height exch def
/Width exch def
/Top exch def
/Left exch def
SpaceType 1 eq ifelse的判断条件。
{ [/DeviceCMYK] } 如果SpaceType等于1执行此句。
{ 否则执行这个过程体。
SpaceType 2 eq ifelse的判断条件。
{ VAR32 } 如果SpaceType等于2,把VAR32数组放到操作数栈。
{ VAR33 } ifelse 否则,把VAR33数组放到操作数栈。
} ifelse
Setcolorspace 以VAR32或VAR33数组为参数设定色彩空间,
主要是特色的设定。
Left Top translate 坐标偏移。
Width Height scale 坐标缩放,X和Y的缩放比例可以不一样。
VAR31 begin 新建VAR31字典,压入操作数栈。
/ImageType 1 def 变量定义。
/Width Length def 其实这里定义字典主要的功能相当于C语言中的局部
/Height 1 def 变量的使用范围的设定。
/ImageMatrix [Length 0 0 1 0 0] def 定义数组。
/MultipleDataSources true def 定义Boolean型变量。
SpaceType 1 eq ifelse的判断条件。
{ 如果SpaceType等于1。
/DataSource [{PatternC} {PatternM} {PatternY} {PatternK}] def
定义一个数组放到操作数栈中,看到{}了吗?
这是个过程数组。有点向C语言中的函数指针数组。
/Decode [0 1 0 1 0 1 0 1] def
}
{ 如果SpaceType等于其他值时。
SpaceType 2 eq ifelse的判断条件。
{ %/* CMYL + S1 */ 如果SpaceType=2,输出CMYK和特色S1两组颜色。
/DataSource [{PatternC} {PatternM} {PatternY} {PatternK} {PatternS1}] def
/Decode [0 1 0 1 0 1 0 1 1 0] def
}
{ %/* CMYK + S1 + S2 */如果SpaceType=3,输出CMYK和S1/S2三组颜色。
/DataSource [{PatternC} {PatternM} {PatternY} {PatternK} {PatternS1} {PatternS2}] def 定义数组。
/Decode [0 1 0 1 0 1 0 1 1 0 1 0] def 定义数组。
} ifelse
} ifelse
/BitsPerComponent 1 def 定义一个变量。
Currentdict 把字典栈的最上面一个元素(即上面定义的
VAR31字典)拷贝到操作数栈中。
End 从字典栈中删除VAR31字典。
image 把VAR31字典作为参数,执行image指令。
end 从字典栈中删除VAR30字典。
} bind def 完成VAR29函数的定义,并把VAR29压入字典栈的
当前字典中
} ifelse
% OBTAIN MAXIMUM VALUE
% array VAR34 --> max
%
% parameters:
% array ... an array of numbers
%
% result:
% max ... maximum value among the array
/VAR35 4 dict def 声明VAR35字典
/VAR34 where { pop } { 检查VAR34函数是否已经定义
/VAR34 { 定义VAR34函数
VAR35 begin 定义VAR35字典,相当增加一个局部变量空间。
/ary exch def 取得传入的参数(参数为数组)
/max ary 0 get def 定义一个临时变量max,并把数组的第0个值赋给它
1 1 ary length 1 sub 先执行ary length,取得数组的长度,再执行减1(1 sub)
最后栈顶的三个元素为、:1、1和数组的长度。用于
for循环,意思是,从1到数组长度,步长为1.
{ /n exch def 数组长度赋值给变量n
/value ary n get def 得到数组中的第n个值赋值给变量value
/max max value gt {max} {value} ifelse def
Max和value比较大小,用大的值给max重新赋值
} for for循环
Max 把max变量的值放到操作数栈中
End 删除CSD35字典
} bind def 完成VAR29函数的定义,并把VAR29压入字典栈的
当前字典中
} ifelse
% SET CMYK + SPOT1,2 COLOR SPACE
% name1 c1 m1 y1 k1 name2 c2 m2 y2 k2 VAR36 --> -
%
% parameters:
% nameX ... name of spot color X
% cX ... value of Cyan component of spot color X
% mX ... value of Magenta component of spot color X
% yX ... value of Yellow component of spot color X
% kX ... value of Black component of spot color X
这个函数的功能是产生两个在输出条形码图形的时候需要用到的数组变量VAR32和VAR33,这俩字典中分别保存着特色S1和S2的信息。
/VAR37 10 dict def 声明VAR37字典
/VAR38 6 dict def 声明VAR38字典
/VAR36 where { pop } { 检查VAR36函数是否已经定义
/VAR36 { 定义VAR34函数
VAR37 begin 定义VAR37字典
/S2K exch def 取得传入的参数
/S2Y exch def
/S2M exch def
/S2C exch def
/S2Name exch def
/S1K exch def
/S1Y exch def
/S1M exch def
/S1C exch def
/S1Name exch def
userdict /VAR32 定义VAR32数组,并把此数组变量放到用户字典栈中,
相当于定义了一个全局变量。
[ /DeviceN 数组变量名DeviceN
[/Cyan /Magenta /Yellow /Black S1Name] 数组DeviceN的值
/DeviceCMYK 过程变量名DeviceCMYK
{ VAR38 begin 定义VAR38字典,压入字典栈中
/S1 exch def 字典元素(局部变量)的声明
/Black exch def
/Yellow exch def
/Magenta exch def
/Cyan exch def
VAR37 begin 定义VAR37字典,压入字典栈中
[Cyan S1 S1C mul] VAR34 函数调用,求最大值
[Magenta S1 S1M mul] VAR34
[Yellow S1 S1Y mul] VAR34
[Black S1 S1K mul] VAR34
End 删除VAR37字典
End 删除VAR38字典
这个地方也许让人困惑,看起来什么都没做。实际上,
在VAR34函数是把max的值压入到操作数栈中了。
DeviceCMYK 这个过程产生的结果,也就是在操作
数栈顶增加了4个max的值。
}
] put
userdict /VAR33 和VAR32数组的定义一致,唯一不同的地方是求最
大值的时候,特色S2的值也参与了进去。
[ /DeviceN
[/Cyan /Magenta /Yellow /Black S1Name S2Name]
/DeviceCMYK
{ VAR38 begin
/S2 exch def
/S1 exch def
/Black exch def
/Yellow exch def
/Magenta exch def
/Cyan exch def
VAR37 begin
[Cyan S1 S1C mul S2 S2C mul] VAR34
[Magenta S1 S1M mul S2 S2M mul] VAR34
[Yellow S1 S1Y mul S2 S2Y mul] VAR34
[Black S1 S1K mul S2 S2K mul] VAR34
end
end
}
] put
end
} bind def
} ifelse
(S1) 0 10 0 (S2) 0 0 1 0 VAR36 调用VAR36函数设置特色
Gsave 保存当前坐标矩阵
190 590 200 160 16 <73EA> <0000> <0000> <0000> <0002> <0000> 2 VAR29