I am using TikZ with the libraries graphs and graphdrawing together with the grid layout to generate graphs where the nodes are placed automatically by libraries. Everything, except one thing, works pretty well. Because the standard node types (rectangle, diamond, ellipse...) do not match my needs in one special but frequently case, I need to create a custom Node - rather in the meening of a Graph-Node than a TikZ-Node.
So I tried to put a tikzpicture inside a node and create the needed shape. Outside the graph this works just as expected, but insided not at all.
The reason seems to be the inherited options from the tikzpicture/scope. To solve this, I tried to find a way by
- trying to prevend the inheritance. But did not find a way to do this.
- going back to the "default" layout inside the new tikzpicture inside the node. But did not find the name of the default layout to overwrite the inherited layout.
- using an own pgf-layer for that node.
- Matrices inside the Node (of which every single element is recognized as a node and therefore treated as a graph-node...)
- things I don't remember anymore...
None of the above things works. So my questions is: How can I let embedded nodes appear as one node for the TikZ Graphs Library? Or, as an alternative, is there any other way so solve this (creating an own node-shape with variable content)?
\RequirePackage{luatex85}
\documentclass[tikz,border=1pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes}
\usetikzlibrary{arrows,arrows.meta}
\usetikzlibrary{graphs,graphdrawing}
\usetikzlibrary{fit}
\usetikzlibrary{positioning}
\usegdlibrary{layered}
\newcommand{\ToNode}{edge[->, looseness=0.5, out=east, in=west]}
\tikzset{NodeStyle1/.style = {draw, anchor=east, rectangle, fill=black!10, text height=2ex, text depth=0.25ex, minimum height=3ex}}
\tikzset{NodeStyle3a/.style = { anchor=east, rectangle, text height=2ex, text depth=0.25ex, minimum height=3ex}}
\tikzset{NodeStyle3b/.style = {draw, anchor=east, rectangle, fill=yellow!20, minimum width=5em, text centered, inner sep=0, rounded corners}}
\tikzset{NodeStyleRaw/.style = { }}
\tikzset{PicureOptions/.style = {%
layered layout,
level sep=1.5cm,
level distance=0.0cm,
sibling sep=1.5em,
sibling distance=1.0cm,
grow'=right,
components go down left aligned
}}
\pgfdeclarelayer{sub1}
\pgfdeclarelayer{sub2}
\pgfsetlayers{sub2,sub1,main}
\newcommand{\NodeInputNumName}[2]{%
\begin{tikzpicture}
\begin{pgfonlayer}{main}
\node[NodeStyle3a] (number) {No. #1};
\node[NodeStyle3a, right = 0mm of number] (name) {#2};
\draw (number.north east) -- (number.south east);
\end{pgfonlayer}
\begin{pgfonlayer}{sub1}
\node[NodeStyle3b] (frame) [fit = (number) (name)] {};
\end{pgfonlayer}
\end{tikzpicture}
}
\begin{document}
\begin{tikzpicture}[]
\begin{scope}[PicureOptions]
\node[NodeStyle1] (A) {Graph-Node A};
\node[NodeStyle1] (B) {Graph-Node B};
\node[NodeStyle1] (C) {Graph-Node C};
\node[NodeStyleRaw] (D) {
\begin{tikzpicture}
\begin{pgfonlayer}{main}
\node[NodeStyle3a] (number) {No. X};
\node[NodeStyle3a, right = 0mm of number] (name) {Graph-Node D, inside Graph};
\draw (number.north east) -- (number.south east);
\end{pgfonlayer}
\begin{pgfonlayer}{sub1}
\node[NodeStyle3b] (frame) [fit = (number) (name)] {};
\end{pgfonlayer}
\end{tikzpicture}
};
\node (ABCD) {Result ABCD};
\draw (A) \ToNode (ABCD);
\draw (B) \ToNode (ABCD);
\draw (C) \ToNode (ABCD);
\draw (D) \ToNode (ABCD);
\end{scope}
%%%%%%%
\begin{scope}[]
\node[NodeStyleRaw] at (0cm, -5cm) () {
\begin{tikzpicture}
\begin{pgfonlayer}{main}
\node[NodeStyle3a] (number) {No. x};
\node[NodeStyle3a, right = 0mm of number] (name) {Graph-Node, outside graph};
\draw (number.north east) -- (number.south east);
\end{pgfonlayer}
\begin{pgfonlayer}{sub1}
\node[NodeStyle3b] (frame) [fit = (number) (name)] {};
\end{pgfonlayer}
\end{tikzpicture}
};
\end{scope}
%%%%%%%%%%
\begin{scope}[]
\node[NodeStyleRaw] at (0cm, -10cm) () {\NodeInputNumName{5}{Graph-Node as Command, outside Graph}};
\end{scope}
\end{tikzpicture}
\end{document}

tikzpictures which one shouldn't do. This explains many of the things that do not work. Please get rid of this and then also replace\tikzstyleby the correspondingtikzsetsyntax. – Jun 11 '19 at 12:51tikzstyleis now replaced bytikzset. I know that nestingtikzpictureis considered bad. It was just an attempt to create an independent area inside a graph. Because the nodes are auto-placed it is not possible placing them manually at specific coordinates, nor would it make sense, because the positions where they should be will change with every new node. If you can tell me an alternative or a hint to make it better, i will use that. – dimple mind Jun 11 '19 at 14:08\tikz...;inside atikzpicturebetter? – dimple mind Jun 11 '19 at 14:12\tikz...;and atikzpictureenvironment are equally bad, see the answers to https://tex.stackexchange.com/q/47377/121799. You may "prevent the inheritance" by using\saveboxes. – Jun 11 '19 at 16:13savebox. The other approach of that link, [...]For this sort of partial inheritance, the best approach is to ensure that the inner tikzpicture explicitly sets those values that it doesn't want to inherit and then leaves the rest alone.[...] is just the idea of my question's second point from. – dimple mind Jun 12 '19 at 05:46inner septo some value, TikZ will setinner xsepandinner ysepto these values. So it is less straightforward to "let some values" alone. The above is just a simple example, as usual the real life is more complex. – Jun 12 '19 at 05:50