![Графическая нотация Пенроуза с TikZ](https://rvso.com/image/330728/%D0%93%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D0%BD%D0%BE%D1%82%D0%B0%D1%86%D0%B8%D1%8F%20%D0%9F%D0%B5%D0%BD%D1%80%D0%BE%D1%83%D0%B7%D0%B0%20%D1%81%20TikZ.png)
Как нарисовать такую тензорную сеть с помощью TikZ?
Возможно, стоит добавить несколько слов о них.
Я очень хорошо разбираюсь в LaTeX, но все еще новичок в TikZ. Я буду рисовать такие формы в большом объеме и надеюсь узнать шаблон для них. Спасибо!
РЕДАКТИРОВАТЬ
Вот что я сделал до сих пор. Я не уверен, как соединить линию на указанной границе, как правильно разместить узел (относительное положение или координаты?) и как разместить токены в указанных позициях.
\documentclass[tikz,multi,border=10pt]{standalone}
\usetikzlibrary{shapes.geometric,positioning}
\begin{document}
\begin{tikzpicture}
[
triangle/.style = {regular polygon, regular polygon sides=3, draw=black, fill=green!60!black, inner sep=0pt, minimum size=2cm},
border rotated/.style = {shape border rotate=180},
rectangular/.style={fill=brown!80!black, rectangle, rounded corners = 5pt, draw=black, inner sep=0pt, minimum width=4.5cm, minimum height=1cm},
square/.style={fill=blue!60!black, rectangle, draw=black, inner sep=0pt, minimum size = 1cm}
]
\node[square] (1) {};
\node[triangle, border rotated] (2) [below left = 1cm of 1] {};
\node[triangle, border rotated] (3) [below right = 1cm of 1] {};
\node[rectangular] (4) [below=3cm of 1] {};
\node[square] (7) [below = 7cm of 1]{};
\node[triangle] (5) [above left = 1cm of 7] {};
\node[triangle] (6) [above right = 1cm of 7]{};
\draw (2.35) -- +(0,0.2) -- (1);
\draw (2.145) to [bend right=45] (5.215);
\draw (3.145) -- +(0,0.2) -- (1);
\end{tikzpicture}
\end{document}
решение1
Я не совсем уверен, что понимаю все 3 пункта, о которых вы спросили. Например, я не уверен, что относится к 'токенам', хотя предполагаю, что это закрашенные черные круги.
Как правило, относительное позиционирование упрощает последующую модификацию кода. Например, проще добавлять новые элементы в диаграмму и автоматически настраивать другие элементы. Но на самом деле это вопрос того, что лучше всего подходит в конкретном случае. Часто абсолютное позиционирование быстрее реализовать, например, для единичного случая, хотя это делает код менее гибким.
Я переименовал triangle
в , triangular
чтобы не перезаписывать triangle
форму.
В приведенном ниже коде показан один из способов:
- соедините треугольники из соответствующих точек;
- соедините треугольники с прямоугольником от/до соответствующих точек;
- добавьте к прямоугольнику черные круги;
- добавьте изогнутую стрелку с надписью
s'
.
Надеюсь, это позволит вам продолжить развивать то, что у вас уже есть.
\documentclass[tikz,multi,border=10pt]{standalone}
\usetikzlibrary{shapes.geometric,positioning}
\begin{document}
\begin{tikzpicture}
[
triangular/.style = {regular polygon, regular polygon sides=3, draw=black, fill=green!60!black, inner sep=0pt, minimum size=2cm},
border rotated/.style = {shape border rotate=180},
rectangular/.style={fill=brown!80!black, rectangle, rounded corners = 5pt, draw=black, inner sep=0pt, minimum width=4.5cm, minimum height=1cm},
square/.style={fill=blue!60!black, rectangle, draw=black, inner sep=0pt, minimum size = 1cm}
]
\node[square] (1) {};
\node[triangular, border rotated] (2) [below left = 1cm of 1] {};
\node[triangular, border rotated] (3) [below right = 1cm of 1] {};
\node[rectangular] (4) [below=3cm of 1] {};
\node[square] (7) [below = 7cm of 1]{};
\node[triangular] (5) [above left = 1cm of 7] {};
\node[triangular] (6) [above right = 1cm of 7]{};
\draw (2.35) -- +(0,0.2) -- (1);
\draw (2.145) .. controls +(-7.5mm,35mm) and +(-7.5mm,-35mm) .. (5.215);
\draw (3.145) -- +(0,0.2) -- (1);
\draw (5.-35) -- +(0,-0.2) -- (7);
\draw (6.-145) -- +(0,-0.2) -- (7);
\draw (3.35) .. controls +(7.5mm,35mm) and +(7.5mm,-35mm) .. (6.-35);
\draw (2.south) -- (4.north -| 2.south) (3.south) -- (4.north -| 3.south) (4.south -| 5.north) -- (5.north) (4.south -| 6.north) -- (6.north);
\path (2.south) -- node [fill, circle] {} (5.north);
\path (3.south) -- node [fill, circle] {} (6.north);
\draw [<-] (4.north west) [bend right] to ++(-10mm,10mm) node [anchor=south] {$s'$};
\end{tikzpicture}
\end{document}