直线和曲线

首先需要了解TikZ的坐标表示形式,有两种直接形式:直角坐标和极坐标。直角坐标采用(x,y)的形式,极坐标采用(theta:distance)的形式。后文的例子一般采用直角坐标表示,但均可以替换为极坐标形式。TikZ还可以通过相对位置描述坐标,使用+(x,y)和++(x,y),表示相对于前一个点的方位。两者的区别在于,+不更新点的坐标,而++更新点的坐标(类似于C语言中的自增的概念)。例如(0,0)+(1,1)+(2,3)分别表示(0,0)、(1,1)、(2,3),而(0,0)++(1,1)++(2,3)表示(0,0)、(1,1)、(3,4)。
其次是路径的概念。在绘制直线或曲线时,TikZ会首先根据所给条件确定一条路径(可以想象为Photoshop汇总的钢笔工具),然后沿着该路径描出曲线或者填充形状等。例如
\draw (xb,yb) (xe,ye);
为从(xb,yb)到(xe,ye)的一条路径。直线的绘制命令如下
\draw (xb,yb)--(xe,ye);
可以连接多个 --(x,y)画出连续直(折)线。
曲线是通过三次贝塞尔曲线绘制的,需要给出两个控制点坐标
\draw (xb,yb).. controls (x1,y1) and (x2,y2) ..(xe,ye);
其中(x1,y1)和(x2,y2)为两个控制点,如果and (x2,y2)省略,则认为(x2,y2)等于(x1,y1)。控制点坐标如果用相对位置的极坐标表示会更加直观一些(e.g. +(30:5cm))。
可以在\draw命令后使用[attribute]包括一些属性,指定绘图风格。
color:指定线的显色thin/thick/semithick:指定线的宽度,前面可以加very/ultra修饰加强效果,注意ultra thin在一些低分辨率的介质上可能无法正常显示出来;semithick是介于thin和thick之间的粗度dashed/dotted:指定虚线样式,前面可以加loosely/densely修饰加强效果step:画网格(见下文)时指定步长dashed pattern:指定更复杂的虚线样式rotate:指定绘图角度,在画完之后旋转该角度显示scale:指定坐标缩放的比例,通常在全局环境中使用,值如3
下面列举使用\draw命令画简单图形的用法:
\draw (x0,y0)circle(r):画圆,其中x0,y0是圆心坐标;r为半径,可以取10pt等\draw (x0,y0)ellipse(aandb):画椭圆,其中x0,y0是圆心坐标;a和b分别代表半长轴和半短轴长,可以互换\draw (x0,y0)rectangle(x1,y1):画矩形,两个坐标给出任意一条对角线的两个端点坐标\draw (x0,y0)arc(theta0:theta1:r):画弧,其中x0,y0是圆心坐标;r为半径;theta0和theta1指定弧角的范围。如果需要椭圆弧,则将r替换为aandb\draw[step=step_len] (x0,y0)grid(x1,y1):画网格,两个坐标给出矩形范围,step参数指定格子边长
\draw命令还可以画抛物线、正弦、余弦等曲线,由于函数曲线的绘制通常在其他专业软件中完成,在此不再赘述。

节点

在画流程图之前,首先需要了解node关键字的功能。
node关键字是用于指明路径中的一个节点(结点),其参数允许指定节点的一些性质和显示的文字,格式如下
\draw (0,0) node [attribute] {some text}
-- node [attribute] {some text}
(1,1);
注意到上面示例中node的两种使用方式,当节点需要在指定坐标附近显示时,需要紧跟坐标;当节点需要在路径上显示时,则要紧跟--(直线)或者..controls (x,y) and (x,y) ..(曲线)或者后文提到的to和edge。当然,node关键字也可以在\path中使用。如果需要在路径旁边显示文字,则可在tikzpicture环境的可选参数中添加auto,使TikZ自动将节点显示在路径旁边。
{}中的文本可以是多行的,无需行分隔符。可选参数attribute有以下属性可以指定(多个属性间通过半角逗号分割)
name:节点的名字,不可以包括除下划线和连字符及空格以外的特殊字符(如逗号、句号、括号、冒号等)shape:节点的形状,可以是circle、rectangle等color:节点的颜色draw:绘制节点的外框,值可以是颜色,例如blue!50等,也可以缺省为黑色fill:填充节点内部,值是可以使颜色颜色,举例同上anchor:将文字放在指定坐标的附近,可选值有north、south、east、west或者其组合如south eastbelow/above/right/left:将文字放在指定坐标的附近,但可以指定距离如1pt或者3cm等,不赋值时效果与anchor类似pos:当文字需要放在路径上时,用于指定在路径上的位置,取值范围为[0,1],对应距起点的距离占总长度的比例near start/near end:简单指定文字在路径上的位置,可以在前面加上very加强效果sloped:旋转文字的角度使之与曲线相吻合inner sep:指定在文本周围增加空白边缘,值如1pt等minimum size:指定节点的最小尺寸,值如1mm等below of/above of/right of/left of:指定相对与某个节点的位置,可以组合为below right of等,值为相对的节点名字。使用时,应省略绝对坐标位置node distance:与上一功能结合使用,指定相对方向上的距离,值如5cmlabel:用于绘制在该结点附近的说明文字,可以多次使用画出多个标签。值为 位置:文字,如below:This is a node.在节点正下方显示This is a node.,60:$60^\circ$则在60度的位置显示60°auto:将节点放置在路径旁边swap:当环境或节点使用auto选项时,在路径的另一侧显示节点
TikZ允许在不至于混淆的情况下省略shape=和color=,而直接给出属性的值。另外,节点的名字不光可以通过name指定,也可以直接在node关键字后用半角括号将名字括起来。
如果需要绘制多个节点,而具有相同的attribute,则可以在tikzpicture环境之外指定风格
\tikzstyle{style_name}=[circle,draw=blue!50]
\begin{tikzpicture}
\path (0,0) node [style=style_name] {node 1};
\end{tikzpicture}
在使用风格时,可以省略style,直接将风格名称用[]括起来。当然,如果从代码可读性角度来说,希望强调style_name是一种自定义风格,则使用style=style_name更好。预定义的风格可以同时使用多种,只需通过半角逗号分隔即可。预定义的风格也可以嵌套叠加,例如
\tikzstyle{style 1}=[very thick]
\tikzstyle{style 2}=[red]
\tikzstyle{style 2}+= [style 1]
style 2表示红色、很粗的风格。
如果只需要放置节点,可以通过构造一条路径依次放置,但更直观的方式是at表达式
\path node (node_1_name) at (0,0) {node 1}
node (node_2_name) at (0,1) {node 2};
其简化形式是
\node (node_1_name) at (0,0) {node 1};
\node (node_2_name) at (0,1) {node 2};
at后不仅可以使用坐标形式,也可以是节点的锚点(将在下一小节介绍)形式,如nodename.north等。
实际上,node关键字后的节点名称、at坐标、和风格选项并没有固定的顺序(风格还可以拆分成多段指定),只要将文字选项放在最后,即可使用自己习惯的排列。

流程图、Petri图

介绍完node之后,就可以准备画流程图了。
首先介绍锚点的概念。锚点就是在节点边缘的一系列特殊的点,例如north、south、west、east、center分别表示节点的上、下、左、右和中心。引用方式为节点名称.锚点名称,中间用半角句号连接即可。
我们可以使用\draw命令连接两个节点的锚点
\draw [->] (node1.west) -- (node2.east);
这样理论上可以画出流程图,但实际上代码可读性和通用性较差,可以仅指定节点名称,让TikZ自动选择锚点。
\draw [->] (node1) -- (node2);
如果需要画曲线,可以使用锚点形式
\draw [->] (node1) ..controls () and ().. (node2);
同样也可以使用to表达式自动确定
\draw [->] (node1) to [out=-120,in=60] (node2);
参数in和out分别指定了连接线进入和离开节点的角度,缺省时则为直线。还有一个简化选项是bend right,用于指定曲线向右侧弯曲的角度,也可通过在tikzpicture环境的可选参数bend angle中修改其缺省值。
还有一种方法是使用edge表达式,这种方式在某个节点的入度和出度较大时十分方便,下面是一个例子,将1和2指向ctr,ctr指向3。