程图是表达算法思想最为有效的图形工具。作为计算机专业的学生,我们经常需要在文档中使用流程图来描述算法。在 LaTeX 中使用流程图可以通过 TikZ 或 flowchart 宏包来实现,但从本质上来说 flowchart 宏包也是使用 TikZ 宏包来实现的。下面分别通过一个简单的例子来对这两种方法进行说明。
使用 flowchart 宏包绘制流程图flowchart 宏包根据 IBM 提出的流程图标准,定义了流程图中最常用的五种标准形状,包括:
- PROCESS: 一切函数过程
- DECESION: 条件判断
- PREDEFINED PROCESS:预定义过程
- STORAGE: 数据存储
- TERMINAL: 开始,结束
下面,我们通过一个简单的示例代码来说明,请注意看代码中的注释

直接使用 TikZ 宏包绘制流程图。
flowchart 定义的形状数量比较少,可能满足不了绘制复杂流程图的需要,我们还可以直接使用 TikZ 强大的绘图功能来实现流程图的绘制。还是先看示例代码,配合注释,再进行讲解吧。
- %!TEX program = xelatex
-
- % 使用 ctexart 文类,UTF-8 编码
-
- % 作者:王泽宇
-
- \documentclass[UTF8]{ctexart}
-
- \usepackage{tikz,mathpazo}
-
- \usetikzlibrary{shapes.geometric, arrows}
-
- \begin{document}
-
- \thispagestyle{empty}
-
- % 流程图定义基本形状
-
- \tikzstyle{startstop} = [rectangle, rounded corners, minimum width=3cm, minimum height=1cm,text centered, draw=black, fill=red!30]
-
- \tikzstyle{io} = [trapezium, trapezium left angle=70, trapezium right angle=110, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=blue!30]
-
- \tikzstyle{process} = [rectangle, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=orange!30]
-
- \tikzstyle{decision} = [diamond, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=green!30]
-
- \tikzstyle{arrow} = [thick,->,>=stealth]
-
-
- \begin{tikzpicture}[node distance=2cm]
-
- %定义流程图具体形状
-
- \node (start) [startstop] {Start};
-
- \node (in1) [io, below of=start] {Input};
-
- \node (pro1) [process, below of=in1] {Process 1};
-
- \node (dec1) [decision, below of=pro1, yshift=-0.5cm] {Decision 1};
-
- \node (pro2a) [process, below of=dec1, yshift=-0.5cm] {Process 2a};
-
- \node (pro2b) [process, right of=dec1, xshift=2cm] {Process 2b};
-
- \node (out1) [io, below of=pro2a] {Output};
-
- \node (stop) [startstop, below of=out1] {Stop};
-
-
- %连接具体形状
-
- \draw [<span class="link_label">arrow</span>](<span class="link_url">start</span>) -- (in1);
-
- \draw [<span class="link_label">arrow</span>](<span class="link_url">in1</span>) -- (pro1);
-
- \draw [<span class="link_label">arrow</span>](<span class="link_url">pro1</span>) -- (dec1);
-
- \draw [<span class="link_label">arrow</span>](<span class="link_url">dec1</span>) -- (pro2a);
-
- \draw [<span class="link_label">arrow</span>](<span class="link_url">dec1</span>) -- (pro2b);
-
- \draw [<span class="link_label">arrow</span>](<span class="link_url">dec1</span>) -- node[anchor=east] {yes} (pro2a);
-
- \draw [<span class="link_label">arrow</span>](<span class="link_url">dec1</span>) -- node[anchor=south] {no} (pro2b);
-
- \draw [<span class="link_label">arrow</span>](<span class="link_url">pro2b</span>) |- (pro1);
-
- \draw [<span class="link_label">arrow</span>](<span class="link_url">pro2a</span>) -- (out1);
-
- \draw [<span class="link_label">arrow</span>](<span class="link_url">out1</span>) -- (stop);
-
- \end{tikzpicture}
-
- \end{document}

比较两个方法的代码可知,相比使用 flowchart 宏包,直接使用 TikZ 绘制流程图多了定义基本形状一步。但通过 TikZ 自己定义基本形状,流程图的可定制性更好,可以根据具体需要,定义多种流程图形状。另外一个使用 flowchart 宏包来绘制,最终还是需要用到 TikZ 语法,也不见得有多简单。因此,推荐使用 TikZ 直接绘制流程图。另外,在很久之间,还有一个名为 nassflow 的宏包也可以实现流程图的绘制,但在目前的几个留下的 LaTeX 的发行版中,都没有预装该宏包,因此,在这里也就不做说明了。
选自:http://wangmurong.org.cn/2015/06/14/how-to-draw-flow-chart-in-latex/


雷达卡



京公网安备 11010802022788号







