tikz/pic 中的命名路径

tikz/pic 中的命名路径

我正在尝试理解定义中的路径的命名行为pic。考虑以下内容

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections}

\tikzset{%
    path1/.pic={%
        \coordinate (-p) at (-0.5,-0.5);
        \draw[red, name path=-horz-fails] (-1,0.5) to (1,0.5);
        \draw[black, name path=-vert] (0,-1) to (0,1);
    };
}
\tikzset{%
    path2/.pic={%
        \draw[blue, name path=-horz] (-1,0) to (1,0);
    };
}

\begin{document}
\begin{tikzpicture}
    \pic [name=p1] at (0, 0) {path1};
    \pic (p2) at (0, 0) {path2};
    \draw [name intersections={of=-vert and -horz}]
        (intersection-1) circle (2pt) to (p1-p);
    %\draw [name intersections={of=-vert and -horz-fails}]
    %    (intersection-1) circle (2pt);
\end{tikzpicture}
\end{document}

在此示例中,所有四条线均正确绘制。此外,未注释的交叉点也正确绘制;但是,如果我取消注释第二个交叉点,则会收到编译器错误

! Package tikz Error: I do not know the path named `-horz-works'. Perhaps you 
 misspelt it.

通过我的搜索,我偶然发现了这个问题以及相关错误报告来自答案。与该答案一样,中命名的最后一个路径pic在定义之外可用。我认为这可能相关,但我克隆了存储库并尝试使用修复程序进行编译,但仍然得到相同的结果。我也尝试使用name path ..,但这并没有使路径在主图片环境中可用。

我的问题是:这是同一个 bug 的表现吗?如果不是,定义中的路径的命名规则是什么pic

我注意到坐标(-p此处)继承了pic超出范围的名称,pic正如我预期的那样,我想以相同的方式引用路径。


动机

我的最终目标是在生成的 中定义的两个路径的交点处画一条线pic。我有一些 Python 代码可以生成球体上的纬度和经度线。我想pic在一张图片中多次使用 ;因此,我想引用具有父名称的路径pic来仅计算那些将进一步展示我想要展示的内容的交点。由于我正在计算路径,我可以定义交点的坐标,但我想让 TikZ 来完成这项工作,这对我来说似乎有点小题大做。

答案1

使用name path global为此而制作的:“广播”范围或图片等环境之外的路径。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections}

\tikzset{%
    path1/.pic={%
        \coordinate (-p) at (-0.5,-0.5);
        \draw[red, name path global=-horz-fails] (-1,0.5) to (1,0.5);
        \draw[black, name path global=-vert] (0,-1) to (0,1);
    };
}
\tikzset{%
    path2/.pic={%
        \draw[blue, name path global=-horz] (-1,0) to (1,0);
    };
}

\begin{document}
\begin{tikzpicture}
    \pic [name=p1] at (0, 0) {path1};
    \pic (p2) at (0, 0) {path2};
    \draw [name intersections={of=-vert and -horz}]
        (intersection-1) circle (2pt) to (p1-p);
    \draw [name intersections={of=-vert and -horz-fails}]
        (intersection-1) circle (2pt);
\end{tikzpicture}
\end{document}

在此处输入图片描述

如果您想要拥有唯一的名称,只需在路径名称前面加上 的名称即可pic

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections}
\makeatletter
\newcommand{\figname}[1]{\edef#1{\tikz@fig@name}}
\makeatother

\tikzset{%
    path1/.pic={%
        \figname{\myname}
        \coordinate (-p) at (-0.5,-0.5);
        \draw[red, name path global=\myname-horz-fails] (-1,0.5) to (1,0.5);
        \draw[black, name path global=\myname-vert] (0,-1) to (0,1);
    };
}
\tikzset{%
    path2/.pic={%
        \figname{\myname}
        \draw[blue, name path global=\myname-horz] (-1,0) to (1,0);
    };
}

\begin{document}
\begin{tikzpicture}
    \pic (p1) at (0, 0) {path1};
    \pic (p2) at (0, 0) {path2};
    \draw [name intersections={of=p1-vert and p2-horz}]
        (intersection-1) circle (2pt) to (p1-p);
    \draw [name intersections={of=p1-vert and p1-horz-fails}]
        (intersection-1) circle (2pt);
\end{tikzpicture}
\end{document}

(输出相同)

答案2

这里有一个快速破解方法,只需将所有路径放在一张图片中即可。

这虽然不能回答您的问题,但可以确保您不再犯任何错误。

\documentclass[tikz,border=5mm]{standalone}
%\usepackage{tikz}
\usetikzlibrary{intersections}

\tikzset{%
    path1/.pic={%
        \coordinate (-p) at (-0.5,-0.5);
        \draw[red, name path=-horz-fails] (-1,0.5) to (1,0.5);
       % \draw[black, name path=-vert] (0,-1) to (0,1);
    },
        path3/.pic={%
        \coordinate (-p) at (-0.5,-0.5);
        %\draw[red, name path=-horz-fails] (-1,0.5) to (1,0.5);
        \draw[black, name path=-vert] (0,-1) to (0,1);
    },
    path2/.pic={%
        \draw[blue, name path=-horz] (-1,0) to (1,0);
    };
}

\begin{document}
\begin{tikzpicture}
    \pic [name=p1] at (0, 0) {path1};
    \pic (p2) at (0, 0) {path2};
    \pic (p3) at (0,0) {path3};
    \draw [name intersections={of=-vert and -horz}]
        (intersection-1) circle (2pt) to (p1-p);
    \draw [name intersections={of=-vert and -horz-fails}]
        (intersection-1) circle (2pt);
\end{tikzpicture}
\end{document}

截屏

相关内容