【TikZ 简单学习[下]:基础绘制】Latex下的绘图宏包

  • 上文
    • 绘制多个节点
    • 给节点添加统一样式
    • 给节点命名
    • 使用相对位置绘制
    • 给节点标签
    • 链接边的绘制
    • 在线边上添加标签
    • 绘制蛇形线和多行文本
    • 层图
    • 绘制一个简单的树

上文

  • 【TikZ 简单学习(上):基础绘制】Latex下的绘图宏包

绘制多个节点

  • 方法一:
    使用 \path A node[attr]{info} 进行绘制多个节点,这里节点和 “路径” 无关
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}\path    ( 0,2) node [shape=circle,draw] {}( 0,1) node [shape=circle,draw] {}( 0,0) node [shape=circle,draw] {}( 1,1) node [shape=rectangle,draw] {}(-1,1) node [shape=rectangle,draw] {};
\end{tikzpicture}
\end{document}

  • 方法二:
    \node\path node 的省略,这里需要额外加上 at,即:
    \node at A [attr]{info};
    前面提到过,[draw] 的意思是并且绘制的意思。这里 [shape=circle] 可以简写成 [circle]
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}\node at ( 0,2) [circle,draw] {};\node at ( 0,1) [circle,draw] {};\node at ( 0,0) [circle,draw] {};\node at ( 1,1) [rectangle,draw] {};\node at (-1,1) [rectangle,draw] {};
\end{tikzpicture}
\end{document}

给节点添加统一样式

  • 节点里没有文本,为什么节点仍然有大小?因为 TikZ 自动为文本周围添加了一些空间 inner sep
    所以可以更改 [inner sep = 0pt] 来修改之类的。
    但是确保节点正常显示,设置它的最小大小 [minumun size = 6mm]
  • 然后就是设置统一样式 [XXX/.style={……}]
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[place/.style={circle,draw=blue!50,fill=blue!20,thick,inner sep=0pt,minimum size=6mm},transition/.style={rectangle,draw=black!50,fill=black!20,thick,inner sep=0pt,minimum size=4mm}]\node at ( 0,2) [place] {};\node at ( 0,1) [place] {};\node at ( 0,0) [place] {};\node at ( 1,1) [transition] {};\node at (-1,1) [transition] {};
\end{tikzpicture}
\end{document}

给节点命名

  • 给节点命名可以为后续操作节省便利,不需要单独去计算坐标绘制。
    (name) ,注意名字不能有特殊字符等,可以有下划线和连线符。
  • TikiZ 语法对于多个并列属性之间循序比较宽松,可以比如 \node [A] (B) at C 或者 \node (B) [A] at C 之类的。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[place/.style={circle,draw=blue!50,fill=blue!20,thick,inner sep=0pt,minimum size=6mm},transition/.style={rectangle,draw=black!50,fill=black!20,thick,inner sep=0pt,minimum size=4mm}]\node[place] (waiting 1) at ( 0,2) {};\node[place] (critical 1) at ( 0,1) {};\node[place] (semaphore) at ( 0,0) {};\node[transition] (leave critical) at ( 1,1) {};\node[transition] (enter critical) at (-1,1) {};\end{tikzpicture}
\end{document}

使用相对位置绘制

  • 上面给了许多坐标,其实我们也可以通过相对位置绘制
    需要导入 \usetikzlibrary {positioning},然后使用下述语法:
    [below = of name][right = of name] 等,他们之间的距离为 node distance,默认为节点之间的中心之间的距离,或者是边界之间的距离。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary {positioning}\begin{document}
\begin{tikzpicture}[place/.style={circle,draw=blue!50,fill=blue!20,thick,inner sep=0pt,minimum size=6mm},transition/.style={rectangle,draw=black!50,fill=black!20,thick,inner sep=0pt,minimum size=4mm}]\node[place] (waiting) {};\node[place] (critical) [below=of waiting] {};\node[place] (semaphore) [below=of critical] {};\node[transition] (leave critical) [right=of critical] {};\node[transition] (enter critical) [left=of critical] {};
\end{tikzpicture}
\end{document}

给节点标签

  • 方法一:
    添加一个姓的节点,设定属性为 [red,above],添加在 (semaphore.north) 某节点的北方,文字信息为 {s \e 3}
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary {positioning}\begin{document}
\begin{tikzpicture}[place/.style={circle,draw=blue!50,fill=blue!20,thick,inner sep=0pt,minimum size=6mm},transition/.style={rectangle,draw=black!50,fill=black!20,thick,inner sep=0pt,minimum size=4mm}]\node[place] (waiting) {};\node[place] (critical) [below=of waiting] {};\node[place] (semaphore) [below=of critical] {};\node[transition] (leave critical) [right=of critical] {};\node[transition] (enter critical) [left=of critical] {};\node [red,above] at (semaphore.north) {$s\le 3$};
\end{tikzpicture}
\end{document}

  • 方法二:
    使用 [label=above:$info$] 即标签属性来直接添加标签信息。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary {positioning}\begin{document}
\begin{tikzpicture}[place/.style={circle,draw=blue!50,fill=blue!20,thick,inner sep=0pt,minimum size=6mm},transition/.style={rectangle,draw=black!50,fill=black!20,thick,inner sep=0pt,minimum size=4mm}]\node[place] (waiting) {};\node[place] (critical) [below=of waiting] {};\node[place] (semaphore) [below=of critical,label=above:$s\le3$] {};\node[transition] (leave critical) [right=of critical] {};\node[transition] (enter critical) [left=of critical] {};
\end{tikzpicture}
\end{document}
  • 也可以给多重标签。
    这里使用 [label=60] 表示在60度的位置添加标签
    [label=-90] 表示在270度的位置添加标签
  • 使用 [every label/.style={}] 来修改标签的风格。
\tikz\node [circle,draw,label=60:$60^\circ$,label=below:$-90^\circ$] {my circle};

链接边的绘制

  • 方法一:
    使用语法 \draw [->] (A.west) -- (B.east) 或者 \draw A .. controls B and C .. D 绘制曲线
    这里需要指明是东南西北哪个位置出发,哪个位置结束
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary {positioning}\begin{document}
\begin{tikzpicture}[place/.style={circle,draw=blue!50,fill=blue!20,thick,inner sep=0pt,minimum size=6mm},transition/.style={rectangle,draw=black!50,fill=black!20,thick,inner sep=0pt,minimum size=4mm}]\node[place] (waiting) {};\node[place] (critical) [below=of waiting] {};\node[place] (semaphore) [below=of critical] {};\node[transition] (leave critical) [right=of critical] {};\node[transition] (enter critical) [left=of critical] {};\draw [->] (enter critical.east) -- (critical.west);\draw [->] (waiting.west) .. controls +(left:5mm) and +(up:5mm).. (enter critical.north);
\end{tikzpicture}
\end{document}

  • 方法二:
    但这太笨了。一个简单的写法是可以省略上述所有的方向,就像下面代码。
    因为 TikZ 会自动聪明地选择合适方向。
\draw [->] (enter critical) -- (critical);
\draw [->] (waiting) .. controls +(left:8mm) and +(up:8mm)
.. (enter critical);
  • 方法三:
    或者尝试新的语法
    使用 \draw [->] A to B 替代 \draw [->] A .. B
    使用 \draw [->] A to [out=B,in=C] D 绘制曲线,即给定 in,out 属性表示离开或进入坐标的弧线的角度。
\draw [->] (enter critical) to (critical);
\draw [->] (waiting) to [out=180,in=90] (enter critical);
  • 方法四:
    使用 [bend left=A] 表示向左/右弯的度数,也可以绘制对应的链接曲线。
\draw [->] (waiting) to [bend right=45] (enter critical);
  • 方法五:
    语法糖,使用 \node A edge B edge C…… 可以绘制点A与点B、C链接的边。
\node[transition] (enter critical) [left=of critical] {}edge [->] (critical)edge [<-,bend left=45] (waiting)edge [->,bend right=45] (semaphore);
  • 综合绘图代码如下,比较推荐使用 edge 语法,比较简单。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary {arrows.meta,positioning}\begin{document}
\begin{tikzpicture}[place/.style={circle,draw=blue!50,fill=blue!20,thick,inner sep=0pt,minimum size=6mm},transition/.style={rectangle,draw=black!50,fill=black!20,thick,inner sep=0pt,minimum size=4mm},bend angle=45,pre/.style={<-,shorten <=1pt,>={Stealth[round]},semithick},post/.style={->,shorten >=1pt,>={Stealth[round]},semithick}]\node[place] (waiting) {};\node[place] (critical) [below=of waiting] {};\node[place] (semaphore) [below=of critical] {};\node[transition] (leave critical) [right=of critical] {}edge [pre] (critical)edge [post,bend right] (waiting)edge [pre, bend left] (semaphore);\node[transition] (enter critical) [left=of critical] {}edge [post] (critical)edge [pre, bend left] (waiting)edge [post,bend right] (semaphore);\end{tikzpicture}
\end{document}

在线边上添加标签

  • [上篇] 我们学了在线的正上/中间/正下 添加信息,使用的是 [sloped, below]
    这里我们的需求是在线的边上添加信息,使用 [auto] 属性即可。
    使用 [swap] 属性会镜像绘制在线的另一侧。见下方代码。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary {arrows.meta,positioning}\begin{document}
\begin{tikzpicture}[place/.style={circle,draw=blue!50,fill=blue!20,thick,inner sep=0pt,minimum size=6mm},transition/.style={rectangle,draw=black!50,fill=black!20,thick,inner sep=0pt,minimum size=4mm},bend angle=45,pre/.style={<-,shorten <=1pt,>={Stealth[round]},semithick},post/.style={->,shorten >=1pt,>={Stealth[round]},semithick}]\node[place] (waiting) {};\node[place] (critical) [below=of waiting] {};\node[place] (semaphore) [below=of critical] {};\node[transition] (leave critical) [right=of critical] {}edge [pre] (critical)edge [post,bend right] node[auto,swap]{2}  (waiting)edge [pre, bend left] (semaphore);\node[transition] (enter critical) [left=of critical] {}edge [post] (critical)edge [pre, bend left]     node[auto]{3}(waiting)edge [post,bend right] node[auto]{4} node[auto,swap]{5} (semaphore);\end{tikzpicture}
\end{document}

绘制蛇形线和多行文本

  • 添加 \usetikzlibrary {decorations.pathmorphing}
    使用 [decoration={snake}] 来添加蛇形线,也可以更改其他的参数,比如 [amplitude, segment length, post length] 等。
  • 多行文本很简单,和 LateX 语法类似,使用 \\ 来换行。
    也可以使用 [text width=3cm] 来让它按文本长度自动分段。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary {decorations.pathmorphing}\begin{document}
\begin{tikzpicture}\draw [->,decorate,decoration={snake,amplitude=.4mm,segment length=2mm,post length=1mm}](0,0) -- (3,0)node [above,align=center,midway]{replacement of\\the \textcolor{red}{capacity}\\by \textcolor{red}{two places}};
\end{tikzpicture}
\end{document}

层图

  • 在画完一个图之后,希望在该图背景后添加某个颜色的背景矩形。
    由于图的大小是动态的,可以选择指定坐标绘制,也可以使用层图
    层图需要导入 backgrounds 库,它使用了 fit 库,都需要导入
  • 添加一个 scope ,指定 [on background layer] 绘制背景层
    在其中使用 [fit = A B C D E] 来适应覆盖这些元素。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary {arrows.meta,backgrounds,fit,positioning}\begin{document}
\begin{tikzpicture}[place/.style={circle,draw=blue!50,fill=blue!20,thick,inner sep=0pt,minimum size=6mm},transition/.style={rectangle,draw=black!50,fill=black!20,thick,inner sep=0pt,minimum size=4mm},bend angle=45,pre/.style={<-,shorten <=1pt,>={Stealth[round]},semithick},post/.style={->,shorten >=1pt,>={Stealth[round]},semithick}]\node[place] (waiting) {};\node[place] (critical) [below=of waiting] {};\node[place] (semaphore) [below=of critical] {};\node[transition] (leave critical) [right=of critical] {}edge [pre] (critical)edge [post,bend right] node[auto,swap] {2} (waiting)edge [pre, bend left] (semaphore);\node[transition] (enter critical) [left=of critical] {}edge [post] (critical)edge [pre, bend left] (waiting)edge [post,bend right] (semaphore);\begin{scope}[on background layer]\node [fill=black!30,fit=(waiting) (critical) (semaphore)(leave critical) (enter critical)] {};\end{scope}\end{tikzpicture}
\end{document}

绘制一个简单的树

  • 比较常用的,使用 \node {} 创建一个根节点
    使用 child {node{}} 创建孩子节点
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary {arrows.meta,backgrounds,fit,positioning}\begin{document}
\begin{tikzpicture}\node {Root}child {  node{A}child {node{B}}child {node{C}}}child {node{D}child {node{E}}};
\end{tikzpicture}
\end{document}

【TikZ 简单学习(下):基础绘制】Latex下的绘图宏包相关推荐

  1. 计算机图形学——OpenGL学习系列之绘制3D下的小桌子

    计算机图形学--OpenGL学习系列之绘制3D下的小桌子 做的一个小练习,主要用到了几何变换还有gl自带的一个绘制立方体的函数,顺便体会一下glPush和glPop的用法.另外,从2D到3D,开心到飞 ...

  2. LaTeX中常见的宏包及其含义

    LaTeX中常见的宏包及其含义 宏包 含义 metalogo 特殊符号和预定义字符串 mflogo 特殊符号和预定义字符串 texnames 特殊符号和预定义字符串 ulem 字体修饰 identfi ...

  3. cesium模型不遮挡点线面_cesium 学习(八) 基础绘制(点线面)

    一.前言 对于一个地图GIS场景,绘制点.线.面属于是基础功能,无论是二维地图还是三维地图场景均是如此,尤其对于三维场景来说比二维应该是更加困难了些. 但是基础的简单绘制不用考虑太多,下面我们开始学习 ...

  4. WinEdt LaTex(三)—— 宏包

    amsmath:最常用的数学宏包 1. bm:bold math 数学字体加粗 \documentclass{article} \usepackage{bm} \begin{document} \[ ...

  5. LaTeX之使用parcolumns宏包实现双栏排版示例

    在LaTeX中实现双栏或多栏排版的方式有好几种,本文只介绍使用parcolumns宏包来实现. 一.环境 Ubuntu 22.04 XeTeX 3.141592653-2.6-0.999993 二.示 ...

  6. JAVA学习:基础入门(下)

    文章目录 7. for循环 8.while循环 9.函数入门 10.函数的形参和实参 11.continue跳出本次循环 12.使用break跳出循环 13.基本类型的数组 14.类与对象 15.引用 ...

  7. 简单学习HTML基础~

    HTML初体验 首先说一下HTML的官方含义,就是超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言.学东西咱们还是要知道自己学 ...

  8. 学习Canvas基础-绘制弧线和曲线

    绘制曲线和弧线的方法 ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise) 用于绘制圆或部分圆. 参数: x-圆弧中心(圆心)的 x 轴 ...

  9. 学习Canvas基础-绘制文字

    方法 font () 描述绘制文字时,当前字体样式的属性 参数: ctx.font = value value: 符合 CSS font 语法的DOMString 字符串.默认字体是 10px san ...

最新文章

  1. paramiko的使用
  2. 关于datagridview自动增加行高度和显示全部内容的设置
  3. Python业务分析实战|共享单车数据挖掘
  4. flask-session 在redis中存储session
  5. oc引导windows蓝屏_人人都会遇到系统蓝屏问题,教大家自已排除蓝屏,学会一辈子受用...
  6. sql server 数据库忘记sa账户密码/ 无管理员账户解决办法
  7. 【POJ - 1050】To the Max (dp)
  8. 饿了么java_eleme-openapi-java-sdk
  9. 计算机怎么取消u盘启动程序,计算机设置U盘自动启动程序| U盘自动播放设置
  10. Java课程设计—— 图书管理系统
  11. 金万维异速联远程接入解决方案
  12. php公众号开发文档,微信公众平台的开发者文档
  13. loadrunner—集合点rendezvous
  14. 程序员必备算法——排列组合
  15. 年终报告:通过3个维度,回看2022全球电商市场的“多样性”
  16. redis常用命令总结(慎入)
  17. 如何从零开始学习软件测试
  18. java 网络摄像头 监控系统_摄像头(WebCam)
  19. 高级办公自动化试题及答案(一)
  20. Unity优化技巧,此时无光胜有光

热门文章

  1. Ubuntu 安装的迅雷下载软件
  2. Curl cookie设置
  3. 《都挺好》苏明哲清华高材生,苏明玉草根创业,程序员引发的思考
  4. ROS(10):mac 下树莓派Raspberry Pi 烧录 img
  5. c语言 测转速程序,用51单片机实现风扇转速测量的源程序+电路图
  6. ExcelWPS通配符的使用方法,一招解决模糊查询!
  7. android 代码布局设置wrap_content,Android布局文件中wrap_content和0dp的区别
  8. 关于uniapp修改内部样式小程序无效的解决方法
  9. java获取当前日期的前N天日期(补充)
  10. ThinkPHP 5.1商城系统,电脑端+手机H5+微商城+小程序+买家端APP+卖家端APP+源码IM客服系统+线下收银系统