在 TikZ 中绘制先前命名的路径

在 TikZ 中绘制先前命名的路径

我有一个与之前提出的问题略有不同的问题这里在 TeX.SE 上。我想在一个foreach语句中定义许多路径,然后在绘图中使用它们的名称。

当只有一条或几条路径且没有递归代码时,很容易使用save pathuse 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

使用 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}

上述代码片段的输出

相关内容