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}

스크린샷

관련 정보