符号说明 :
变量定义 :
定义 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