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}

この例では、4本の線がすべて正しく描画されています。さらに、コメントされていない交差点も正しく描画されています。ただし、2番目の交差点のコメントを外すと、コンパイラエラーが発生します。

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

検索してみると、この質問および関連するバグレポート回答から。その回答と同様に、 で指定された最後のパスはpic定義の外部で使用できます。これは関連している可能性があると思いましたが、リポジトリをクローンし、修正を加えてコンパイルしてみましたが、それでも同じ結果になります。 も使用してみましたが、name path ..メインの picture 環境でパスが使用できませんでした。

私の質問は、これは同じバグの現れですか? そうでない場合、定義内のパスの命名規則は何ですかpic?

予想どおり、座標 (-pここ) がpicスコープ外で名前を継承していることに気付きましたpic。同じ方法でパスを参照したいと思います。


モチベーション

私の最終的な目標は、生成された 内で定義された 2 つのパスの交差点に線を引くことですpic。球体に沿って緯度と経度の線を生成する Python コードがあります。 を 1 つの画像内で複数回使用したいので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

ここでは、すべてのパスを 1 枚の写真にまとめるだけの簡単なハックを紹介します。

これは質問への回答にはなりませんが、間違いがなくなることを保証します。

\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}

スクリーンショット

関連情報