作者小白对WYTIWYG(What You Think Is What You Get)“所思即所得”的绘图方式情有独钟。之前就听说过metapost及asymptote两种绘图工具,很多网友都说,两种绘图工具,会其一,就可满足一生所需。
作者也是无意当中发现了Raymond大叔(没错,就是那个《大教堂和集市》的作者)写的一篇文章《Making Pictures With GNU PIC》,介绍PIC的基本使用。其中,文章中说,
“The pic language is a troff extension that makes it easy to create and alter box-and-arrow diagrams of the kind frequently used in technical papers and textbooks. ”
PIC的作者大家应该都很熟悉的吧?在小白没说出来之前,估计很少有人猜得到,没错,他就是贝尔实验室的Brain Kernihan,《C Programming Language》的作者之一,也是AWK的作者之一。
好了,其他就不扯那么多了,直接来几个例子把。所有的PIC代码需要放到.PS与.PE之间,与metapost的beginfig与endfig类似。
下面的两幅图是来至帮助文档里的例子,具有很好的学习指导作用。
实例1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
$
cat
pic08.pic
.PS
define filter {box ht 0.25 rad 0.125}
lineht = 0.25;
Top: [
right;
box
"\fBms\fR"
"sources"
;
move;
box
"\fBHTML\fR"
"sources"
;
move;
box
"\fBlinuxdoc-sgml\fP"
"sources"
wid 1.5;
move;
box
"\fBTexinfo\fP"
"sources"
;
line down from 1st box .s lineht;
A: line down;
line down from 2nd box .s; filter
"\fBhtml2ms\fP"
;
B: line down;
line down from 3rd box .s; filter
"\fBformat\fP"
;
C: line down;
line down from 4th box .s; filter
"\fBtexi2roff\fP"
;
D: line down;
]
move down 1 from last [] .s;
Anchor: box wid 1 ht 0.75
"\fBms\fR"
"intermediate"
"form"
;
arrow from Top.A.end to Anchor.nw;
arrow from Top.B.end to 1
/3
of the way between Anchor.nw and Anchor.
ne
;
arrow from Top.C.end to 2
/3
of the way between Anchor.nw and Anchor.
ne
;
arrow from Top.D.end to Anchor.
ne
{
# PostScript column
move to Anchor .sw;
line down left
then
down ->;
filter
"\fBpic\fP"
;
arrow;
filter
"\fBeqn\fP"
;
arrow;
filter
"\fBtbl\fP"
;
arrow;
filter
"\fBgroff\fP"
;
arrow;
box
"PostScript"
;
# HTML column
move to Anchor .se;
line down right
then
down ->;
A: filter dotted
"\fBpic2img\fP"
;
arrow;
B: filter dotted
"\fBeqn2html\fP"
;
arrow;
C: filter dotted
"\fBtbl2html\fP"
;
arrow;
filter
"\fBms2html\fP"
;
arrow;
box
"HTML"
;
# Nonexistence caption
box dashed wid 1 at B + (2,0)
"These tools"
"don’t yet exist"
;
line chop 0 chop 0.1 dashed from last box .nw to A.e ->;
line chop 0 chop 0.1 dashed from last box .w to B.e ->;
line chop 0 chop 0.1 dashed from last box .sw to C.e ->;
}
.PE
|
上面的代码如何编译呢?
1
2
3
|
$ pic pic08.pic |groff |ps2eps > pic08.eps
$ epstopdf pic08.eps
$ evince pic08.pdf
|
注意:小白的电脑里已经安装了TeXLive套件,所以上述程序都已经具备。所以,如果你的PC上没有相应的工具,请自行安装之。
效果图为:
实例2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
$
cat
box01.pic
.PS
define ndblock {
box wid boxwid
/2
ht boxht
/2
down; box same with .t at bottom of last box; box same
}
boxht = .2; boxwid = .3; circlerad = .3; dx = 0.05
down; box; box; box; box ht 3*boxht
"."
"."
"."
L: box; box; box invis wid 2*boxwid
"hashtab:"
with .e at 1st box .w
right
Start: box wid .5 with .sw at 1st box.
ne
+ (.4,.2)
"..."
N1: box wid .2
"n1"
; D1: box wid .3
"d1"
N3: box wid .4
"n3"
; D3: box wid .3
"d3"
box wid .4
"..."
N2: box wid .5
"n2"
; D2: box wid .2
"d2"
arrow right from 2nd box
ndblock
spline -> right .2 from 3rd last box
then
to N1.sw + (dx,0)
spline -> right .3 from 2nd last box
then
to D1.sw + (dx,0)
arrow right from last box
ndblock
spline -> right .2 from 3rd last box to N2.sw-(dx,.2) to N2.sw+(dx,0)
spline -> right .3 from 2nd last box to D2.sw-(dx,.2) to D2.sw+(dx,0)
arrow right 2*linewid from L
ndblock
spline -> right .2 from 3rd last box to N3.sw + (dx,0)
spline -> right .3 from 2nd last box to D3.sw + (dx,0)
circlerad = .3
circle invis
"ndblock"
at last box.e + (1.2,.2)
arrow dashed from last circle.w to last box chop 0 chop .3
box invis wid 2*boxwid
"ndtable:"
with .e at Start.w
.PE
|
效果图为:
小白利用两个午休的时间,大致看完了PIC的帮助文档,不是很难,多练习几个小例子,基本可以掌握其用法。自己也绘制了以下几幅图形,仅供有需要的网友参考,一副是awk的工作流程图,一副是sed的工作流程图,由于PIC暂不支持中文,所以,这里使用的E文。
实例1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
$
cat
SedWorkflow.pic
.PS
A: box ht 0.8 rad 0.08
"Line 1"
"Line 2"
"Line 3"
"Line 4"
"..."
B: box width 1.8
"\fBRead\fP a line into the"
"pattern space"
with .nw at A.
ne
+ (0.5,0)
C: box width 1.8
"\fBExecute\fP given sed commands"
"on the pattern space"
at B - (0,0.8)
D: box width 1.8
"\fBPrint\fP the pattern space"
"and empty it"
at C - (0,0.8)
E: box width 1.8
"\fBRepeat\fP for the next line until"
"end of the input file"
at D - (0,0.8)
F: box width 0.5 ht 0.35 rad 0.05
"Line 1"
with .w at B.e + (0.35,0)
G: circle
"Output"
with .w at D.e + (0.35,0)
L1: line chop 0.01 chop 0.9 from 1st box at 1
/3
<A.e,A.
ne
> to B ->
L2: line down from B to C -> chop
L3: arrow down from C to D chop
L4: arrow down from D to E chop
L5: line dashed from B.e to F.w ->
L6: line dashed from C.e to F.w ->
L7: line dashed from D.e to G.w ->
L8: line down 2.85 from L1 .center
L9: line right from L8.end to E.s - (0,0.2)
L10: line from E.s to L9.end
.PE
|
图形效果为:
实例2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
$
cat
awk_workflow.pic
.PS
A: box ht 0.8 rad 0.08
"Line 1"
"Line 2"
"Line 3"
"Line 4"
"..."
INFILE:
"\fBInput file\fP"
with .n at A.s - (0,0.15)
B: box width 1.8
"Read a Line"
with .nw at A.
ne
+ (0.5,0)
C: box width 1.8
"Execute awk commands"
"in the \fBbody\fP block on the line"
at B - (0,0.8)
D: box width 1.8
"\fBRepeat\fP for the next line until"
"end of the input file"
at C - (0,0.8)
E: box width 1.8 rad 0.1
"Execute awk commands in"
"the \fBEND\fP Block"
at D - (0,0.8)
F: box width 1.8
"Execute awk commands in"
"the \fBBEGIN\fP Block"
at B + (0,0.8)
L1: line chop 0.01 chop 0.9 from 1st box at 1
/3
<A.e,A.
ne
> to B ->
L2: line down from B to C -> chop
L3: arrow down from C to D chop
L4: arrow down from D to E chop
L5: line down 2 from L1 .center
L6: line right from L5.end to L4.center
L7: arrow from F.s to B.n
.PE
|
图形效果为:
好了,以上是小白的练习。更多的源文件小白也共享出来吧,感兴趣的网友可以看一看。
附件:http://down.51cto.com/data/2365823