TikZ 手册说
TikZ 中所有图片的基本构成块是路径。路径是一系列相连的直线和曲线(这不是整个图片,但我们暂时忽略其复杂性)。
由于这是基本的 TikZ 构造,因此我想正确理解路径的真正含义。例如,在下面的代码中:
\path (0,0) -- (1,0);
我们有一条看不见的路径。但是下面的情况呢:
\draw (0,0) -- (1,0) (2,0) -- (3,0);
我们有一条路径还是两条路径?作为几何对象,这两条线段是断开的,但它们是同一构造的一部分。因此,我的问题还涉及到connected
路径的含义问题。简单的解释是它意味着类似拓扑连接的东西,但以下应该是一条路径:
\draw (0,0) circle (1);
\draw (-2,-2) -- (2,2);
而我认为这是两个独立的路径。另一方面,如果我们将上述内容包含在范围环境中,情况会怎样:
\begin{scope}
\draw (0,0) circle (1);
\draw (-2,-2) -- (2,2);
\end{scope}
我一直在尝试弄清楚,我倾向于认为路径是封装在由分号限制的独立代码片段中的任何内容(也就是说,在使用循环时,我们将拥有与循环重复次数一样多的路径实例)。但我也可能错了。
我知道,了解路径概念的完整含义可能对于掌握 TikZ 来说不是必要的,但这并不能阻碍我的好奇心。
答案1
查看由三个看起来相同的不同构造生成的 PDF 可能会有所帮助,以了解简单路径、复合路径和分组路径之间的区别:
我已经这样做了,l3draw
因为它的语法与最终 PDF 中得到的语法非常接近。
\documentclass{article}
\pdfcompresslevel=0
\pdfobjcompresslevel=0
\usepackage{l3draw}
\pagestyle{empty}
\begin{document}
\ExplSyntaxOn
% four simple paths
% there are 4 stroke commands
\draw_begin:
\color_select:n { red }
\draw_path_moveto:n { 0bp , 0bp }
\draw_path_lineto:n { 10bp , 20bp }
\draw_path_use_clear:n { stroke }
\color_select:n { black }
\draw_path_moveto:n { 20bp , 0bp }
\draw_path_lineto:n { 20bp , 20bp }
\draw_path_use_clear:n { stroke }
\draw_path_moveto:n { 30bp , 0bp }
\draw_path_lineto:n { 30bp , 20bp }
\draw_path_use_clear:n { stroke }
\color_select:n { red }
\draw_path_moveto:n { 40bp , 0bp }
\draw_path_lineto:n { 50bp , 20bp }
\draw_path_use_clear:n { stroke }
\draw_end:
\par
% red paths are simple paths, black path is a compound path
% there are 3 stroke commands
\draw_begin:
\color_select:n { red }
\draw_path_moveto:n { 0bp , 0bp }
\draw_path_lineto:n { 10bp , 20bp }
\draw_path_use_clear:n { stroke }
\color_select:n { black }
\draw_path_moveto:n { 20bp , 0bp }
\draw_path_lineto:n { 20bp , 20bp }
\draw_path_moveto:n { 30bp , 0bp } % ← notice the moveto
\draw_path_lineto:n { 30bp , 20bp }
\draw_path_use_clear:n { stroke }
\color_select:n { red }
\draw_path_moveto:n { 40bp , 0bp }
\draw_path_lineto:n { 50bp , 20bp }
\draw_path_use_clear:n { stroke }
\draw_end:
\par
% four simple paths, but the black paths are grouped
% there is no need to set the stroke colour back to red after the group
% there are 4 stroke commands
\draw_begin:
\color_select:n { red }
\draw_path_moveto:n { 0bp , 0bp }
\draw_path_lineto:n { 10bp , 20bp }
\draw_path_use_clear:n { stroke }
\draw_scope_begin:
\color_select:n { black }
\draw_path_moveto:n { 20bp , 0bp }
\draw_path_lineto:n { 20bp , 20bp }
\draw_path_use_clear:n { stroke }
\draw_path_moveto:n { 30bp , 0bp }
\draw_path_lineto:n { 30bp , 20bp }
\draw_path_use_clear:n { stroke }
\draw_scope_end:
\draw_path_moveto:n { 40bp , 0bp }
\draw_path_lineto:n { 50bp , 20bp }
\draw_path_use_clear:n { stroke }
\draw_end:
\ExplSyntaxOff
\end{document}
这 3 幅图的输出看起来是一样的:
但每种情况的 PDF 略有不同:
第一个绘图 PDF
1.0 0.0 0.0 rg 1.0 0.0 0.0 RG ← select RGB red stroke and fill colour
0 0 m ← move to (0,0)
10 20 l ← line to (10,20)
S ← stroke path with current stroke colour (red)
0.0 g 0.0 G ← select Grayscale black stroke and fill colour
20 0 m ← move to (20,0)
20 20 l ← line to (20,20)
S ← stroke path with current stroke colour (black)
30 0 m ← move to (30,0)
30 20 l ← line to (30,20)
S ← stroke path with current stroke colour (black)
1.0 0.0 0.0 rg 1.0 0.0 0.0 RG ← select RGB red stroke and fill colour
40 0 m ← move to (40,0)
50 20 l ← line to (50,20)
S ← stroke path with current stroke colour (red)
这(大约)相当于下tikz
图:
\begin{tikzpicture}[color=red]
\draw (0bp,0bp) -- (10bp,20bp);
\draw[black] (20bp,0bp) -- (20bp,20bp);
\draw[black] (30bp,0bp) -- (30bp,20bp);
\draw (40bp,0bp) -- (50bp,20bp);
\end{tikzpicture}
第二张图纸 PDF
1.0 0.0 0.0 rg 1.0 0.0 0.0 RG ← select RGB red stroke and fill colour
0 0 m ← move to (0,0)
10 20 l ← line to (10,20)
S ← stroke path with current stroke colour (red)
0.0 g 0.0 G ← select Grayscale black stroke and fill colour
20 0 m ← move to (20,0)
20 20 l ← line to (20,20)
30 0 m ← move to (30,0)
30 20 l ← line to (30,20)
S ← stroke path with current stroke colour (black)
1.0 0.0 0.0 rg 1.0 0.0 0.0 RG ← select RGB red stroke and fill colour
40 0 m ← move to (40,0)
50 20 l ← line to (50,20)
S ← stroke path with current stroke colour (red)
这(大约)相当于下tikz
图:
\begin{tikzpicture}[color=red]
\draw (0bp,0bp) -- (10bp,20bp);
\draw[black] (20bp,0bp) -- (20bp,20bp) (30bp,0bp) -- (30bp,20bp);
\draw (40bp,0bp) -- (50bp,20bp);
\end{tikzpicture}
第三张图纸PDF
1.0 0.0 0.0 rg 1.0 0.0 0.0 RG ← select RGB red stroke and fill colour
0 0 m ← move to (0,0)
10 20 l ← line to (10,20)
S ← stroke path with current stroke colour (red)
q ← save graphics state
0.0 g 0.0 G ← select Grayscale black stroke and fill colour
20 0 m ← move to (20,0)
20 20 l ← line to (20,20)
S ← stroke path with current stroke colour (black)
30 0 m ← move to (30,0)
30 20 l ← line to (30,20)
S ← stroke path with current stroke colour (black)
1.0 0.0 0.0 rg 1.0 0.0 0.0 RG ← select RGB red stroke and fill colour (this isn't technically needed, but LaTeX uses a stack for colour)
Q ← restore graphics state
40 0 m ← move to (40,0)
50 20 l ← line to (50,20)
S ← stroke path with current stroke colour (red)
这(大约)相当于下tikz
图:
\begin{tikzpicture}[color=red]
\draw (0bp,0bp) -- (10bp,20bp);
\begin{scope}[color=black]
\draw (20bp,0bp) -- (20bp,20bp);
\draw (30bp,0bp) -- (30bp,20bp);
\end{scope}
\draw (40bp,0bp) -- (50bp,20bp);
\end{tikzpicture}
答案2
你提问时引用的引文来自2.3 直线路径构建在 pgfmanual 中。但是,“路径”一词出现在许多不同的上下文中。
- 该
\path
命令实际上可以创建几乎任意数量的更多低级 pgf 路径对象。在\path
命令中,您可以放置线(如第 2.3 节中所述)和曲线,但也可以放置许多其他东西,例如边缘(以某种方式对应于独立路径)、节点(具有边界路径(可能还有其他低级路径))甚至pic
s(可以包含自己的\path
命令)。这里我指的是\path
命令的所有后代\draw
,例如\node
和。\pic
\path
- 有些对象可以粗略地称为“pgf 路径”。这些对象由低级命令(如 和 )以及实际绘制它们的命令创建
\pgfpathlineto
。请注意,这些路径可以通过 创建的“间隙”\pgfpathcurveto
,但它们具有一种通用的线条样式(颜色、宽度等)。\pgfusepath{stroke}
\pgfpathmoveto
- 更糟糕的是,还有其他路径对象,即在交叉点中使用的路径,并通过 定义
name path
。它们几乎与 1 中的路径类似,只是并非所有放在后面的东西\path[name path]
都会进入您可以在交叉点中使用的路径。例如,如果您将节点放在命名路径中,则节点边界不会成为命名路径的一部分,但是,如果您使用node[named path=...]
它,它将是。
我们通过一个小例子来说明最后一点。
\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[d/.style={circle,fill,inner sep=1pt,label=above:#1}]
\path node[name path=c1,circle,draw,minimum size=1cm] (C1){};
\path[name path=l1,draw] (-1,1) -- (1,-1);
\path[name intersections={of=l1 and c1,total=\t}]
foreach \i in {1,...,\t} {(intersection-\i)
node[d={$i_\i$}]{}};
\begin{scope}[xshift=3cm]
\path[name path=c2,draw] (-1,-1) -- (1,1)
(0,0) node[circle,draw,minimum size=1cm] (C1){};
\path[name path=l2,draw] (-1,1) -- (1,-1);
\path[name intersections={of=l2 and c2,total=\t}]
foreach \i in {1,...,\t} {(intersection-\i)
node[d={$i_\i'$}]{}};
\end{scope}
\end{tikzpicture}
\end{document}
底线是,路径tikz
不一定是一个定义明确的术语,有几种不同的对象都带有这个名称。我还认为第 2.3 节希望让读者熟悉某些一维对象(在本例中为直线),并使用术语“路径”来表示这些对象。但是,正如前面提到的,这个术语也用于其他事物。