Это не ново здесь. Но с решениями в:
- Проблема с наложением, когда tikzpicture находится внутри другого tikzpicture
- Как разместить картинку TikZ внутри узла?
Я не смог заставить это работать.
По сути, я хочу определить команду, которая будет картинкой и может использоваться внутри другой картинки как узел, аналогично тому, как определяется форма. Так что я могу повторно использовать код, потому что каждая картинка имеет много элементов. Смотрите MWE:
\documentclass{standalone}
\usepackage{ellipsis}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{decorations.pathreplacing}
\usetikzlibrary{shapes.geometric}
\newcommand{\MUE}[1]{%
\begin{tikzpicture}
\node[draw, shape = rectangle, minimum width=15mm, minimum height=7.5mm] (box) {#1};
\draw ($(box.south west)+(0.25,0)$) circle (4pt);
\draw ($(box.south east)-(0.25,0)$) circle (4pt);
\draw[fill=black] ($(box.south west)+(0.25,0)$) circle (1pt);
\draw[fill=black] ($(box.south east)-(0.25,0)$) circle (1pt);
\draw ($(box.north west)+(0.25,0)$) -- +(0,0.25) node[midway] (ant1) {};
\draw ($(box.north east)-(0.25,0)$) -- +(0,0.25) node[midway] (ant2) {};
\node at ($(ant1)!0.5!(ant2)$) {\dots};
\draw (ant1.north) -- +(135:0.25);
\draw (ant1.north) -- +(45:0.25);
\draw (ant2.north) -- +(135:0.25);
\draw (ant2.north) -- +(45:0.25);
\end{tikzpicture}
}
\newcommand{\MBS}[1]{%
\begin{tikzpicture}
\node[draw, shape = dart, shape border rotate = 90, minimum width = 10mm, minimum height = 10mm] (base) {#1};
\draw[line join = round] (base.110) -- (base.70) -- (base.north west) -- (base.north east) -- cycle;
\draw ($(base.north)+(0.5,0)$) -- +(0,0.25) node[midway] (ant1) {};
\draw ($(base.north)-(0.5,0)$) -- +(0,0.25) node[midway] (ant2) {};
\draw[cap = rect, line join = round] (ant1.south) -- (ant2.south);
\node at ($(ant1)!0.5!(ant2)$) {\dots};
\draw (ant1.north) -- +(135:0.25);
\draw (ant1.north) -- +(45:0.25);
\draw (ant2.north) -- +(135:0.25);
\draw (ant2.north) -- +(45:0.25);
\end{tikzpicture}
}
\begin{document}
\begin{tikzpicture}
\node[draw, shape = circle, fill = yellow!30] at (0,0) (test1) {\MBS{BS}};
\node[draw, shape = circle, fill = blue!30] at (3,3) (test2) {\MUE{UE1}};
\node[draw, shape = circle, fill = blue!30] at (3,-3) (test3) {\MUE{UE2}};
\draw[->] (test1) -- (test2);
\draw[->] (test1) -- (test3);
\end{tikzpicture}
\end{document}
Как видно, антенны на картинке размещены некорректно, потому что я использую draw, shape = circle
в узлах второй картинки. Кроме того, если я добавлю, inner sep = 0pt
результат будет еще хуже. Как я могу использовать такой тип вложенности внутри TikZ?
решение1
Не используйте здесь узлы; ни для обозначения позиций на пути ( coordinate
для этого можно использовать ), ни для возврата к верхней точке на этой линии, просто используйте путь, который вы уже использовали там (вам разрешено использовать путь после node
), или просто пересчитайте координаты или используйте перемещение туда (исключите ) --
в вашем пути.
Я также предоставляю antenna
insert path
стиль, который принимает один аргумент, а именно номер координаты, остальное представляет собой смесь относительных ( ), а также относительных и операторов +
перемещения ( ).++
То же самое справедливо и для \MBS
макроса. Здесь я решил нарисовать dart
с outer sep
нулевым значением, так что якоря лежат в середине линии (что должно противоречить рисованию части антенны (обратите внимание, что , yshift=.8pt
которая исходит изширина линии, используемая со thick
стилем).
Я прокомментировал первоначальное размещение \dots
и добавил другой способ размещения точек, а именно с помощью label
( \MUE
) и узла на пути ( \MBS
).
Можете смело не использовать это.
Код
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\usetikzlibrary{decorations.pathreplacing,decorations.markings,shapes.geometric}
\tikzset{antenna/.style={insert path={-- coordinate (ant#1) ++(0,0.25) -- + (135:0.25) + (0,0) -- +(45:0.25)}}}
\newcommand{\MUE}[1]{%
\begin{tikzpicture}[every node/.append style={rectangle,minimum width=+0pt}]
\node[draw, shape = rectangle, minimum width=15mm, minimum height=7.5mm,label=\dots] (box) {#1};
\draw ([xshift=.25cm] box.south west) circle (4pt)
([xshift=-.25cm]box.south east) circle (4pt);
\fill ([xshift=.25cm] box.south west) circle (1pt)
([xshift=-.25cm]box.south east) circle (1pt);
\draw ([xshift=.25cm] box.north west) [antenna=1];
\draw ([xshift=-.25cm]box.north east) [antenna=2];
%\node at ($(ant1)!0.5!(ant2)$) {\dots};
\end{tikzpicture}}
\newcommand{\MBS}[1]{%
\begin{tikzpicture}
\node[draw, shape = dart, shape border rotate = 90, minimum width = 10mm, minimum height = 10mm,outer sep=+0pt] (base) {#1};
\draw[line join = bevel] (base.110) -- (base.70) -- (base.north west) -- (base.north east) -- cycle;
\draw[line cap=rect] ([xshift=.5cm,yshift=.8pt] base.north) [antenna=1];
\draw[line cap=rect] ([yshift=.8pt]ant1 |- base.north) -- node[above,shape=rectangle]{\dots} ([xshift=-.5cm,yshift=.8pt]base.north) [antenna=2];
%\node at ($(ant1)!0.5!(ant2)$) {\dots};
\end{tikzpicture}}
\begin{document}
\begin{tikzpicture}
\node[draw, shape = circle, fill = yellow!30] at (0,0) (test1) {\MBS{BS}};
\node[draw, shape = circle, fill = blue!30] at (3,3) (test2) {\MUE{UE1}};
\node[draw, shape = circle, fill = blue!30] at (3,-3) (test3) {\MUE{UE2}};
\draw[->] (test1) -- (test2);
\draw[->] (test1) -- (test3);
\end{tikzpicture}
\end{document}