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 ..,但這並沒有使路徑在主圖片環境中可用。

我的問題是:這是同一個錯誤的表現嗎?如果不是,定義內路徑的命名規則是什麼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}

螢幕截圖

相關內容