SAST weekly 是由电子工程系学生科协推出的科技系列推送,内容涵盖信息领域技术科普、研究前沿热点介绍、科技新闻跟进探索等多个方面,帮助同学们增长姿势,开拓眼界,每周更新,欢迎关注!欢迎愿意分享知识的同学投稿至 eesast@mail.tsinghua.edu.cn , 期待你的作品!
TikZ是什么?TikZ ist kein Zeichenprogramm(TikZ不是一个绘图程序)是TikZ的递归式缩写。PGF/TikZ是一对画矢量图的语言,也是LaTeX的一个宏包,理论上能绘制任何能精确表示的矢量图,它的作者也是beamer的作者。其中PGF指Portable Graphics Format(类似于PDF),而TikZ是基于之的一套前端。
然而它的文档现在有一千三百多页……笔者实在也不怎么会用它,只能抛砖引玉,做一些粗略的介绍。
先来看一些例子来获取一些直观的印象吧。它有多么强大?
可以有几何图形
也可以有mindmap
还可以画电路图
限于篇幅就不放更多例子了。以上这些例子都来源于http://www.texample.net,其中有许许多多的分好类的例子及源代码。大家想必都很有利用开源代码(复制粘贴修改)的经验,现在就可以假装自己学会这个强大的工具了。
当然分割线之下还是要稍微介绍一下基本操作的。
这是文档里的第一个例子,实现了如右的效果。
先导入tikz宏包,然后begin一个tikzpicture,就可以开始通过坐标draw出折线了(坐标可以继续接以绘制一条路径,如\tikz \draw (-1.5,0) -- (1.5,0) -- (0,-1.5) -- (0,1.5);)。(也可以通过\tkiz在tikzpicture环境之外单独地draw,例如\tikz \draw (0,-1.5) -- (0,1.5);)。另外,可以在\draw后接方括号调整基本的属性,如\draw[rounded corners=8pt]还可以把折角变为圆角。具体的其它属性可以自行翻阅文档或查看好看的例子。
学会了画折线,怎么画曲线呢?
TikZ有个诡异的通过控制点画曲线的方法。
上面这个例子中,\draw (0,0) .. controls (1,1) and (2,1) .. (2,0); 这一条语句实现了画出图中曲线的功能。这其中的逻辑是这样的:从(0,0)出发,切线方向指向(1,1),终点(2,0),终点处切线指向(2,1)。
通过..可以连接多个这样的控制语句。
例如如下语句画出了圆……可以自行验证。
\draw (-1,0) .. controls (-1,0.555) and (-0.555,1)
.. (0,1).. controls (0.555,1) and (1,0.555) .. (1,0);
从数学上来说,通过这样的方式还是能画出绝大多数的代数曲线的。
代数曲线也可以用to来绘制,例如如下的语句是从(0,0)到(2,1.5)的一条曲线,其中起点出发时切线角度90°,终点结束时是195°的切线。
\draw (0,0) to [out=90,in=195] (2,1.5);
但是我们为啥不用\draw (0,0) circle [radius=10pt];直接画圆呢?circle还可以换成rectangle,ellipse,这样就能画出很多基本图形了。另外地,我们可以用plot来绘制函数图像。
用如上方式理论上就能画出几乎所有矢量图了。
此外还有诸如text、image、pattern等基本功能大家也可以自行探索。
道理上来说,熟练掌握Matlab/Mathematica的你可以写一段代码描点了。当然大部分事情并没有这么复杂。总结一下,我们学习了画折线(使用--),画曲线(.. controls或者to),调整图像属性(使用方括号[]),以及很多基本图像与函数的绘制方法。
Matlab、Matplotlib和GeoGebra这些优秀的软件甚至可以直接生成TikZ代码,例如:
https://github.com/matlab2tikz/matlab2tikz
https://pypi.org/project/matplotlib2tikz/
https://github.com/nschloe/tikzplotlib
这大大简化了代码的复杂程度。至于为什么要把图导出成TikZ代码,笔者认为矢量图实在是好文明……
只使用本文中介绍到的功能是大大浪费了这个宏包的,而要面面俱到实在是不可能的任务。
不过放着这么详细的文档不看实在是一种浪费。
http://mirrors.ustc.edu.cn/CTAN/graphics/pgf/base/doc/pgfmanual.pdf
上述链接即是优秀的文档,看着这么详细的目录,几乎你想要画的东西都有详细的说明与demo。使用别人造好的轮子,你可以轻松画出各种好看的图。
它有哪些库?我们看看wiki上的介绍:
实在是有很多功能强大的库,笔者就是看着别人画的漂亮的自动机了解到的这个工具。
不试试在数算的书面作业中用用它么?
或者用它画一画电路图?笔者也不知道啥时候需要用它来画电路图……反正好看就是了。这里可以看见,我们在环境中可以引入很多属性,以绘制指定规范的电路图。另外,笔者踩了一个坑……circuitikz和tikz这两个宏包还是不要混用的为妙。
当然如果你觉得这个文档太长了(反正笔者是这么觉得的),这里有一个非常简短的入门教程:
https://cremeronline.com/LaTeX/minimaltikz.pdf
另外,https://github.com/xiaohanyu/awesome-tikz上列出了极其详尽的学习资源,包括视频、文档等资源。(反正看不完)
反正面向搜索引擎和例子干就是了。
说点题外话,转载一个研究。
划重点:We show that LaTeX users were slower than Word users, wrote less text in the same amount of time, and produced more typesetting, orthographical, grammatical, and formatting errors. On most measures, expert LaTeX users performed even worse than novice Word users. LaTeX users, however, more often report enjoying using their respective software.
写了这些内容之后,笔者觉着这玩意儿的确很难用……写起来效率实在不高。但是enjoy就完事了,毕竟画出好看而专业的图实在是一件很快乐的事。笔者自己也好像已经有一段时间没有用过LaTeX了,它自有它自己的应用场景。了解了这个工具,说不定什么时候就排上用场了呢2333
总之TikZ画万物。
参考资料:
https://cremeronline.com/LaTeX/minimaltikz.pdf
http://mirrors.ustc.edu.cn/CTAN/graphics/pgf/base/doc/pgfmanual.pdf
http://www.texample.net
https://en.wikipedia.org/wiki/PGF/TikZ
撰稿人:马啸阳
审稿人:孙志尧