这个问题看起来很简单,所以我有点不好意思问,但是我花了很长时间搜索这个网站和手册都没有任何结果,所以这里......
我找到
\draw (0,0) -- (1,0);
\draw (1,0) -- (1,1);
不会产生与
\draw (0,0) -- (1,0);
\draw -- (1,1);
这让我很惊讶。我原本以为,在第二种情况下,路径将从前一条路径结束的地方开始。这是我根据手册第 14.2 节关于“Line-To 操作”的预期,其中写道:
直线至操作将当前路径从当前点以直线延伸到给定坐标。“当前点”是前一个绘制操作的端点或前一个移动至操作指定的点。
使用两个减号,后跟圆括号中的坐标。
然而,我显然忽略了一些东西。但是什么呢?也许 Loop Space 的答案提供了线索 在 TikZ 中保存和重复使用/合并路径?其中指出:
TikZ 在启动时不会清空当前软路径,因此当 \draw 等命令启动时,它只会将其内容附加到已经存在的内容上。这通常是空路径,因为每当使用(即渲染)路径时,当前软路径就会设置为“空”。但这不是必须的。[重点是我的]
我怀疑这与我在这里观察到的情况有关,但考虑到我的问题很简单,那里建议的解决方案感觉比我预期的要技术性得多。从某种意义上说,我的问题只是:
我如何告诉 TikZ 从已经绘制的路径的末尾开始一条路径?
需要澄清的是,我上面的问题中提到了两个单独的“绘制”命令,这一点至关重要。也就是说,我意识到
\draw (0,0) -- (1,0) -- (1,1);
会产生预期的结果,但问题又是如何继续走下去已经绘制。我重新措辞了上述问题,试图使这一点更加清楚。
答案1
正如 percusse 指出的那样,路径使用后,就会被遗忘,不再是“当前路径”。但是,intersections
库提供了一个键来命名路径并保存它,以便可以“记住”。下面from end of path
定义了一个键,可用于从记住的(即命名的)路径的最后一个点开始一条新路径。
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{intersections}
\tikzset{%
from end of path/.style={
insert path={
\pgfextra{%
\expandafter\pgfprocesspathextractpoints%
\csname tikz@intersect@path@name@#1\endcsname%
\pgfpointlastonpath%
\pgfgetlastxy\lastx\lasty
}
(\lastx,\lasty)
}}}
\begin{document}
\begin{tikzpicture}
\draw [name path=A] (0,0) -- (1,1);
\draw [red, from end of path=A, name path=B] arc (180:0:1);
\draw [green, from end of path=B, name path=C] -- ++(0,-1);
\draw [blue, from end of path=C] .. controls ++(0,-1) and ++(0,-2) .. (0,0);
\end{tikzpicture}
\end{document}
答案2
循环空间”的引用不适用于当前实现。他的上下文是如果我们没有像 TikZ 的当前实现那样清除路径会怎样。如果我没有记错的话,他正在构建一个导致spath
打包的故事。不是 TikZ 实现的实际描述。
每个draw
命令都会将最后一个已知坐标重置为原点。实际上,第二个示例中的第二个命令不应该绘制任何内容,因为笔没有放下这是 PostScript/PDF 规范通过明确的移动到操作所要求的。
每次成功解析路径时,直到;
遇到一个,都会被存储,然后转换为软路径语法并进行渲染。在此当前路径之后,TikZ 和 PGF 已知的最后一个点将被重置。
因此,您引用的手册部分在相同的路径命令。或者,如果您使用较低 PGF 级别语法进行构建,直到\pgfusepath
遇到。