Rutas con nombre dentro de un tikz/pic

Rutas con nombre dentro de un tikz/pic

Estoy tratando de comprender el comportamiento de denominación de las rutas dentro de una picdefinición. Considera lo siguiente

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

En este ejemplo, las cuatro líneas están dibujadas correctamente. Además, la intersección no comentada está dibujada correctamente; sin embargo, si descomento la segunda intersección, aparece el error del compilador.

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

De mis búsquedas me encontréesta preguntay el asociadoinforme de errorde la respuesta. Al igual que con esa respuesta, la última ruta nombrada en picestá disponible fuera de la definición. Pensé que esto podría estar relacionado, pero cloné el repositorio e intenté compilar con la solución, pero sigo obteniendo el mismo resultado. También intenté usar name path .., pero eso no hizo que la ruta estuviera disponible en el entorno de la imagen principal.

Mi pregunta es: ¿Es esto una manifestación del mismo error? Si no, ¿cuáles son las reglas de nomenclatura para las rutas dentro de una picdefinición?

Noto que la coordenada ( -paquí ) hereda el picnombre fuera del alcance de piccomo esperaba y me gustaría hacer referencia a la ruta de la misma manera.


Motivación

Mi objetivo final es trazar una línea en la intersección de dos caminos definidos dentro de un archivo generado pic. Tengo un código Python que genera las líneas de latitud y longitud a lo largo de una esfera. Me gustaría utilizar picvarias veces dentro de una sola imagen; por lo tanto, me gustaría hacer referencia a las rutas con el picnombre principal para calcular solo aquellas intersecciones que avanzarán en lo que estoy tratando de mostrar. Como estoy calculando los caminos, podría definir las coordenadas de las intersecciones, pero me gustaría dejar que TikZ hiciera el trabajo y eso me parece excesivo.

Respuesta1

Utilice name path global, que está hecho para esto: "transmitir" rutas fuera de entornos como ámbitos o fotografías.

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

ingrese la descripción de la imagen aquí

Si desea tener nombres únicos, simplemente anteponga los nombres de las rutas al nombre del archivo 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}

(misma salida)

Respuesta2

Aquí un truco rápido: simplemente coloque cada ruta en una sola imagen.

Esto no responde a su pregunta, pero garantiza que ya no cometa ningún error.

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

información relacionada