作者小白对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上没有相应的工具,请自行安装之。

效果图为:

wKiom1WE8_DQ06ssAAE3Yur5x3s264.jpg

实例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

效果图为:

wKioL1WE9nuxXt02AAHgI_CGXUk978.jpg


小白利用两个午休的时间,大致看完了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

图形效果为:

wKioL1WE-ZvSPL2BAAGcQVY7MIk451.jpg

实例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

图形效果为:

wKioL1WE-bWBf8vrAAFVK2ALfIA774.jpg


好了,以上是小白的练习。更多的源文件小白也共享出来吧,感兴趣的网友可以看一看。