第四节 使用 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};
fill=blue!60就可以指定描边颜色,默认为黑色。at (x,y)表示该节点的位置,{}大括号内为该命令的辖域,指示内容。
绘制特殊的 Dropbox 蓝底方格。使用节点工具创建节点,辖域内填写Dropbox。
\node[minimum size=1.8cm,fill=blue!60,text=white] at (-3.5,0.5) {Dropbox};
颜色可以使用标准颜色以及其衍生颜色来指定,其中!后接该颜色向目标颜色的混合权重。目标颜色应当再接一个!指定,这里也就是
blue!60!whitewhite 在此处被省略了。下面的
green!90!black就意味着向黑色靠近。
绘制圆形的 Overleaf。
\node[circle,fill=green!90!black,inner sep=10] at(4,-1) {\textbf{Overleaf}};
定义节点样式。复制[]中的内容,并在开始的部分定义greencirc样式。
\tikzstyle{greencirc} = [circle,fill=green!90!black,inner sep=10];
\node[greencirc] at (4,-1) {\textbf{Overleaf}};
文件样式的 \(\rm \LaTeX\) Project。在左边的样式库中,寻找Style Nodes的子库,双击,将message样式嵌入到当前文档中。之后就可以在Node style中找到该样式,使用这个样式创建节点即可。
\node[message] at (7.5,-1) {\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]
还有两个多行文字框。
\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};
属性 | 描述 |
---|---|
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);
就像之前提到过的一样,也可以将这些参数存储为样式。
\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)
类似地,对最上面的箭头放置倾斜的标签。
\draw[boldarrow] (v4) edge node[above,sloped] {Request$^2$} node[below,sloped] {Receive} (v2);
连接其余的线段,并标注。
\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);
最后一步,绘制折线。使用工具栏中的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};
4.2.4 至此,这个流程图就画完了,可能希望插入到文档中,第一种方式就是内嵌代码,这种方式的优点是可以跟随文件编译,以期获得同样的文档环境参数设置(字体、字号)。
打开File文件选单,选择Save As...另存为,将其存入之前文档的同路径下某处,例如:pic/sync.tex。这时候就可以在文档中使用
\input{pic/sync.tex}
命令编译器在编译时直接将代码片段拼接于此处。不要忘了在导言区引用宏包tikz。
\usepackage{tikz}
可是,整个图形是过大的,需要进入这个文件,对整个tikzpicture域使用全局修饰命令
\begin{tikzpicture}[scale=0.65]但是有些字体却没有被缩小,这时候需要再增加一个命令
\begin{tikzpicture}[scale=0.65,every node/.style={scale=0.65}]
当然还有第二种方式,直接导出为 PDF 后再插入到文档中。使用File选单下的Save Pdf As...另存 PDF 命令将其存入类似的路径下,输入
\includegraphics[scale=0.65]{pic/sync.pdf}
就可以达到类似的效果。