![在 TikZ 中绘制先前命名的路径](https://linux22.com/image/451924/%E5%9C%A8%20TikZ%20%E4%B8%AD%E7%BB%98%E5%88%B6%E5%85%88%E5%89%8D%E5%91%BD%E5%90%8D%E7%9A%84%E8%B7%AF%E5%BE%84.png)
我有一个与之前提出的问题略有不同的问题这里在 TeX.SE 上。我想在一个foreach
语句中定义许多路径,然后在绘图中使用它们的名称。
当只有一条或几条路径且没有递归代码时,很容易使用save path
和use path
语法,如发布的问题中所示。遗憾的是,当路径数量与下面的 MWE 一样多时,我无法节省将它们与 联系起来save path=<recursive-path-name-expr>
。假设我想在两个矩形之间绘制一定数量的箭头,然后通过在中间放置一个倾斜节点来标记其中一个
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\newlength{\rectlong}
\setlength{\rectlong}{2cm}
\newlength{\rectshort}
\setlength{\rectshort}{1cm}
\begin{document}
\begin{tikzpicture}[mrect/.style={draw, minimum height=\rectlong, minimum width=\rectshort, rounded corners, outer sep=.1em}]
\node[mrect, fill=blue] (r1) {};
\node[right=of r1][mrect, fill=red] (r2) {};
\foreach \x [count=\i] in {-0.9, -0.6, ..., 0.9} {
\path[name=line\i] (r1) -- ([yshift={\x*\rectlong/2}] r2.west);
}
\end{tikzpicture}
\end{document}
用 draw替换\path
上述代码即可生成下图。
现在假设我想在选定line\i
路径上的某段代码后放置一个倾斜节点。我希望有一些命令,例如
\draw[use path=line5] node[scale=0.2, midway, sloped, above]{text along line};
得到下图。这个具体的例子的一部分可以通过其他方式轻松实现,有没有一种通用的方法可以重用以前用 命名的路径,而name=<path-name>
无需使用语法引用特定路径save/use path
?
答案1
这spath3
库可以处理这个问题(开发版本已上线github
)。
\documentclass{article}
%\url{https://tex.stackexchange.com/q/649216/86}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usetikzlibrary{spath3}
\newlength{\rectlong}
\setlength{\rectlong}{2cm}
\newlength{\rectshort}
\setlength{\rectshort}{1cm}
\begin{document}
\begin{tikzpicture}[
mrect/.style={
draw,
minimum height=\rectlong,
minimum width=\rectshort,
rounded corners,
outer sep=.1em
}
]
\node[mrect, fill=blue] (r1) {};
\node[right=of r1][mrect, fill=red] (r2) {};
\foreach \x [count=\i] in {-0.9, -0.6, ..., 0.9} {
\path[spath/save global=line\i] (r1) -- ([yshift={\x*\rectlong/2}] r2.west);
}
\draw[spath/restore=line5,dashed] node[scale=.2, midway, sloped, above] {text along line};
\end{tikzpicture}
\end{document}
它需要键global
的一部分spath/save global
,因为赋值是在foreach
循环内进行的,这意味着它位于 TeX 组内。更多详细信息请参阅文档spath3
。
答案2
我在这里看到了几个问题;第一个问题我知道如何解决,第二个问题我怀疑几乎无法解决。
第一个问题是,在 LaTeX 中,宏名称不能按原样使用数字;因此,\line0
必须以一种困难的方式编写像 这样的宏。我们可以使用包alphalph
并转换0, 1,...
为 来解决这个问题a,b,c,...,aa,ab,...
。现在您可以编写命令来保存路径。
另一个问题是,似乎您可以重复使用该路径来描边它,但不能向其中添加节点 --- 我使用不起作用的普通保存路径进行了演示。
\documentclass[tikz, border = 2.78]{standalone}
\usetikzlibrary{positioning}
\newlength{\rectlong}
\setlength{\rectlong}{2cm}
\newlength{\rectshort}
\setlength{\rectshort}{1cm}
\usepackage{alphalph}
\begin{document}
\begin{tikzpicture}[mrect/.style={draw, minimum height=\rectlong, minimum width=\rectshort, rounded corners, outer sep=.1em}]
\node[mrect, fill=blue] (r1) {};
\node[right=of r1][mrect, fill=red] (r2) {};
\path [save path=\lineA] (r1.north east) -- (r2.north west);
\foreach \x [count=\i] in {-0.9, -0.6, ..., 0.9} {
\edef\tmp{\noexpand\path [save path=\csname line\alphalph{\i}\endcsname]}
\tmp (r1) -- ([yshift={\x*\rectlong/2}] r2.west);
}
% when using "use path" it seems that adding nodes is not working
\draw [dashed, use path=\lineA]node[scale=0.2, midway, sloped, above]{text along line};
% but the paths have been correctly saved in the loop
\draw [use path=\linef] ;
\draw [red, use path=\linee] ;
\end{tikzpicture}
\end{document}
另一种可能性是保存起点和终点坐标——节点名称更加灵活且易于使用(并且全球范围内,甚至不同tikzpicture
国家之间。
\documentclass[tikz, border = 2.78]{standalone}
\usetikzlibrary{positioning}
\newlength{\rectlong}
\setlength{\rectlong}{2cm}
\newlength{\rectshort}
\setlength{\rectshort}{1cm}
\begin{document}
\begin{tikzpicture}[mrect/.style={draw, minimum height=\rectlong, minimum width=\rectshort, rounded corners, outer sep=.1em}]
\node[mrect, fill=blue] (r1) {};
\node[right=of r1][mrect, fill=red] (r2) {};
\foreach \x [count=\i] in {-0.9, -0.6, ..., 0.9} {
\path (r1) -- ([yshift={\x*\rectlong/2}] r2.west)
coordinate[pos=0](start\i)
coordinate[pos=1] (stop\i);
}
\draw [dashed] (start5) --
node[scale=0.2, midway, sloped, above]{text along line} (stop5);
\end{tikzpicture}
\end{document}