直接使用 TeX 命令绘制图形的一种方式是 PGF/TikZ
TikZ 可以使用普通的 (pdf)TEX、(pdf)Latex 或 ConTEXt 在 PDF 和 PostScript 格式中生成便携式图形。它提供了非常好的文档和大量的示例:http://www.texample.net/tikz/

PGF(“便携式图形格式”)是基本层,提供了一组用于生成图形的基本命令,而 TikZ(“TikZ ist kein Zeichenprogramm” 或 “TikZ 不是一个绘图程序”)是前端层,具有特殊的语法,使 PGF 的使用更为简便。TikZ 命令通常类似于 Metafont,选项机制也类似于 PsTricks 语法。

与之前的系统(picture、epic、pstricks 或 metapost)关注如何绘制不同,TikZ 更多地关注绘制什么。可以说,TikZ 就像 LaTeX 对 TeX 的关系一样。如果你的 LaTeX 发行版包含 TikZ,建议使用它。

其他基于 TikZ 的包(例如,用于绘制电路图的包)可以在此找到:https://www.ctan.org/topic/pgf-tikz

以下是 TikZ 的一些基础介绍。

加载包和库 - tikzpicture 环境
在 LaTeX 文档中使用 TikZ 需要加载 tikz 包,可以通过在文档的前言部分添加以下命令来加载:

\usepackage{tikz}  % 在前言部分

这将提供基本功能,并自动加载 pgf 包。对于特殊功能,需要包括特定的库。它需要在代码的前言部分使用以下命令:

\usetikzlibrary{⟨library 列表,用逗号分隔⟩}   % 通用语法,在前言部分

例如:

\usetikzlibrary{arrow,pattern, snakes}  % 在前言部分

以下是常见库的列表:

库名称 描述
\usetikzlibrary{arrows.meta} 提供不同类型箭头的箭头库(注意:\usetikzlibrary{arrows} 已被弃用)
\usetikzlibrary{automata} 自动机绘图库,用于绘制有限状态自动机和图灵机
\usetikzlibrary{backgrounds} 背景库,定义图片的背景
\usetikzlibrary{calc} 用于复杂坐标计算的库
\usetikzlibrary{calendar} 用于显示日历的库
\usetikzlibrary{chains} 链条库,用于对齐节点
\usetikzlibrary{decorations} 装饰库,用于装饰路径
\usetikzlibrary{er} 实体关系图(ER)库
\usetikzlibrary{intersections} 用于计算路径交点的库
\usetikzlibrary{matrix} 矩阵库,用于将每个项目放置为矩阵中的节点
\usetikzlibrary{fadings} 允许按照指定的模式使形状渐变
\usetikzlibrary{folding} 纸张折叠库
\usetikzlibrary{patterns} 提供不同的图案填充区域(水平线、垂直线、东北线、西北线、网格等)
\usetikzlibrary{petrinet} 用于绘制 Petri 网,用于数学建模
\usetikzlibrary{shapes.geometric} 用于绘制各种几何形状的库
\usetikzlibrary{shapes.misc} 其他几何形状库
\usetikzlibrary{shadings} 允许应用多个阴影宏和模式到任意形状
\usetikzlibrary{shadows} 定义样式,通过为路径和/或节点添加(部分)透明阴影
\usetikzlibrary{snakes} 用于绘制蛇形、弹簧、扩展波等曲线
\usetikzlibrary{spy} 放大已定义的图案和形状的选定部分
\usetikzlibrary{trees} 用于绘制树形图,每个点定义为节点
\usetikzlibrary{mindmap} 思维导图库,以更创意的方式展示父子关系

TikZ 环境
图形绘制是在 LaTeX 文档的主体部分进行的。使用 TikZ 有两种方式:

  1. 内联模式:当你想要将图形与文本内联时使用。

    \tikz[⟨选项⟩]{⟨TikZ 命令⟩}
    

    对于这种情况,有一个特殊选项 baseline = <dimension>。没有此选项时,图形的底部将位于周围文本的基线位置。使用该选项时,可以指定图形应该上移或下移,以便其高度 <dimension> 位于基线上。

  2. tikzpicture 环境:绘图命令必须被包含在 tikzpicture 环境中。

    \begin{tikzpicture}[⟨选项⟩]
      ⟨TikZ 命令⟩
    \end{tikzpicture}
    

    整个图形可以使用以下命令进行缩放:

    scale=⟨因子⟩
    

    或者为高度和宽度分别设置不同的缩放比例,例如:

    xscale=2.5, yscale=0.5
    

指定坐标
坐标通过圆括号以任意 TeX 单位指定,可以使用笛卡尔坐标(用逗号分隔),例如 x 方向为 1cm,y 方向为 2pt:

坐标类型 语法 示例
笛卡尔坐标 (x,y) (1cm,2pt)
极坐标 (theta:radius) (30:1cm)
相对于上一个位置 ++(x,y) ++(2cm,2cm)

表格的第一行显示了笛卡尔坐标(用逗号分隔)。在第二行显示了极坐标(用冒号分隔),例如在 30 度方向上的 1cm。

相对于上一个给定点的坐标通过在坐标前添加一个或两个加号来指定。使用“++”时,路径的最后一个点成为当前点,使用“+”时,上一点保持为当前路径位置。示例:在上一个点的右侧 2 个标准单位:

注意:

  • 如果没有指定单位(如 1,2),则默认单位是 cm(即 1cm, 2cm)。

  • 正的 x 和 y 方向分别表示图中的右侧和上侧。

  • 角度从 x 轴测量,逆时针方向为正。这意味着 0 度指向正右方,90 度指向上方。

  • 坐标可以与名称关联,例如:A = (2,3),可以通过以下几种方式指定:

当我们知道某个点的精确坐标值时,可以使用以下命令:

\coordinate (A) at (2,3);

当一个点是相对于其他点指定时,应该使用路径命令:

\path (A) ++(45:2) coordinate (B);

该命令表示从坐标 A 开始,沿着 45 度方向移动 2cm,最终位置的坐标应分配给 B。

为了定义坐标并放置文本,可以使用节点命令:

\node (A) at (90:0) {Coordinate Name};

路径语法
路径是由一系列直线和曲线段组成的(简化说明)。指令必须以分号结束。

\path[<选项>]{⟨规范⟩};

一条指令可以跨越多行,或者多个指令可以写在一行上。

路径操作
路径操作的选项有:例如 "draw"(绘制)、"fill"(填充)、"pattern"(图案)、"shade"(阴影)、"clip"(裁剪)、"use as bounding box"(用作边界框)。这些选项可以像下面这样使用:

\path[draw]             % 绘制线/曲线
\path[fill]             % 填充曲线下方的区域
\path[fill,draw]        % 填充并绘制线(边框)
\path[pattern]          % 
\path[shade]            % 一种填充变化,从一种颜色平滑过渡到另一种颜色
\path[shade,draw]       % 填充并绘制
\path[clip]             % 所有后续绘图都会被当前路径裁剪,后续路径的大小对图片尺寸无影响
\path[use as bounding box]  % 将路径用作边界框

上述命令也可以等效写为:\draw\fill\filldraw\pattern\shade\shadedraw\clip\useasboundingbox。这些命令在后续部分中有详细解释。

几何路径操作
几何路径选项包括:

  • "rotate=<角度(度数)>"

  • "xshift=<长度>"

  • "yshift=<长度>"

  • "scale=<因子>"

  • "xscale=<因子>"

  • "yscale=<因子>"

颜色和透明度
最常见的方法是仅指定颜色名称或使用 "color=<颜色名称>"。在这种情况下,它将根据所使用的命令(如 \draw, \fill)为边框或区域上色。

绘图中可能有不同的元素,因此可能需要分别指定它们,可以使用以下选项:

  • "draw=<线条颜色>"

  • "draw opacity=<因子>"

  • "fill=<填充颜色>"

  • "fill opacity=<因子>"

  • "text=<文本颜色>"

  • "text opacity=<因子>"

  • "pattern color=<颜色>"

预定义颜色:red, green, blue, cyan, magenta, yellow, black, gray, darkgray, lightgray, brown, lime, olive, orange, pink, purple, teal, violet, white。

透明度因子的值范围为 0(完全透明)到 1(完全不透明)。

线宽
线宽选项:

  • "line width=<尺寸>"
    以及缩写:

  • "ultra thin" 对应 0.1pt

  • "very thin" 对应 0.2pt

  • "thin" 对应 0.4pt(默认宽度)

  • "semithick" 对应 0.6pt

  • "thick" 对应 0.8pt

  • "very thick" 对应 1.2pt

  • "ultra thick" 对应 1.6pt

线条结束
线条结束和连接选项:

  • "line cap=<类型:round, rect, 或 butt>"

  • "arrows=<起始箭头类型>-<结束箭头类型>"

  • "rounded corners"

  • "rounded corners=<大小>"

  • "line join=<类型:round, bevel, 或 miter>"

线条图案
线条图案选项:

  • "dash pattern=<虚线图案>"(例如:"dash pattern=on 2pt off 3pt on 4pt off 4pt")

  • "dash phase=<虚线阶段>"

  • "solid"(实线)

  • "dashed"(虚线)

  • "dotted"(点线)

  • "dashdotted"(虚点线)

  • "densely dotted"(密集点线)

  • "loosely dotted"(稀疏点线)

  • "double"(双线)

路径填充选项例如:

  • "fill=<填充颜色>"

  • "pattern=<图案名称>"

  • "pattern color=<颜色>"

\draw 命令
\draw 命令可以通过不同选项以多种方式使用。以下是一些示例。

绘制直线
直线通过用双减号分隔的坐标来表示。

\draw (1,0) -- (0,0) -- (0,1);

可以使用 "--cycle" 选项关闭一个连接的路径,该选项通过一条直线连接最后一个和第一个坐标。

\draw (1,0) -- (0,0) -- (0,1) -- cycle;

路径中可以使用进一步的 "move-to" 操作开始路径的新部分,该部分与路径的前一个部分不连接。示例:从 (0,0) 移动直线到 (2,0),再从 (0,1) 移动直线到 (2,1)。

\draw (0,0) -- (2,0) (0,1) -- (2,1);

可以通过直线连接两个点,这些线只能是水平或垂直的。对于先水平再垂直的连接,使用:

\draw (0,0) -| (1,1);

或者先垂直再水平,使用:

\draw (0,0) |- (1,1);

绘制曲线路径
可以使用 "..controls() ..()" 命令绘制贝塞尔曲线,控制点可以是一个或两个。

\draw (0,0) .. controls (1,1) .. (4,0)
      (5,0) .. controls (6,0) and (6,1) .. (5,2);

可以使用 "to" 操作创建用户定义的路径。没有选项时,它与双减号命令等价,表示直线。使用 "out" 和 "in" 选项可以创建曲线路径。例如 "[out=135,in=45]" 会导致路径在第一个坐标处以 135 度角离开,在第二个坐标处以 45 度角到达。

\draw (0,0) to (3,2);
\draw (0,0) to[out=90,in=180] (3,2);
\draw (0,0) to[bend right] (3,2);

(“bend right”的语法可能看起来有些直觉不强。可以理解为在路径的起始点向右偏移,然后平滑弯曲到终点,而不是表示路径整个长度都向右弯曲。)

绘制特殊曲线
矩形:

\draw (0,0) rectangle (2,3);

圆和椭圆:使用 "circle" 命令可以绘制圆和椭圆。圆只需要半径,而椭圆则需要长轴和短轴的长度

\draw (0,0) circle [radius=1.5];
\draw (0,0) circle (2cm); % 旧语法,使用圆括号代替方括号
\draw (0,0) circle [x radius=1.5cm, y radius=10mm];
\draw (0,0) circle (1.2cm and 8mm); % 旧语法
\draw (0,0) circle [x radius=1cm, y radius=5mm, rotate=30];
\draw[rotate=30] (0,0) ellipse (20pt and 10pt);  % 旧语法

弧线:使用 "arc" 命令创建圆或椭圆的一部分。

\draw (0,0) arc (0:270:8mm);
\draw (0,0) arc (0:315:1.75cm and 1cm);
\filldraw[fill=cyan, draw=blue] (0,0) -- (12mm,0mm) arc (0:30:12mm) -- (0,0);

或者使用另一种语法:

\draw (0,0)  arc[radius = 8mm, start angle= 0, end angle= 270];
\draw (0,0)  arc[x radius = 1.75cm, y radius = 1cm, start angle= 0, end angle= 315];

帮助线、抛物线、正弦和余弦曲线
还有许多预定义的命令用于特殊路径,如 "grid"、"parabola"、"sin"、"cos"(正弦或余弦曲线,区间为 [0, π/2])。选项 "help lines" 表示“细灰色”。

\draw[help lines] (0,0) grid (2,3);
\draw[step=0.5, gray, very thin] (-1.4,-1.4) grid (1.4,1.4);
\draw (0,0) parabola (1,1.5) parabola[bend at end] (2,0);
\draw (0,0) sin (1,1) cos (2,0) sin (3,-1) cos (4,0) sin (5,1);

使用选项改变线条外观
线条具有许多可以根据需求改变的属性。例如,在以下示例中,我们选择了红色线条、虚线图案和非常粗的线宽。

\draw[red, dashed, very thick, rotate=30] (1,0) -- (0,0) -- (0,1);

更改箭头尖端的示例

\draw [->] (0,0) -- (30:20pt); 
\draw [<->] (1,0) arc (180:30:10pt); 
\draw [<<->] (2,0) -- ++(0.5,10pt) -- ++(0.5,-10pt) -- ++(0.5,10pt);

更改线条外观的选项列表

描述 传递的选项 可接受值 备注
更改线宽 line width=1mm 任意 可以提供的值包括 pt、mm、cm、in 等单位
line width=thick ultra thin, very thin, thin, semi thick, thick, very thick, ultra thick 这些值对应(0.1pt、0.2pt、0.4pt、0.6pt、0.8pt、1.2pt、1.6pt)
更改线条结束形状 line cap=round round, rect, butt
更改线条图案 solid solid, dashed, dotted, dash dotted, densely dotted, loosely dotted, double 预定义线条图案
dash pattern=on 2pt off 3pt on 4pt off 4pt 自定义线条图案
箭头类型 arrow= <-> >, <, >>, <<, latex, stealth
连接线条 line join= miter round, bevel, miter 示例: \draw[very thick, line cap=round, arrow=latex-latex, line join=round] (0,0)--(3,2);
矩形绘制 使用移动到操作来指定一个角落,然后在 "rectangle" 后指定对角线的坐标。最后一个点成为新的当前点。
\draw (0,0) rectangle (1,1);
填充颜色 \shade[top color=yellow, bottom color=black] (0,0) rectangle (2,-1); "green!20!white" 表示 20% 绿色和 80% 白色的混合。
\filldraw[fill=green!20!white, draw=green!40!black] (0,0) rectangle (2,1);

\node 命令
节点用于在给定坐标处放置文本。节点不是路径的一部分,它们在路径绘制完成后添加到图片中。

节点可以放置在矩形、圆形或其他简单形状内。可以通过多种方式放置节点:

使用 \node 命令,命令的语法是:

\node[options] (Name) at (coordinates) {Text};

示例用法

\node[red,rectangle] at (0,0) {Some text}; % 仅放置文本
\node (A) at (0,0) {}; % 定义一个新坐标

节点的名称应放在括号内。以下是一个示例,其中绘制了两个节点,第一个在圆形内,第二个在矩形内。

\begin{tikzpicture}
    \node (A) at (0,0) [thick,blue, circle,fill=blue!50] {Encoder};   % 节点 A
    \node (B) at (3,0) [thick,blue,rectangle,fill=green!80!black] {Decoder}; % 节点 B
    \draw[->,ultra thick] (A)--(B); % 连接节点 A 和 B 的线
\end{tikzpicture}

与其他命令结合使用 \node

\draw (0,0) node{a} -- (1,1) node {b};
\path (0,0) node{a} -- (1,1) node {b};

文本位置选项

描述 传递的选项 可接受值 备注
文本沿路径的位置 pos=.5 > 0 文本将被放置在路径的开始(=0)、中间(=.5)和结束(=1)处(默认值为 1)。
文本对齐方式 align=left left, right, center 文本/段落将按此方式对齐(默认值为 center)。
文本相对于给定点的位置 anchor=top left, right, top, bottom, top left, top right, bottom left, bottom right 假定点为原点,四个方向(x,-x, y,-y)对应左、右、上、下。四个象限(I、II、III、IV)。
文本封闭的形状 rectangle, circle 必须与选项一起传递相应的参数。
文本与形状之间的距离 Inner sep=.5 任意数值 > 0
封闭形状与点之间的距离 Outer sep=.8 任意数值 > 0
无论文本长度如何,形状的最小大小 minimum width = 2cm 任意值 > 0 即使只有一个字母,形状的宽度(假设是矩形)至少为 2cm。 但对于非常长的文本,大小可能会增加。
节点的最小高度和宽度 minimum height = 2cm 任意值 > 0 定义节点形状的最小高度和宽度。
保持形状的纵横比 shape aspect = 1 包含文本的形状将改变其尺寸,但保持此纵横比。
着色文本、颜色形状等 fill=red, draw=green 如前所述的颜色和透明度选项。
沿路径对齐文本 sloped

这些选项的几个示例稍后会提供,以便更好地解释。

沿给定路径写文本的示例
使用 \node 命令沿路径写文本的一个简单示例如下:

\draw[dotted]
    (0,0) node {1st node}
 -- (1,1) node {2nd node}
 -- (0,2) node {3rd node}
 -- cycle;
\fill[fill=yellow]
    (0,0) node {1st node}
 -- (1,1) node[circle,inner sep=0pt,draw] {2nd node}
 -- (0,2) node[fill=red!20,draw,double,rounded corners] {3rd node};

沿直线或曲线放置节点
使用 "pos=" 选项将节点放置在路径上的指定位置,其中 fraction 是一个浮动的数字,表示 0 代表上一个坐标,1 代表当前坐标。

\draw (0,0) -- (3,1)
  node[pos=0]{0} node[pos=0.5]{1/2} node[pos=0.9]{9/10};

可以使用一些缩写:“at start” 代表 “pos=0”,“very near start” 代表 “pos=0.125”,“near start” 代表 “pos=0.25”,“midway” 代表 “pos=0.5”,“near end” 代表 “pos=0.75”,“very near end” 代表 “pos=0.875”,“at end” 代表 “pos=1”。

旋转节点以使其与曲线切线对齐
“sloped” 选项使得节点旋转,使其与曲线的切线对齐。

创建包含节点的路径
节点通常是路径操作中唯一的操作,因此有一些特定命令用于创建仅包含节点的路径,第一个命令有文本输出,第二个没有:

\node[<options>](<name>) at (<coordinate>){<text>};
\coordinate[<options>](<name>) at (<coordinate>);

例如,连接节点使用节点标签作为坐标。定义如下:

\path (0,0) node(x) {} 
      (3,1) node(y) {};
\draw (x) -- (y);

等效的写法是:

\coordinate (x) at (0,0); 
\coordinate (y) at (3,1);
\draw (x) -- (y);

多行文本
可以在节点内包含多行文本。新行通过双反斜杠 "\ " 表示,同时需要使用节点选项 "align=" 来指定对齐方式。示例:

\filldraw 
(0,0) circle (2pt) node[align=left, below] {test 1\\is aligned left} --
(4,0) circle (2pt) node[align=center, below] {test 2\\is centered}     -- 
(8,0) circle (2pt) node[align=right, below] {test 3\\is right aligned};

路径构建操作
路径构建操作尝试让路径从节点的形状边界开始,而不是从节点的中心开始。

\path (0,0) node(x) {Hello World!}
(3,1) node[circle,draw](y) {$\int_1^2 x \mathrm d x$};
\draw[->,blue] (x) -- (y);
\draw[->,red] (x) -| node[near start,below] {label} (y);
\draw[->,orange] (x) .. controls +(up:1cm) and +(left:1cm) .. node[above,sloped] {label} (y);

一旦定义了节点 x,你可以像 "(x.)" 这样使用锚点,例如 "(x.north)"。

沿绘制曲线放置圆形
在这种情况下,首先绘制一条曲线,然后在该曲线上按指定位置放置一些圆形。这一技巧利用了“foreach”命令,更多细节请参见特殊命令部分。

\draw[very thick] (0.5,0.5) .. controls (2,1).. (2.5,2.5)
	node foreach \p in {0,0.25,...,1} [circle,fill=red,pos=\p,inner sep=0pt,minimum size=1.5mm]{};
\node[left] at (.5,.30){A};
\node[right] at (2.5,2.5){B};
\path[ultra thick,latex-latex] (2,0) --(0,0)--(0,1.5);

\clip 命令
\clip 命令用于移除给定形状之外的部分(例如矩形或圆形)。

\begin{tikzpicture}
	\clip (1,1)  circle (2);
	\draw[red,fill] (0,0) rectangle (3,3);		
\end{tikzpicture}

特殊命令
Tikzstyle
当需要设置多个不同形状具有相同参数(例如宽度、颜色等)时,Tikzstyle 命令非常有用。您可以在开始时定义一个或多个样式,如下所示,然后可以在 TikZ 代码中任何地方使用它。

\begin{tikzpicture}[
mycircle/.style={circle, draw=green!60, fill=green!5, ultra thick, minimum size=7mm},
myline/.style={dotted, blue!60,->},
]
\draw[myline] (0,0)node[mycircle]{$\pi$} to[out=45,in=135]  (5,1) node[mycircle]{3.414...};
\end{tikzpicture}

上述语法允许您在图片开始时定义样式。也可以使用 tikzstyle 命令来定义样式:

\begin{tikzpicture}
\tikzset{mycircle/.style={circle, draw=green!60, fill=green!5, ultra thick, minimum size=7mm}}
\tikzset{myline/.style={dotted, blue!60,->}}
\draw[myline] (0,0)node[mycircle]{$\pi$} to[out=45,in=135]  (5,1) node[mycircle]{3.414...};
\end{tikzpicture}

作用范围(Scope)
如果你只想对代码的某一部分应用更改,可以使用 scope 命令。示例如下:

\begin{tikzpicture}[
mycircle/.style={circle, draw=green!60, fill=green!5, ultra thick, minimum size=7mm},
myline/.style={dotted, blue!60,->},
]
\draw[myline] (0,0)node[mycircle]{$\pi$} to[out=45,in=135]  (5,1) node[mycircle]{3.414...};
% 以下绘图在作用范围内,将沿 y 方向平移 2cm
\begin{scope}[yshift=2cm]
    \draw[myline] (0,0)node[mycircle]{$\pi$} to[out=45,in=135]  (5,1) node[mycircle]{3.414...};
\end{scope}
\end{tikzpicture}

Foreach 命令
此命令类似于编程中的循环。它可以通过 "\foreach ⟨variable⟩ in {⟨list of values⟩} ⟨commands⟩" 来实现。

\foreach \x in {0,...,9} 
  \draw (\x,0) circle (0.4);

Beamer 样式下的动画
为了在 Beamer 中实现最简单的动画,可以打印 N 帧,每帧对象在 N 步内逐渐移动。以下是示例:

\begin{frame}
\newcount\p
\animatevalue<3-10>{\p}{0}{100}
\begin{tikzpicture}
	\path(0,0)rectangle(0.75\paperwidth,-0.75\paperheight);
	\path[draw](0,0)..controls +(30:2) and +(40:2)..+(4,-1) node [pos=\p/100,sloped,above]{a};
\end{tikzpicture}
\end{frame}

有三个重要步骤,如下所述:

  1. 定义一个新变量:在上面的示例中,我们使用了 \p 作为存储计数的变量。

  2. 定义变量的范围:我们使用命令 \animatevalue<3-10>{\p}{0}{100},表示在 0 到 100 的范围内创建 10 个值。<1-10> 表示新变量有以下值集合:\p = [1, 2, 3, ..., 10]<3-10> 表示新变量的值为:\p = [0, 0, 0, 1.25, 2.5, ..., 10]

  3. 使用变量控制对象位置:使用 \path[draw](0,0)..controls +(30:2) and +(40:2)..+(4,-1) node [pos=\p/100,sloped,above]{a}; 来实现。

PGF 图层
有两种方法可以将曲线放置到背景中:

  1. 第一种方法是按顺序写命令,即首先在背景中绘制曲线(这些坐标已经可用),然后绘制位于其上的曲线,依此类推。

  2. 第二种方法是使用 PGF 图层。这种方法尤其有用,当背景曲线的坐标尚不可用时。图层相对于上层曲线进行定义。

PGF 图层提供以下命令:

% 定义两个图层(名称可以更改)
\pgfdeclarelayer{background}
\pgfdeclarelayer{foreground}
%% 定义图层的顺序,背景图层位于最底层,前景图层位于最上层
\pgfsetlayers{background,main,foreground}

%% 在主图层绘制的内容
\draw (1,0) circle (2);

\begin{pgfonlayer}{foreground}  %% 绘制应该放在前景/顶层的曲线
\draw (0,0) arc (0:120:1);
\end{pgfonlayer}

\begin{pgfonlayer}{background}  %% 绘制应该放在背景/底层的曲线
\draw (0,0) rectangle(2,2);
\end{pgfonlayer}

图案库
此库提供了总共 11 种图案,可用于填充给定区域。可以使用关键字 pattern color 来选择图案的颜色。以下是使用图案的示例:

\usetikzlibrary{tikz}   
\usetikzlibrary{patterns}   %% 在 LaTeX 文件开头

\begin{document}
\begin{tikzpicture}
\draw[pattern=dots, pattern color=blue] (0,0) rectangle ++(1,1);
\draw[pattern=grid, pattern color=blue] (0,1) rectangle ++(1,1);
\draw[pattern=crosshatch, pattern color=blue] (0,2) rectangle ++(1,1);
\draw[pattern=crosshatch dots, pattern color=blue] (0,3) rectangle ++(1,1);
\draw[pattern=fivepointed stars, pattern color=blue] (0,4) rectangle ++(1,1);
\draw[pattern=sixpointed stars, pattern color=blue] (0,5) rectangle ++(1,1);

\draw[pattern=vertical lines, pattern color=blue] (0,6) rectangle ++(1,1);
\draw[pattern=horizontal lines, pattern color=blue] (0,7) rectangle ++(1,1);
\draw[pattern=north east lines, pattern color=blue] (0,8) rectangle ++(1,1);
\draw[pattern=north west lines, pattern color=blue] (0,9) rectangle ++(1,1);
\end{tikzpicture}
\end{document}

蛇形库
该库可以将路径结构从直线变为以下几种形式:

\usetikzlibrary{snakes}
\begin{tikzpicture}[thick]
\draw[snake=bumps] (0,0) -- (3,0);                          % 半圆/曲线
\draw[snake=zigzag] (0,1)-- (3,1);                          % 锯齿形图案   
\draw[snake=saw] (0,2) -- (3,2);                            % 锯齿形线  
\draw[snake=brace] (0,3)-- (3,3);                           % 两点之间的支架
\draw[snake=coil,segment length=4pt] (0,4)-- (3,4);         % 像螺旋线
\draw[snake=coil,segment aspect=0] (0,5) -- (3,5);          % 像正弦波
\draw[snake=snake] (0,6) -- (3,6);                          % 正弦波(类似螺旋线)
\draw[snake=expanding waves,segment angle=7] (0,7)-- (3,7); % 扩展波前
\draw[snake=border,segment angle=-45] (0,8) -- (3,8);   % 沿路径的斜线
\draw[snake=triangles] (0,9) -- (3,9);                  % 路径上的三角形
\draw[snake=ticks] (0,10) -- (3,10);                    % 路径上的竖直刻度
\draw[snake=crosses] (0,11) -- (3,11);                  % 路径上的十字架  
\end{tikzpicture}

影响曲线形状的参数有:

  • segment amplitude=.4mm

  • segment length=2mm

  • segment object length=.5mm

  • segment angle = 20

  • segment aspect=0

  • raise snake = .2mm

  • mirror snake

  • line before snake=1mm, line after snake=1mm, line around snake=1mm

  • gap before snakes=1mm, gap after snakes=1mm, gap around snake=1mm


Calc 包
可以通过命令 \usetikzlibrary{calc} 引入 calc 包。该包可以用于执行坐标之间的简单计算。

坐标代数

\coordinate (A) at (2,3);
\coordinate (B) at (1.5,2.5);
\coordinate (B) at ($(A) + (B)$)
\coordinate (B) at ($(A) - (B)$)
\coordinate (B) at ($(A) + 2*(A)$)

查找中点

\coordinate (A) at (0,0);
\coordinate (B) at (90:3);
\coordinate (C) at (0:4);
\coordinate (Ap) at ($(B)!0.5!(C)$);
\coordinate (Bp) at ($(A)!0.5!(C)$);
\coordinate (Cp) at ($(A)!0.5!(B)$);
\draw (A)--(B)--(C)--cycle
      (A)--(Ap) 
      (B)--(Bp) 
      (C)--(Cp);

特殊函数 veclen
该包提供了一个特殊的函数 veclen,可用于计算两点之间的距离,示例如下(取自 https://tikz.dev/tikz-paths 的第 14.15 节):

\usetikzlibrary {calc}
\begin{tikzpicture}
  \draw [help lines] (0,0) grid (3,3);
  \coordinate (a) at (rnd,rnd);
  \coordinate (b) at (3-rnd,3-rnd);
  \draw (a) -- (b);
  \node (c) at (1,2) {x};
  \draw let \p1 = ($ (a)!(c)!(b) - (c) $),
            \n1 = {veclen(\x1,\y1)}
        in circle [at=(c), radius=\n1];
\end{tikzpicture}

交点库
此库用于查找任何两条曲线的交点,下面是一个示例:

\usepackage{tikz}
\usetikzlibrary{intersections}

\begin{document}
\begin{tikzpicture}
\draw[name path=line,smooth] (0,5)--(1.5,5);
\draw[name path=curve,smooth] (1.5,6) to[out=270,in=90] (0,3);
\draw[name intersections={of=line and curve}] (intersection-1) circle[radius=0.1];
\end{tikzpicture}
\end{document}

与多条曲线的交点应用

\begin{tikzpicture}
\draw[name path=grid] [xstep=3,ystep=2] (0,0) grid (9,8);
\draw[->, name path=line] (2,1) -- (7,7);
\draw[name intersections={of=grid and line, sort by=line, name=i, total=\t}]
\foreach \s in {1,...,\t}{(i-\s) node {\s}};
\end{tikzpicture}

PGF 数学功能
通过使用 \usepackage[pgfmath],可以执行一系列数学操作,该包提供了核心命令 \pgfmathparse 并返回结果在 \pgfmathresult 中。以下是一些示例:

\pgfmathparse{add(75,6)} \pgfmathresult

在上面的示例中,我们使用了函数 add(x,y)。该命令的替代方法是 \pgfmathadd{x}{y}

可用的函数包括:

  • add(a,b), subtract(a,b), multiply(a,b), divide(a,b), div(a,b), neg(-a), sqrt(a), pow(a^b), exp(a), ln(a), log10(a), log2(a), abs(a), mod(a,b)

  • round(a), floor(a), ceil(a), int(a), frac(a)

  • 检查类型:isodd(a), iseven(a), isprime(a)

  • 常数:e, pi

  • 转换:rad(x), deg是的

  • 三角函数:sin(x), cos(x), tan(x), sec(x), cosec(x), cot(x)

  • 反三角函数:asin(x), acos(x), atan(x)

  • 比较:equal(x,y), greater(x,y), less(x,y), notequal(x,y), notgreater(x,y), notless(x,y)

  • 逻辑函数:and(x,y), or(x,y), not(x), ifthenelse(x,y,z), 逻辑常数:true, false

  • 随机数生成器:rnd, rand, random(x,y)

  • 杂项:从元素列表中找最小/最大值:min(x1,x2,...,xn), max(x1,x2,...,xn), 向量长度:veclen(x,y) 访问给定数组 x 的第 i 个元素:array({x1,x2,x3,...,xn},i)

  • 计算角度:\pgfmathanglebetweenpoints{P}{Q} 计算通过点 P 和 Q 的直线角度;\pgfmathanglebetweenlines{P1}{Q1}{P2}{Q2} 计算两条线的夹角,L1 通过 P1 和 Q1,L2 通过 P2 和 Q2。

命令描述

命令 描述
\pgfmathsetlength{name}{value} 设置给定值的相应 "name" tex 注册
\pgfmathsetcount{name}{value} 设置给定值的相应计数器
\pgfmathsetcounter{name}{value} 设置给定值的相应计数器
\pgfmathsetmacro{name}{value} 设置宏变量值
\pgfmathaddtolength{name}{value} 增加给定长度
\pgfmathaddtocount{name}{value} 增加给定计数值

PGF 绘图
PGF 还具有一个数学引擎,使您能够绘制函数:

\draw [domain=xmin:xmax] plot (\x, {function});

可以绘制的许多函数包括:factorial(\x), sqrt(\x), pow(\x,y), exp(\x), ln(\x), log10(\x), log2(\x), abs(\x), mod(\x,y), round(\x), floor(\x), ceil(\x), sin(\x), cos(\x), tan(\x), min(\x,y), max(\x,y)。

注意

  1. 三角函数假定 x 为角度;要表示 x 为弧度,请在其后加上 "r" 标记,例如:sin(\x r)

  2. 两个常用常数是:e = 2.718281828 和 pi = 3.141592654,可以直接使用 e 和 pi 表达式。

两个函数的示例

\draw [help lines] (-2,0) grid (2,4); 
\draw [->] (-2.2,0) -- (2.2,0); 
\draw [->] (0,0) -- (0,4.2); 
\draw [green, thick, domain=-2:2] plot (\x, {4-\x*\x}); 
\draw [domain=-2:2, samples=50] plot (\x, {1+cos(pi*\x r)});

示例 1

\documentclass{article}
\usepackage{tikz}
\begin{document}
  \begin{tikzpicture}
  \draw[thick,rounded corners=8pt] (0,0) -- (0,2) -- (1,3.25) 
   -- (2,2) -- (2,0) -- (0,2) -- (2,2) -- (0,0) -- (2,0);
  \end{tikzpicture}
\end{document}

示例 2

\documentclass{article}
\usepackage{tikz}
\begin{document}
 \begin{tikzpicture}[scale=3]
 \draw[step=.5cm, gray, very thin] (-1.2,-1.2) grid (1.2,1.2); 
 \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm) arc (0:30:3mm) -- cycle; 
 \draw[->] (-1.25,0) -- (1.25,0) coordinate (x axis);
 \draw[->] (0,-1.25) -- (0,1.25) coordinate (y axis);
 \draw (0,0) circle (1cm);
 \draw[very thick,red] (30:1cm) -- node[left,fill=white] {$\sin \alpha$} (30:1cm |- x axis);
 \draw[very thick,blue] (30:1cm |- x axis) -- node[below=2pt,fill=white] {$\cos \alpha$} (0,0);
 \draw (0,0) -- (30:1cm);
 \foreach \x/\xtext in {-1, -0.5/-\frac{1}{2}, 1} 
   \draw (\x cm,1pt) -- (\x cm,-1pt) node[anchor=north,fill=white] {$\xtext$};
 \foreach \y/\ytext in {-1, -0.5/-\frac{1}{2}, 0.5/\frac{1}{2}, 1} 
   \draw (1pt,\y cm) -- (-1pt,\y cm) node[anchor=east,fill=white] {$\ytext$};
 \end{tikzpicture}
\end{document}

示例 3:一个圆环

\documentclass{article}
\usepackage{tikz}
\begin{document}
 \begin{tikzpicture}
  \draw (-1,0) to[bend left] (1,0);
  \draw (-1.2,.1) to[bend right] (1.2,.1);
  \draw[rotate=0] (0,0) ellipse (100pt and 50pt);
\end{tikzpicture}
\end{document}

示例 4:一些函数

\documentclass{article}
\usepackage{tikz}
\begin{document}
  \begin{tikzpicture}[domain=0:4] 
    \draw[very thin,color=gray] (-0.1,-1.1) grid (3.9,3.9);
    \draw[->] (-0.2,0) -- (4.2,0) node[right] {$x$}; 
    \draw[->] (0,-1.2) -- (0,4.2) node[above] {$f(x)$};
    \draw[color=red]    plot (\x,\x)             node[right] {$f(x) =x$}; 
    \draw[color=blue]   plot (\x,{sin(\x r)})    node[right] {$f(x) = \sin x$}; 
    \draw[color=orange] plot (\x,{0.05*exp(\x)}) node[right] {$f(x) = \frac{1}{20} \mathrm e^x$};
  \end{tikzpicture}
\end{document}

参考资料

最后修改: 2025年04月23日 星期三 11:00