第四节 使用 TikZEdt 绘制 TikZ 矢量图形

状态:文稿准备中

正式出版物中,所有的图形都应当原则上矢量或者高清,甚至其设计语言也应当是统一的(字体、字号、图形样式)。\(\rm \LaTeX\) 也拥有一套自己的图形设计系统,使用嵌入的原生代码,就可以生成一些简洁精巧的图形。

4.1 第一次使用 TikZEdt

都 0202 年了,不能再完全依赖纯代码形式脑补写出个图形了。本节将会使用 TikZEdt 绘制能够嵌入 \(\rm \LaTeX\) 的 TikZ 矢量图形。

4.1.1 前往官网下载 TikZEdt。单击Download边栏会跳转到 Google Code 的相关下载页面,新版本(0.2.3)只有 Windows 版本的,使用 zip 或 msi 格式安装都可以。稍微老一点的版本(0.2.2)拥有 OSX 版本。

解压后,找到这款软件对应的程序文件TikZEdt.exe,可以考虑右键固定到开始屏幕,或者是创建快捷方式,这样你就能很快捷的打开它了。

4.1.2 打开这款软件,第一次打开会出现一个快速入门指南的对话框,点击Try to install packages (MikTeX)(或者是Try to install packages (TeXLive))。然后会弹出一个对话框,询问是否编译缩略图,当然选择是了!

4.1.3 如果错过了也没关系,前者可以在? → Show Tips & Tricks找到,后者可以在Compilation → Compile snippet thumbnails...找到。编译结束后如果显示仍然为空,重启软件即可。

4.2 实例:使用 TikZEdt 制作流程框图

我们将通过一个实例来熟悉这款软件的功能。

sync.tex [预览]
\begin{tikzpicture}

      \makeatletter
      \pgfdeclareshape{document}{
      \inheritsavedanchors[from=rectangle] % this is nearly a rectangle
      \inheritanchorborder[from=rectangle]
      \inheritanchor[from=rectangle]{center}
      \inheritanchor[from=rectangle]{north}
      \inheritanchor[from=rectangle]{south}
      \inheritanchor[from=rectangle]{west}
      \inheritanchor[from=rectangle]{east}
      % ... and possibly more
      \backgroundpath{% this is new
      % store lower right in xa/ya and upper right in xb/yb
      \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
      \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
      % compute corner of ``flipped page''
      \pgf@xc=\pgf@xb \advance\pgf@xc by-5pt % this should be a parameter
      \pgf@yc=\pgf@yb \advance\pgf@yc by-5pt
      % construct main path
      \pgfpathmoveto{\pgfpoint{\pgf@xa}{\pgf@ya}}
      \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgf@yb}}
      \pgfpathlineto{\pgfpoint{\pgf@xc}{\pgf@yb}}
      \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@yc}}
      \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@ya}}
      \pgfpathclose
      % add little corner
      \pgfpathmoveto{\pgfpoint{\pgf@xc}{\pgf@yb}}
      \pgfpathlineto{\pgfpoint{\pgf@xc}{\pgf@yc}}
      \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@yc}}
      \pgfpathlineto{\pgfpoint{\pgf@xc}{\pgf@yc}}
      }
      }
      \tikzstyle{message} = [shape=document, thick, draw=black, minimum width=2cm]
    
\tikzstyle{greencirc} = [circle,fill=green!90!black,inner sep=10];
\tikzstyle{boldarrow} = [<->,line width=1pt];

\node[draw] (v4) at (0,0.5) {Member};
\node[draw] (v1) at (0,-1) {Member};
\node[draw] (v3) at (0,-2.5) {Member};
\node[minimum size=1.8cm,fill=blue!60,text=white] (v6) at (-3.5,0.5) {Dropbox};
\node[greencirc] (v2) at (4,-1) {\textbf{Overleaf}};
\node [message] (v5) at (8.5,-1) {\LaTeX~Project};
\node[text width=2cm,text badly ragged,text centered,draw,minimum size=1cm] (v7) at (-7.5,0.5) {Local Computer};
\node[text width=2cm,text badly ragged,text centered,draw,minimum size=1cm] (v8) at (-7.5,-2) {Second Computer};

\node at (-7.5,-4) {LAN};
\node at (-3.5,-4) {Overseas Server};
\node at (0,-4) {Web Editor};
\node at (4,-4) {Domestic Server};
\node at (8.5,-4) {Cloud};

\draw[boldarrow]  (v1) edge (v2);
\draw [boldarrow] (v3) edge (v2);
\draw [boldarrow] (v4) edge node[above,sloped]{Request$^2$} node[below,sloped]{Receive}(v2);
\draw [boldarrow] (v2) edge node[above] {Sync$^1$}(v5);
\draw [boldarrow]  (v4) edge node[above]{Privilege$^3$}(v6);
\draw [boldarrow] (v6) edge node[above]{Client$^4$}(v7);
\draw [boldarrow] (v7) edge node[left]{LAN$^5$}(v8);

\draw [boldarrow, densely dashed] (v7) -- (-7.5,2.5) -- (8.5,2.5) -- (v5);
\node at (9.5,0) {Upload$^6$};
\node at (-8.5,1.5) {Download};
\end{tikzpicture}

4.2.1 这幅流程图恰恰阐述了上一节的 Overleaf 连接框架:在 Overleaf 平台上同步 \(\rm \LaTeX\) 项目,并通过 Overleaf 平台让用户(Member)提交与接收,有特权(Privilege)的用户可以将项目同步到 Dropbox 上,而 Dropbox 通过客户端(Client)与本地电脑连接。本地电脑可以通过手动上传的方式创建 \(\rm \LaTeX\) 项目,也可以手动下载 \(\rm \LaTeX\) 项目,在局域网(LAN)内可以将项目与第二台电脑同步。

这幅流程图大部分由矩形与圆形组成,实线与虚线箭头并存,下方还有一个小型图例,都是一些基本图形。

4.2.2 node。单击工具栏的Node tool节点工具,在右侧的预览区点击一个点将会自动生成 node 。在 node 花括号所在的辖域内输入这个节点需要输入的文字。在\node命令后使用中括号添加参数,这里我们输入[draw]表示这个节点需要一个轮廓。将这行代码复制三次,每次复制完成后使用工具栏中的Select and move tool移动该节点的位置,让三个节点等距并排放置。

\node[draw] at (-0.5,0.5) {Member};
\node[draw] at (-0.5,-1) {Member};
\node[draw] at (-0.5,-2.5) {Member};
Member Member Member
\node命令代表节点,[]中括号为该节点的样式参数,draw将会设置这个节点的描边,如果向其赋值,比如下面的
fill=blue!60
就可以指定描边颜色,默认为黑色。at (x,y)表示该节点的位置,{}大括号内为该命令的辖域,指示内容。

绘制特殊的 Dropbox 蓝底方格。使用节点工具创建节点,辖域内填写Dropbox

\node[minimum size=1.8cm,fill=blue!60,text=white] at (-3.5,0.5) {Dropbox};
Dropbox
minimum size将会指定该节点的长或宽的最小值,这个值超过字长的时候就可以创建一个正方形边框。fill将会指定该节点的背景填充,text将会指定字体颜色。

颜色可以使用标准颜色以及其衍生颜色来指定,其中!后接该颜色向目标颜色的混合权重。目标颜色应当再接一个!指定,这里也就是

blue!60!white

white 在此处被省略了。下面的
green!90!black
就意味着向黑色靠近。

绘制圆形的 Overleaf。

\node[circle,fill=green!90!black,inner sep=10] at(4,-1) {\textbf{Overleaf}};
Overleaf
circle参数将指定其节点为圆形,inner sep将会定义圆形内边距,(outer sep将会定义圆形外边距)。可以分别按照 HTML 中的 padding 和 margin 去理解。

定义节点样式。复制[]中的内容,并在开始的部分定义greencirc样式。

\tikzstyle{greencirc} = [circle,fill=green!90!black,inner sep=10];

\tikzstyle命令将用于生成 tikz 样式,=为赋值符号,为此样式在[]内赋值。

这样,我们在Node style下拉选单中就可以看到这个样式,点选后,再次使用节点工具创建新的节点时,就会自动套用这个样式。我们现在就可以替换原来的节点参数为这个样式。样式是一种模板,目的是为了生成可复用代码。如果需要清除样式,直接清空Node style文本框即可。
\node[greencirc] at (4,-1) {\textbf{Overleaf}};

文件样式的 \(\rm \LaTeX\) Project。在左边的样式库中,寻找Style Nodes的子库,双击,将message样式嵌入到当前文档中。之后就可以在Node style中找到该样式,使用这个样式创建节点即可。

\node[message] at (7.5,-1) {\LaTeX~Project};
LaTeX Project
message 样式代码
\makeatletter
\pgfdeclareshape{document}{
    \inheritsavedanchors[from=rectangle] % this is nearly a rectangle
    \inheritanchorborder[from=rectangle]
    \inheritanchor[from=rectangle]{center}
    \inheritanchor[from=rectangle]{north}
    \inheritanchor[from=rectangle]{south}
    \inheritanchor[from=rectangle]{west}
    \inheritanchor[from=rectangle]{east}
    %...and possibly more
    \backgroundpath{% this is new
        %store lower right in xa/ya and uppper right in xb/yb
        \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
        \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
        % computer corner of ''flipped page''
        \pgf@xc=\pgf@xb \advance \pgf@xc by-5pt
        % this should be a parameter
        \pgf@yc=\pgf@yb \advance \pgf@yc by-5pt
        % construct main path
        \pgfpathmoveto{\pgfpoint{\pgf@xa}{\pgf@ya}}
        \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgf@yb}}
        \pgfpathlineto{\pgfpoint{\pgf@xc}{\pgf@yb}}
        \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@yc}}
        \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@ya}}
        \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@ya}}
        \pgfpathclose
        % add little corner
        \pgfpathmoveto{\pgfpoint{\pgf@xc}{\pgf@yb}}
        \pgfpathlineto{\pgfpoint{\pgf@xc}{\pgf@yc}}
        \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@yc}}
        \pgfpathlineto{\pgfpoint{\pgf@xc}{\pgf@yc}}
    }
}
\tikzstyle{message} = [shape=document, thick, draw=black, minimum width=2cm]
message的样式首先继承了rectangle的一些属性,用于定义内容的位置。接着定义了一些变量,根据内容长度的不同,边角的\pgf@xc\pgf@yc通过计算得到。接着画路径的时候,和数铣类似地,首先将“钻头”使用\pgfpathmoveto移动到第一个位置,使用\pgfpathlineto将“钻头”线性地移动到下一个位置,最终使用\pgfpathclose闭合路径。右上角的小三角形也是类似的道理。
Content xa xb xc ya yb yc

还有两个多行文字框。

\node[text width=2cm,text badly ragged, text centered, draw, minimum size=1cm] at (-7.5,0.5) {Local Computer};
\node[text width=2cm,text badly ragged, text centered, draw, minimum size=1cm] at (-7.5,-2) {Second Computer};
LocalComputer SecondComputer
与文本有关的节点属性
属性 描述
text width 文本框宽度
text badly ragged 不使用连字符号
text centered 文本居中

在右方预览框内可以使用框选的方式选取节点,批量地移动。其余的文本节点按照基本的语法就可以完成了。

\node at (-7.5,-4) {LAN};
\node at (-3.5,-4) {Overseas Server};
\node at (0,-4) {Web Editor};
\node at (4,-4) {Domestic Server};
\node at (8.5,-4) {Cloud};

4.2.3 edge。节点创建结束后,使用线段来连接节点。

使用双向箭头连接 Member 和 Overleaf。使用工具栏的Edge tool线段工具,依次点击两个节点,就会出现线条连接,此时上面的节点由于需要引用,被自动赋予了名称v1,v2。给线段赋予一些参数,使得其成为双向箭头。

\draw[<->,line width=1pt] (v1) edge (v2);
Member Overleaf
\draw命令代表线条连接,edge用于指示左右两者之间的连接是线段关系。参数<->用于指示该连接为双向箭头,line width用于指示线段粗细。

就像之前提到过的一样,也可以将这些参数存储为样式。

\tikzstyle{boldarrow}=[<->,line width=1pt];
\draw[boldarrow] (v1) edge (v2);
之后就可以在Edge style中选择boldarrow样式完成剩余几个双向箭头的绘制了。

对箭头标注。在 Overleaf 节点和 \(\rm \LaTeX\) Project 节点之间的双向箭头上标注Sync^1,需要在edge命令后附加node节点。

\draw[boldarrow] (v2) edge node[above] {Sync$^1$} (v5)
Overleaf LaTeX Project Sync 1
edge命令插入node命令将用于对线段居中标注,[above]命令将会将标注放在线段之上,[below]将会放在线段之下。在node的辖域内输入$ $将用于插入行内公式,^{上标}将会插入上标,当上标仅为一个字符时,大括号可以省略;类似地,_{下标}用于插入下标。

类似地,对最上面的箭头放置倾斜的标签。

\draw[boldarrow] (v4) edge node[above,sloped] {Request$^2$} node[below,sloped] {Receive} (v2);
Member Overleaf Request 2 Receive
当需要放置多个节点时,直接并列添加即可。sloped表示跟随线段的倾斜程度倾斜,该参数也可以在Edge Labels样式库里找到。

连接其余的线段,并标注。

\draw [boldarrow] (v4) edge node[above] {Privilege$^3$} (v6);
\draw [boldarrow] (v6) edge node[above] {Client$^4$} (v7);
\draw [boldarrow] (v7) edge node[left] {LAN$^5$} (v8);
LocalComputer SecondComputer LAN 5 Dropbox Client 4 Member Privilege 3
当箭头是纵向的时候,应当使用[left][right]方位。

最后一步,绘制折线。使用工具栏中的Path tool路径工具,构造折线路径,依次点击路径上的节点。然后使用 node 工具创建标注。

\draw [boldarrow, densely dashed] (v7) -- (-7.5,2.5) -- (8.5,2.5) -- (v5);
\node at (9.5,0) {Upload$^6$};
\node at (-8.5,1.5) {Download};
LocalComputer LaTeX Project Download Upload 6
--用于折线依次连接节点,densely dashed是线条的一种样式,密集虚线,更多的样式可以在Line Styles样式库中找到。

4.2.4 至此,这个流程图就画完了,可能希望插入到文档中,第一种方式就是内嵌代码,这种方式的优点是可以跟随文件编译,以期获得同样的文档环境参数设置(字体、字号)。

打开File文件选单,选择Save As...另存为,将其存入之前文档的同路径下某处,例如:pic/sync.tex。这时候就可以在文档中使用

\input{pic/sync.tex}

\input命令用于插入代码。

命令编译器在编译时直接将代码片段拼接于此处。不要忘了在导言区引用宏包tikz

\usepackage{tikz}

可是,整个图形是过大的,需要进入这个文件,对整个tikzpicture域使用全局修饰命令

\begin{tikzpicture}[scale=0.65]
但是有些字体却没有被缩小,这时候需要再增加一个命令
\begin{tikzpicture}[scale=0.65,every node/.style={scale=0.65}]

scale将会指定缩放,every node/.style顾名思义,将会首先对每个节点赋予样式,这里赋予了缩放。

当然还有第二种方式,直接导出为 PDF 后再插入到文档中。使用File选单下的Save Pdf As...另存 PDF 命令将其存入类似的路径下,输入

\includegraphics[scale=0.65]{pic/sync.pdf}

\includegraphics用于插入各种类型的图片(不仅仅是 PDF),这里使用了缩放参数scale

就可以达到类似的效果。