
我試圖理解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}