
Я пытаюсь найти элегантное решение, чтобы сделать несколько таких фигур.
Лучшее, что я придумал, — это нарисовать разделенный прямоугольник в стиле
\tikzset{
entry/.style={
draw,
rectangle split,
rectangle split parts=2,
}
(взято изздесь). Но я не могу придумать элегантный способ добавить третью часть, кроме как создавать каждый раз дополнительный узел и правильно его позиционировать. Я хочу иметь возможность создавать узлы с помощью однострочного кода, например \node [entry] (A) {1001 \nodepart{second} 1010 \nodepart{third} 2};
, но я не уверен, как это сделать.
решение1
Ну, если вы открыты для небольших изменений в синтаксисе и некоторого хакерства, вы можете создать узлы Франкенштейна, злоупотребляя опциями TikZ label
, pin
и .append after command
Форма rectangle split
уже близка к тому, что вам нужно. Однако она не позволяет использовать другой стиль линии для разделителя. Однако мы можем вообще запретить рисование разделителя и указать свой собственный путь. Это делается с помощью операции с ребром в append after command
.
Прикрепленный прямоугольник можно нарисовать с помощью опции label
. Правильное позиционирование включает сдвиг, чтобы границы перекрывали друг друга, что делается с помощью опции outer xsep
. Чтобы разрешить ссылки на якоря этого нового узла, мы также даем ему имя, которое формируется из имени основного узла.
Вот MWE:
\documentclass[border=1mm,tikz]{standalone}
\usetikzlibrary{shapes.multipart}
\tikzset{entry/.style={
% appearance settings for the main node
draw,
rectangle split,
rectangle split parts=2,
rectangle split draw splits=false,
% draw the small attached node
label={[name=label of \tikzlastnode,anchor=north west,draw,outer xsep=-.5\pgflinewidth]north east:#1},
% draw the split using a dashed line
append after command={(\tikzlastnode.text split west) edge[draw,dashed] (\tikzlastnode.text split east)},
}}
\begin{document}
\begin{tikzpicture}
\node[entry=2] (myentry) at (0,0) {1001 \nodepart{second} 1010};
% examples of how we can refer to coordinates of this monster
\node[coordinate,pin=4:a] at (label of myentry.south east) {};
\node[coordinate,pin=4:b] at (myentry.south east) {};
\end{tikzpicture}
\end{document}
Предостережение в том, что вы не можете использовать якоря дополнительного узла во время размещения конструкции. Кроме того, содержимое этого узла является опцией стиля, а не реальной частью узла.