Именованные пути внутри 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}

Скриншот

Связанный контент