Caminhos nomeados dentro de um tikz/pic

Caminhos nomeados dentro de um tikz/pic

Estou tentando entender o comportamento de nomenclatura de caminhos dentro de uma picdefinição. Considere o seguinte

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

Neste exemplo, todas as quatro linhas estão desenhadas corretamente. Além disso, a interseção não comentada é desenhada corretamente; no entanto, se eu descomentar a segunda interseção, recebo o erro do compilador

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

Nas minhas pesquisas, me depareiessa questãoe o associadorelatório de erroda resposta. Tal como acontece com essa resposta, o último caminho nomeado picestá disponível fora da definição. Achei que isso poderia estar relacionado, mas clonei o repositório e tentei compilar com a correção, mas ainda obtive o mesmo resultado. Também tentei usar o name path .., mas isso não disponibilizou o caminho no ambiente da imagem principal.

Minha pergunta é: isso é uma manifestação do mesmo bug? Caso contrário, quais são as regras de nomenclatura para caminhos dentro de uma picdefinição?

Percebo que a coordenada ( -paqui) herda o picnome fora do escopo piccomo eu esperava e gostaria de referenciar o caminho da mesma maneira.


Motivação

Meu objetivo final é traçar uma linha até a interseção de dois caminhos definidos dentro de um arquivo gerado pic. Eu tenho um código Python que gera linhas de latitude e longitude ao longo de uma esfera. Eu gostaria de usar picvárias vezes em uma única imagem; portanto, gostaria de me referir aos caminhos com o picnome pai para calcular apenas as interseções que irão promover o que estou tentando mostrar. Como estou calculando os caminhos, eu poderia definir as coordenadas das interseções, mas gostaria de deixar o TikZ fazer o trabalho e isso me parece um exagero.

Responder1

Use name path global, que é feito para isso: "transmitir" caminhos fora de ambientes como escopos ou pics.

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

insira a descrição da imagem aqui

Se você quiser ter nomes exclusivos, basta acrescentar os nomes dos caminhos ao nome do arquivo 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}

(mesma saída)

Responder2

Aqui está um hack rápido, simplesmente colocando todos os caminhos em uma única foto.

Isso não responde à sua pergunta, mas garante que você não cometa mais erros.

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

captura de tela

informação relacionada