LaTeX绘图利器TikZ:从环境配置到实战案例详解
发布时间:2026/9/9 17:33:22来源:尧图网络
前阵子有个朋友从 Word 转到 LaTeX排版、公式、参考文献都玩得很顺结果一遇到插图就卡住了。他的第一反应是用 Visio 画好再贴进去折腾了一下午图是放进去了可字体跟正文完全不搭缩放还糊。我跟他说你缺的不是画图软件是 TikZ。TikZ 是 LaTeX 生态里最成熟的矢量绘图方案不需要任何外部软件直接像写代码一样描述图形输出的是跟正文同一套字体、同一个渲染引擎的矢量图放大多少倍都清晰。这篇东西适合所有想摆脱截图贴图模式的 LaTeX 用户也适合刚入门听说 TikZ 但不知道怎么下手的读者。我会从环境准备讲到核心绘图逻辑再给几个可以直接抄的实战例子最后把我在使用过程中踩过的坑一并倒出来。1. 画图这件事为什么是 TikZ 而不是 PPT 截图先说结论如果你只是偶尔画一张示意图PPT 截图确实够用成本最低。但当你需要画函数图像、流程图、几何证明图、数据结构图而且这些图需要跟着正文一起改、一起编译、保持字符风格统一的时候TikZ 的优势就是碾压级的。1.1 TikZ 到底是个什么东西TikZ 是 Till Tantau 开发的 LaTeX 宏包全称是TikZ ist kein Zeichenprogramm德语意思是TikZ 不是画图程序。这个名字有点自嘲因为它本质上就是一个 用代码描述图形 的语言。你在导言区写\usepackage{tikz}然后在正文里写\begin{tikzpicture} \draw (0,0) -- (3,2); \end{tikzpicture}编译出来就是一条从 (0,0) 到 (3,2) 的直线。就这么简单。所有图形都由点、线、多边形、圆、曲线这些基础几何元素组成你可以精确控制它们的位置、颜色、线宽、填充方式。和 Word/Visio/PPT 的最大区别在于TikZ 图是 文本化 的它跟你的 LaTeX 文档一起编译输出的矢量图形用的是当前文档的字体和字号这意味着图里的文字和正文天然一致不需要手动调字体。而且因为是代码你可以用变量、循环、条件判断来画图——这是任何所见即所得工具都做不到的。1.2 谁适合学 TikZ谁可以先不学说实话TikZ 的学习曲线并不平缓一开始会劝退一些人。我的建议是如果你属于以下三类人非常值得投入时间经常写数学、物理、计算机类文档需要大量公式配图论文/报告里有统一的插图风格要求希望图例和正文排版一致需要批量生成结构相似但有微小变化的图比如不同参数的曲线族。反过来如果你只是偶尔画个架构图做一次 PPT那没必要专门学 TikZ。用 PPT 或者 draw.io 画完导出 PDF 嵌入 LaTeX 会更效率。但无论如何作为一个 LaTeX 用户你至少要懂 TikZ 的基本语法因为很多宏包比如 pgfplots、circuitikz、tikz-cd都是建立在 TikZ 之上的。你不需要成为 TikZ 专家但掌握基础会让你在 LaTeX 的世界里自由很多。2. 画图前的环境底子发行版、编辑器与一条命令看懂编译流程TikZ 不是一个独立软件它寄生在 LaTeX 生态里所以环境准备其实就是 LaTeX 环境准备。但这里有个很多新手忽略的点TikZ 对编译方式有隐性要求。2.1 发行版选择TeX Live 还是 MiKTeXWindows 上最主流的两个 LaTeX 发行版是 TeX Live 和 MiKTeX。我的建议简单粗暴直接装 TeX Live。原因有三TeX Live 默认包含几乎所有常用宏包包括 TikZ 及其相关宏包离线也能用MiKTeX 是按需安装宏包的类型遇到缺包时它会弹窗提示联网下载看着方便但如果网络不好或者宏包依赖关系复杂容易被卡住很多高校和出版社的模板都假设你用的是 TeX Live出问题的时候网上搜到的解决方案大多基于这个环境。TeX Live 安装比较慢完整版几个 GB但你可以选择 scheme-small 加上 ctex 等常用宏包或者直接装完整版一步到位。装完之后在命令行里验证一下tex --version xelatex --version能看到版本号就说明装好了。2.2 VSCode LaTeX Workshop至少能少走一半弯路编辑器我推荐 VSCode配合 LaTeX Workshop 插件。虽然你也可以用 TeXstudio、Overleaf 这些但 VSCode 的好处是编辑器本身轻量插件生态丰富而且配置文件可视化程度高出了问题容易排查。装完 LaTeX Workshop 之后VSCode 其实还在用命令行工具链编译你的文档只是帮你封装了。关键配置在这{ latex-workshop.latex.recipes: [ { name: xelatex, tools: [xelatex] }, { name: latexmk, tools: [latexmk] } ], latex-workshop.latex.tools: [ { name: xelatex, command: xelatex, args: [ -synctex1, -interactionnonstopmode, -file-line-error, %DOC% ] } ] }这里有个很重要的点如果你文档里有中文需要用到 ctex 宏包或者 xeCJK那必须用 xelatex 编译而不是默认的 pdflatex。pdflatex 对中文支持很差会出现乱码或报错。LaTeX Workshop 的默认 recipe 可能不是 xelatex所以最好手动配置成上面那样。2.3 一条命令的编译之旅发生了什么很多新手对 LaTeX 编译流程有恐惧感觉得报错信息看不懂。其实编译过程没那么玄乎拿 xelatex 举例子你执行xelatex main.tex它会经历这些阶段词法语法分析读入 .tex 文件解析命令和参数宏展开把所有 \usepackage、\newcommand 定义的宏展开成底层指令排版按 LaTeX 的排版算法把文本和图形排到页面上DVI/PDF 输出直接输出 PDFxelatex 直接产 PDF中间不经过 DVI。如果你用了 TikZ在第 3 步排版阶段TikZ 代码会被转换成 PDF 绘图指令。这意味着 TikZ 图的每条线、每个节点最后都变成 PDF 内部的矢量对象。常见的一个坑是第一次编译经常报undefined references或者Label(s) may have changed. Rerun这不是错误而是 LaTeX 需要二次编译来解析交叉引用。所以遇到这种情况再编译一遍就好了。VSCode 的 LaTeX Workshop 默认会自动编译多次用它可以少操心这个。2.4 从表格和公式说起为什么它们也是 TikZ 的邻居在进入 TikZ 之前有必要提醒一件很多人一开始忽略的事TikZ 画出的图里经常要写文字写数学公式甚至在某些场景下要你手动画出类似表格的网格。所以表格和数学公式的基本功是绕不开的。比如latex 排版表格如何设置列宽及水平和垂直对齐方式这个问题。LaTeX 表格里水平对齐方式由列格式指定l左对齐、c居中、r右对齐。要设置列宽用p{3cm}表示这个列是 3 厘米宽的段落列默认顶部对齐。如果想垂直居中可以引入array宏包用m{3cm}或b{3cm}分别对应垂直居中和底部对齐\usepackage{array} \begin{tabular}{|p{3cm}|m{4cm}|b{2cm}|} \hline 顶部对齐 垂直居中 底部对齐 \\ \hline \end{tabular}再比如latex 大括号怎么打——文本模式下直接\{和\}公式模式下用\left\{和\right\}让大括号随内容自动缩放\[ f(x)\left\{ \begin{array}{ll} x, x 0 \\ 0, x 0 \\ -x, x 0 \end{array} \right. \]还有latex 求导怎么打——\frac{dy}{dx}或者偏导\frac{\partial f}{\partial x}。下角标就是x_1上角标是x^2如果角标本身比较长就加花括号比如x_{i,j}。这些基础之所以重要是因为到了 TikZ 里你会发现标签文字、节点文本照样用数学模式那一套。只不过在 TikZ 里你经常要在节点里同时放文字和公式弄懂这些语法才能顺畅地写出你想要的标注。高亮文本也很常用\usepackage{soul}之后用\hl{...}就能画高亮背景这在之后做标注时同样用得上。3. TikZ 绘图的三大地基坐标、路径与 node我接触 TikZ 的过程经历了三次顿悟第一次搞懂坐标系统第二次搞懂路径和node的关系第三次搞懂样式管理。这三点是 TikZ 的骨架任何复杂图都是在这三层之上堆出来的。3.1 坐标系所有的一起都由点开始TikZ 的默认坐标系是直角坐标系原点在图的左下角附近准确说是你画的第一个元素的边界。\draw (1,2) -- (3,4);表示从点 (1,2) 到点 (3,4) 画一条线。这里有几个容易搞混的点单位默认是厘米(1,0)就是向右 1cm(0,1)向上 1cm也支持极坐标语法是(角度:半径)比如(30:2)表示从原点出发、与 x 轴成 30 度角、距离 2cm 的点坐标可以是相对坐标在坐标前面加表示相对于上一个点的增量比如\draw (0,0) -- (1,0) -- (0,1);会画一条先向右 1cm 再向上 1cm 的折线更常见的相对写法是不带增量记忆区别在于会更新当前点不会。这在画多边形时特别有用。如果想要自定义坐标系比如以某个点为原点、坐标轴方向和长度都改掉可以用shift、xscale、yscale这些参数。但绝大多数情况下默认坐标系够用了。有个小技巧如果你要画以某个点为中心的多个元素可以用\begin{scope}[shift{(2,1)}]把画布原点平移过去在这个 scope 内部所有坐标都是相对新原点的。这种局部坐标系移植的方法非常常用比如画多个位置相同的结构图。3.2 路径TikZ 画图的最小叙事单元TikZ 的核心概念是路径path。一条路径由一个起点、若干中间点和连接方式组成。最常用的命令是\draw\draw (0,0) -- (2,1); % 直线 \draw (0,0) rectangle (2,2); % 矩形对角点 \draw (0,0) circle [radius1]; % 圆 \draw (0,0) ellipse [x radius2, y radius1]; % 椭圆 \draw (0,0) to [bend right] (3,0); % 弯曲的曲线 \draw (0,0) -- (1,1) -- (2,0) -- cycle; % 闭合三角--表示直线连接cycle表示回到起点从而封闭路径。这些语法不需要刻意背用到哪个查哪个多用几次自然记住。路径的修饰选项放在方括号里比如\draw[-, thick, red] (0,0) -- (2,0); \draw[dashed, blue] (0,0) -- (2,1); \draw[very thick, rounded corners] (0,0) -- (1,1) -- (3,0);箭头、虚线、粗线、圆角连接这些都是 TikZ 的原生能力。线宽可以指定为ultra thin、thin、semithick、thick、very thick、ultra thick比 Word 里的几个预设精细得多。填充是另一个高频操作\fill[red] (0,0) circle [radius1];会画一个红色实心圆\draw[fillyellow] (0,0) rectangle (2,1);画带边框的填充矩形。如果你需要画半透明填充可以加opacity0.5这样的选项。还有一类比较进阶但很实用的路径平滑曲线。TikZ 里可以通过to加选项控制曲线的弯曲方向和力度也可以直接用plot命令画函数曲线后者我会在实战部分细说。3.3 node让图开口说话的关键纯线的图意义有限真正让图有信息量的是文字标注这就轮到node出场。node可以理解为路径上一个挂文字标签的点或区域\draw (0,0) -- (2,0) node[midway, above] {$x$};midway表示路径中点above表示标签在路径上方。$x$启用了数学模式可以显示斜体的变量 x。node也可以在路径结束后跟坐标指定比如\node[circle, drawblack, fillblue!20, inner sep2pt] (A) at (1,2) {$A$};这句创建了一个名为 A 的节点位置在 (1,2)圆形边框黑色边框线填充蓝色且节点内部有少量留白文字是数学模式下的 A。节点命名之后你可以用(A)作为新坐标来画线或放其他节点这是做流程图、示意图的核心机制。node还有很多常用选项above或below控制文字相对节点中心的位置偏移也可以精确指定above5ptaligncenter让节点里的多行文字居中text width3cm设置文字换行宽度font\small调整字号。节点有两个容易踩的坑node的inner sep默认会随着文字内容增大而增大导致图形比预期大。你想要紧凑的框时记得设置inner sep1pt或inner sep0pt用\node at (x,y)和用\draw (x,y) node{}在纯语法上等价但前者更清晰推荐优先用\node命令代码可读性好很多。3.4 样式管理别等图多了再来后悔单个 TikZ 图还算好管图一多你就发现每个图都重写一遍颜色、线宽、节点样式效率太低。TikZ 提供了\tikzset命令来定义全局样式\tikzset{ myshape/.style{drawblue, thick, fillblue!10, rounded corners}, myarrow/.style{-{Stealth[length3mm]}, thick} }然后你可以在图里直接用\begin{tikzpicture} \draw[myarrow] (0,0) -- (2,0); \node[myshape] (A) at (0,1) {A}; \end{tikzpicture}这样做的好处是改样式只需要改一处所有图统一更新。比如期刊要求插图线宽改细你只要改\tikzset里的thick为semithick全文所有图都跟着变了。scope环境也承担类似的职责它可以把一组绘制命令圈定在一个局部范围内并给这个范围统一应用选项。需要注意scope内设置的选项不会影响外部作用域隔离很清晰。4. 四个实战案例从函数图像到流程图再到几何图形理论说得再多不如直接上几个能跑通的例子。每个例子我都尽量给出完整代码你可以复制到自己的 LaTeX 文档里试改改参数看效果。4.1 二次函数图像坐标轴、曲线与标注TikZ 自带的plot命令可以画函数曲线但更专业的做法是用pgfplots宏包。pgfplots 是建立在 TikZ 之上的数据可视化宏包专门用来画坐标图。在导言区写上\usepackage{pgfplots}和\pgfplotsset{compat1.18}版本号按你装的来然后写\begin{tikzpicture} \begin{axis}[ axis linesmiddle, xlabel{$x$}, ylabel{$y$}, xmin-3, xmax3, ymin-1, ymax10, xtick{-2,-1,1,2}, ytick{2,4,6,8}, gridboth, width8cm, height6cm, samples50 ] \addplot[blue, thick] {x^2}; \addlegendentry{$yx^2$} \end{axis} \end{tikzpicture}axis环境会创建一套坐标轴\addplot把函数或数据点画进去。samples50是采样的点数太少曲线会不够平滑太多编译变慢一般 50~100 就够。如果你不想引入 pgfplots也可以用 TikZ 的原始方式画轴和曲线\begin{tikzpicture}[scale0.8] \draw[-] (-3,0) -- (3,0) node[right] {$x$}; \draw[-] (0,-1) -- (0,10) node[above] {$y$}; \draw[domain-2.5:2.5, blue, thick] plot (\x, {\x*\x}); \end{tikzpicture}注意这里\x是 plot 的变量{\x*\x}在花括号里写表达式。中文文档里大家经常问latex 图后面加说明一般就是在 figure 环境里用\caption{...}但如果你想在图的内部靠近函数曲线的地方加说明文字用\node加在相应坐标即可。4.2 流程图node 的排列之道流程图是 TikZ 最经典的场景之一。核心思路先用\node定义每个框再用箭头把它们连起来。\begin{tikzpicture}[ box/.style{rectangle, drawblack, fillblue!10, minimum width2.5cm, minimum height1cm, aligncenter}, arrow/.style{-, thick} ] \node[box] (start) {开始}; \node[box] (process) [below1.2cm of start] {处理数据}; \node[box, diamond] (decide) [below1.2cm of process] {满足条件}; \node[box] (end) [below1.2cm of decide] {结束}; \draw[arrow] (start) -- (process); \draw[arrow] (process) -- (decide); \draw[arrow] (decide) -- node[right] {是} (end); \draw[arrow] (decide.west) -- (-2,0) |- (process.west); \end{tikzpicture}这里的[below1.2cm of start]是使用positioning库的语法如果你想要节点的相对位置是在某个节点下方多少厘米必须在导言区\usetikzlibrary{positioning}。这个库强烈建议安装因为你没法保证手动坐标算得很准相对定位能省下大量坐标计算。decide.west这种写法是节点的锚点TikZ 的每个节点有 east、west、north、south、north east 等锚点画线时可以精确地从某个锚点出发。|-是直角连线语法先竖着走到目标 x 坐标再水平走到目标 y 坐标或者是-|顺序反过来。这种框箭头的流程图画出来只要稍微调调样式就会非常专业不比 Visio 差而且改起来极其方便。4.3 几何图形画三角形、圆和角标记数学文档里经常要画几何图形。TikZ 对这种需求支持非常到位。比如画一个带直角标记的三角形\begin{tikzpicture}[scale1.2] \coordinate (A) at (0,0); \coordinate (B) at (4,0); \coordinate (C) at (4,3); \draw[thick] (A) -- (B) -- (C) -- cycle; \draw[fillblue!10] (B) rectangle (-0.3,0.3); % 直角标记 \node[left] at (A) {$A$}; \node[below] at (B) {$B$}; \node[above] at (C) {$C$}; \end{tikzpicture}\coordinate只是定义一个点不画任何内容适合用来保存关键坐标。直角标记的原理很简单在 B 点向左再向上画一个 0.3cm 的小矩形。如果你想要标记角度可以引入angles库和quotes库然后写\usetikzlibrary{angles, quotes} \begin{tikzpicture} \coordinate (A) at (0,0); \coordinate (B) at (3,0); \coordinate (C) at (1,2); \draw (A) -- (B) -- (C) -- cycle; \pic[draw, $\theta$, angle eccentricity1.5] {angle B--A--C}; \end{tikzpicture}\pic是 TikZ 里处理常见小图形的便捷工具angle标记会自动计算弧线位置和角度angle eccentricity控制标注离角的距离。这个功能在几何证明文档里几乎是刚需。4.4 数据结构的链表节点图循环与坐标计算TikZ 厉害的地方在于它是编程式绘图的展示这个特点最好的例子就是画数据结构图。比如画一个单链表每个节点由两个框组成数据域和指针域。\begin{tikzpicture}[ box/.style{draw, minimum height0.8cm, minimum width1.2cm}, ptr/.style{draw, minimum height0.8cm, minimum width0.6cm} ] \foreach \i in {0,1,2,3} { \node[box] (d\i) at (\i*2, 0) {$\i$}; \node[ptr] (p\i) at (\i*21.2, 0) {}; \draw (d\i) -- (p\i); \ifnum\i3 \draw[-] (p\i.east) -- (0.3,0); \fi } \end{tikzpicture}\foreach是 TikZ 自带的循环语法\i从 0 到 3 循环每次生成一个数据节点和一个指针节点。\ifnum\i3是 TeX 的数值条件判断在最后一个节点后面不加箭头。用这种方式画链表、树、队列都极其高效而且参数一改就能生成不同长度的结构。这几个例子覆盖了 TikZ 最常见的用途。学会之后你会发现凡是有规律可循的图用 TikZ 画反而是最省力的。5. 踩坑复盘中文、性能、样式复用的真实体验每个用过 TikZ 一段时间的人手上肯定都有几条血泪经验。我这里挑几条最典型的分享一下全是自己折腾出来的教训。5.1 中文标注的三座大山字体、编码、编译引擎TikZ 图里直接写中文最容易出的问题就是乱码或者干脆编译不过。根因在于TikZ 节点里的文字最终仍然要交给 LaTeX 排版引擎处理而默认的 pdflatex 引擎不认识中文字符。解决办法有三条路径路径一推荐用 xelatex 编译配合\usepackage[UTF8]{ctex}或\usepackage{xeCJK}。xelatex 原生支持 UTF-8 和系统字体TikZ 节点里写中文就会正常路径二用\node的文字用\begin{CJK}{UTF8}{gbsn}...\end{CJK}适用于老的 CJK 宏包方案但现在基本不用了路径三所有中文标注都不用改用英文或者拼音简单粗暴但体验打折扣。最常见的问题是把 fontspec 和 ctex 混用导致的中文字体冲突。比如你写\usepackage{fontspec}然后又从 ctex 里配置字体一旦没配置对xelatex 会报The font ... cannot be found。解决办法是如果你用 ctex 宏包中文相关的字体设置都交给它不要自己再\setmainfont里面指定中文字体除非你清楚 fontspec 的 fallback 机制。还有一个小坑TikZ 节点文字里如果包含%、这类特殊字符需要转义。%要写成\%要写成\。这个和普通 LaTeX 文档的规则一样但很多人画图时容易忘导致编译报奇怪的错误。5.2 复杂图的性能为什么我的文档编译越来越慢TikZ 的每一次\draw都是在排版引擎里生成一条绘图指令图多了以后编译时间会显著上升。尤其是用了大量循环、阴影、透明效果、复杂填充的图编译时间可能从几秒飙到几十秒甚至几分钟。几个实用的优化习惯把 TikZ 图代码单独抽到.tex子文件里用\input{filename}引入改的时候只编译子文件如果图不经常变可以把生成的 PDF 单独编译一次然后作为普通图片\includegraphics插入避免每次全文档编译时重画减少不必要的透明效果opacity和blend mode会让 PDF 渲染变慢循环里如果只是用\node放文字不要为每个节点重设相同的样式建议在\tikzset里定义好循环里只写\node[box]。另外如果你在 Overleaf 上写文档TikZ 图太多有时候会因为编译超时挂掉。这种情况下我会把图先单独编译成 PDF 传上去再作为图片插入既省时间又稳定。5.3 图片转 TikZ 的偷懒思路有人问过我我有一张别人画的图怎么转成 TikZ 代码如果是最简单的几何图或许手画一遍比转换更快。但对于一些相对规整的图比如流程图、示意图你可以用 Inkscape 等软件先把图画好再用svg2tikz插件导出 TikZ 代码。这个插件能把 SVG 里的路径、文字、颜色转换成对应的 TikZ 命令省掉不少手写量。不过导出的代码通常比较啰嗦不像人写的那么简洁而且可能带出很多你不需要的样式定义。我的习惯是用导出代码作为初稿然后手动精简、重新组织坐标和样式。这样既省时间又保持了代码的可读性和可维护性。5.4 从单图到样式库让你的图形成体系最后分享一个工作流上的建议。刚开始用 TikZ 的时候大家都是每次从零画代码都是自己品出来的。等你画了几十张图之后你就发现很多样式是重复的流程图框、坐标轴箭头、节点标注风格。这时就该把这些公共样式抽到一个单独的文件里比如mystyles.tex\tikzset{ flowbox/.style{ rectangle, draw, rounded corners, minimum width2.5cm, minimum height1cm, aligncenter }, arrow/.style{-{Stealth[length3mm]}, thick}, axistyle/.style{-, thick, black} }文档开头只需要\input{mystyles.tex}所有图共享同一套样式。遇到需要微调的图在局部scope里改不影响全局。这样做的好处不只是代码整洁更重要的是你的论文/书稿里所有图从视觉上是统一的不会有明显的手绘感差异。6. 从编辑器命令到成图VSCode 配置细节与常见报错排查如果你用 VSCode 写 LaTeX编译 TikZ 图和编译普通 LaTeX 文档没有本质区别但有一些细节值得注意能减少大量无谓的排查时间。6.1 LaTeX Workshop 的 recipe 与 tool 概念LaTeX Workshop 里有两个核心概念tools定义怎么执行一个命令recipes定义编译一个文档时按什么顺序执行哪些命令。上面我已经给过一个基础配置但如果你要用 bibtex 或者 makeindex就得配置多步 recipe。比如经典的xelatex - bibtex - xelatex - xelatex四连编译{ latex-workshop.latex.recipes: [ { name: xelatex - bibtex - xelatex - xelatex, tools: [ xelatex, bibtex, xelatex, xelatex ] } ], latex-workshop.latex.tools: [ { name: xelatex, command: xelatex, args: [-synctex1, -interactionnonstopmode, -file-line-error, %DOC%] }, { name: bibtex, command: bibtex, args: [%DOCFILE%] } ] }加了 bibtex 的 recipe 之后参考文献也能自动化编译。TikZ 本身不依赖 bibtex但很多包含 TikZ 图的长文档会同时包含参考文献所以这个配置值得一次到位。6.2 常见报错信息和对策! Package tikz Error: Sorry, some package has replaced the TikZ library...一般是某个宏包和 TikZ 库冲突最常见的冲突来源是tkz-euclide和tkz-graph这类基于 TikZ 的老宏包版本不兼容。解决办法是把旧宏包更新到最新版或者移除冲突包。! Undefined control sequence. \tikz...这个错出现在你使用了一个没引入的库比如用了positioning库的语法却没\usetikzlibrary{positioning}。看到这种错先检查库是否引入。! Dimension too largeTikZ 内部某个数值超出了 TeX 的浮点数范围通常是因为坐标过大或者用了极小的线宽导致计算溢出。解决办法是缩小坐标范围或者调整scale让坐标落在合理区间。! Paragraph ended before \tikzpar was complete某个\node的花括号没闭合或者文字内容里出现了空行。TikZ 节点内文字不允许出现空行检查一下有没有多余的回车。遇到报错时我最常做的是用二分法定位错误把大图分成若干小段逐段注释找到出错的那一段再细看。这个方法虽然原始但在 TikZ 这种高度依赖语法的工具里比看报错信息更快。6.3 用 latexmk 自动判断编译引擎如果不想手动切换 xelatex 或 pdflatex可以在项目根目录放一个latexmkrc文件$pdf_mode 5; # 5 表示 xelatex或者在 VSCode 的 LaTeX Workshop 里把默认 recipe 设置为latexmk让 latexmk 根据文档里的宏包自动选择编译引擎。这个方案对混合文档比较友好但注意有时 latexmk 对\usetikzlibrary的文件依赖跟踪并不完美改了库文件不会自动重编需要手动清理辅助文件后重编。7. 画图之外TikZ 生态里值得认识的亲戚TikZ 本身已经很强大了但它真正迷人的地方在于整个生态。了解这些基于 TikZ 的宏包会让你的绘图能力更上一层楼。这里挑几个我实际用过且觉得极其有价值的。7.1 pgfplots函数与数据可视化前面已经演示过pgfplots它本质上是用 TikZ 语言描述数据图表的宏包。你不需要手动计算坐标轴刻度、网格线\addplot会自动处理。它支持 Excel 数据文件导入、多曲线对比、误差棒、颜色映射等。如果要在 LaTeX 里画正规的科研图表pgfplots是首选远比手搓 TikZ 坐标轴高效。7.2 tikz-cd交换图与范畴论写数学论文的人经常会画交换图commutative diagram。tikz-cd提供了一种类似矩阵写法的语法\usepackage{tikz-cd} \begin{tikzcd} A \arrow[r, f] \arrow[d, g] B \arrow[d, h] \\ C \arrow[r, k] D \end{tikzcd}这一小段代码就能画出一个标准的方形交换图箭头、标签、位置都自动处理。如果你想用纯 TikZ 画需要手动布置坐标和节点麻烦且不美观。所以画交换图直接上 tikz-cd 就对了。7.3 circuitikz电路图电子方向的人经常会用到circuitikz。它提供了电阻、电容、电感、二极管、运算放大器、导线等电路元件。因为是 TikZ 生态所以它继承了节点和路径的逻辑画一个简单的串联电路只需几十行代码。画出的图可以直接插入实验报告或论文中不需要借助截图。7.4 mindmap、trees思维导图与树状图TikZ 自带trees库支持树状结构。mindmap库可以做带颜色渐变的思维导图。虽然这类图用专门的思维导图软件也能画但如果你希望所有图都在 LaTeX 文档里统一风格用 TikZ 的这些库会更好。我在写课程讲义时经常用tree库画知识结构图效果很干净。多了解这些亲戚最大的好处是遇到新需求时你不会总想着从零手写 TikZ而是会想是不是有现成的库可以用。LaTeX 生态的哲学就是这样——你不需要造轮子只需要找到轮子并学会正确使用它。就我个人而言从第一次用\draw画出一条直线到现在能流畅地画出流程图、函数图、链表图TikZ 带给我的最大改变不是绘图速度而是让我真正理解了图是可以被描述、被计算、被复用的。如果你刚开始学别着急先临摹几个例子再慢慢改成自己需要的图。多踩几次坑你会比我画得更好。
网站建设高端定制企业官网