在以下环境测试过
完整代码
\documentclass{article}
%
\usepackage{ctex}
\usepackage{geometry}
\usepackage[dvipsnames, svgnames, x11names]{xcolor}
\usepackage{tikz}
\usepackage{xstring}
%
\usetikzlibrary{positioning, arrows.meta, chains}
%
% 定义箭头样式
\tikzset{
arrow1/.style = {
draw = purple, thick, -{Latex[length = 4mm, width = 1.5mm]},
}
}
%
\begin{document}
%
\begin{center}
\begin{tikzpicture}[start chain=1 going right,node distance=-0.15mm]
\node[on chain=1] at (-1.5, -0.4){……};
\foreach \x in {1,...,13} {
\x, \node[draw, on chain=1, minimum size=8mm] {\StrChar{while { }(a>10)}{\x}};
}
\node[on chain=1] at (9.5, -0.4){……};
\draw[arrow1,on chain=1](-0.6,-1.7)--node[left,yshift=-20pt,xshift=10pt]{上一个单词起始位置}(-0.6,-0.8);
\draw[arrow1,on chain=1](3.4,-1.7)--node[left,yshift=-20pt,xshift=10pt]{搜索指针}(3.4,-0.8);
\draw[arrow1,on chain=1](5,-1.7)--node[left,yshift=-20pt,xshift=10pt]{起始位置}(5,-0.8);
\end{tikzpicture}
\heiti\\ 图2-1 词法分析器起始位置\songti
\end{center}
%
\end{document}
效果如下:
说明:
1、本例中新增了TikZ中的chains库,并且为了处理字符串包含了宏包xstring。
2、如果不指定node的尺寸大小,生成的方框大小将会随着内容而变化,很不整齐,所以最好指定大小。除了使用例中的minimum size设置外,还可使用text width、text height与text depth配合设置。
3、注意里面的循环语句\foreach,灵活使用可以省不少事。
4、字符串命令 \StrChar{字符串}{位置} 是从字符串中按指定的位置取出单个字符。相关字符串函数还有不少,可去xstring宏包的说明文档上查询。
完整代码
\documentclass{article}
%
\usepackage{ctex}
\usepackage{geometry}
\usepackage[dvipsnames, svgnames, x11names]{xcolor}
\usepackage{tikz}
\usepackage{xstring}
%
\usetikzlibrary{positioning, arrows.meta, shapes}
%
% 定义淡黄色
\definecolor{umlYellow}{RGB}{255, 251, 214}
%
% 定义箭头样式
\tikzset{
arrow1/.style = {
draw = purple, thick, -{Latex[length = 4mm, width = 1.5mm]},
}
}
%
% 流程图样式
\tikzset{
base/.style={
draw=purple,
fill=umlYellow,
align=center,
minimum height=4ex,
},
proc/.style={
base,
rectangle,
},
term/.style={
proc,
text width=4em,
rounded corners=3mm,
},
test/.style={
diamond,
draw=purple,
fill=umlYellow,
aspect=2,% 控制纵横比例,越大就越扁
align=center,
},
}
\begin{document}
%
\begin{center}
\begin{tikzpicture}
\node[term](begin){开始};
\node[test,text width=8em,below=of begin](f1){当前搜索指针指向的字符是否为字母};
\node[term,right= -0.3cm of f1,yshift=-1.5cm](error){出错};
\node[proc,below=of f1](f2){搜索指针后移一个字符};
\node[test,right=3cm of f1,yshift=1cm](f3){当前搜索指针\\ 指向的字符是否为\\ 字母或数字};
\node[proc,below=of f3](f4){搜索指针后移一个字符};
\node[term,below=2cm of f4,xshift=-1.5cm](end){结束};
% ------------------------------------------------------
\path[arrow1](begin)--(f1);
\path[arrow1](f1)--node[right]{Y}(f2);
\path[arrow1](f1)-|node[right]{N}(error);
\path[arrow1](f2)|-++(45mm,-5mm)--++(0,65mm)-|(f3);
\path[arrow1](f3)--node[right]{Y}(f4);
\path[arrow1](f4)|-++(-42mm,-10mm)|-(f3);
\path[arrow1](f3.east)-|++(5mm,-45mm)node[right,yshift=23mm]{N}-|(end);
\end{tikzpicture}
\heiti\\ 图2-2 识别Pascal标识符的程序流程图\songti
\end{center}
%
\end{document}
效果如下:
说明:
1、本例中因为使用了diamond菱形图,所以需要载入TikZ中的shapes库。
2、绘制过程还是先定义图形、箭头样式,然后绘制节点,最后连线。注意这里绘制线段的命令是\path,不是以前用的\draw。
3、对于有规律的图形,可以使用chains、matrix等库以及循环、字符串、数学命令等来更快速的完成。