Generische Farbwahl in Tikzpictures

Tabellen und Grafiken erstellen und anordnen


Anderesio
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: Sa 6. Jun 2015, 20:49

Generische Farbwahl in Tikzpictures

Beitrag von Anderesio »

Hallo,

ich möchte gern innerhalb eines Nodes ein Tikzpicture anlegen, wobei ich bestimmte Farben des Bildes generisch halten kann.
Aus Testzwecken habe ich Mein Bild zunächst ohne der generischen Variante geschrieben:
\documentclass{scrartcl}

%encoding and language
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}

%diagrams and graphics
\usepackage[svgnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{automata, arrows, positioning, matrix, calc, arrows}
\usepackage{color}
\usepackage{graphicx}

\begin{document}

\begin{tikzpicture}[->,>=stealth',shorten >=1pt, auto, thick, every text node part/.style={align=center}]
	\tikzstyle{cyk} = [rectangle, draw=none, minimum width=.1cm, minimum height=.1cm]
	%States
	\node[cyk, label=above:$s_1$] (1)
	{
		\begin{tikzpicture}
		\matrix(M)[matrix of math nodes,row sep=-\pgflinewidth,column sep=-\pgflinewidth, nodes={draw,minimum width=2em,minimum height=2em,font=\strut}]
		{
			\node[fill=Green]{}; & \node[fill=White]{}; & \node[fill=White]{}; & \node[fill=Green]{}; \\ 
         	\node[fill=White]{}; & \node[fill=Red]{}; & \node[fill=Green]{}; \\ 
         	\node[fill=Green]{}; & \node[fill=Green]{}; \\
         	\node[fill=Green]{}; \\ 
		};
		\end{tikzpicture}
	};
	\node[cyk, label=above:$s_2$] (2) [right=of 1]
	{
		\begin{tikzpicture}
		\matrix(M)[matrix of math nodes,row sep=-\pgflinewidth,column sep=-\pgflinewidth, nodes={draw,minimum width=2em,minimum height=2em,font=\strut}]
		{
			\node[fill=Green]{}; & \node[fill=White]{}; & \node[fill=Green]{}; & \node[fill=Green]{}; \\ 
         	\node[fill=White]{}; & \node[fill=Red]{}; & \node[fill=Green]{}; \\ 
         	\node[fill=Green]{}; & \node[fill=Green]{}; \\
         	\node[fill=Green]{}; \\ 
		};
		\end{tikzpicture}
	};
	%Transitions
	\path[->] (1) edge (2);
\end{tikzpicture}

\end{document}
Dies erzeugt auch meine gewünschte Ausgabe:

Bild

Allerdings scheiter ich nun daran die Farben meiner Tabellen zu parametrisieren.
Ich habe in diversen Foren gestöbert, jedoch keine Lösung gefunden.
Mein kläglicher Versuch ist der folgende:
\documentclass{scrartcl}

%encoding and language
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}

%diagrams and graphics
\usepackage[svgnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{automata, arrows, positioning, matrix, calc, arrows}
\usepackage{color}
\usepackage{graphicx}

\begin{document}

\newcommand{\cykstate}[5]
{
	\foreach[count=\i] \j in {#1, #2, #3, #4, #5}
	{
		\ifcase\j
			\cellcolor\i=Red 
		\or
			\cellcolor\i=Green
		\else
			\cellcolor\i=White 
		\fi
	}
	\begin{tikzpicture}
		\matrix(M)[matrix of math nodes,row sep=-\pgflinewidth,column sep=-\pgflinewidth, nodes={draw,minimum width=2em,minimum height=2em,font=\strut}]
		{
			\node[fill=Green]{}; & \node[fill=\cellcolor5]{}; & \node[fill=\cellcolor3]{}; & \node[fill=Green]{}; \\ 
         	\node[fill=\cellcolor4]{}; & \node[fill=\cellcolor2]{}; & \node[fill=Green]{}; \\ 
         	\node[fill=\cellcolor1]{}; & \node[fill=Green]{}; \\
         	\node[fill=Green] \\ 
		};
	\end{tikzpicture}
}

\begin{tikzpicture}[->,>=stealth',shorten >=1pt, auto, thick, every text node part/.style={align=center}]
	\tikzstyle{cyk} = [rectangle, draw=none, minimum width=.1cm, minimum height=.1cm]
	%States
	\node[cyk, label=above:$s_1$] (1) {\cykstate{1}{0}{2}{2}{2}};
	\node[cyk, label=above:$s_2$] (2) [right=of 1] {\cykstate{1}{0}{1}{2}{2}};
	%Transitions
	\path[->] (1) edge (2);
\end{tikzpicture}

\end{document}
Die Log-Datei sagt mir, dass eine nicht definierte Kontrollsequenz vorliegt (beim If-Statement).
Jedoch kann ich den Fehler nicht sehen.
Ich habe die Log-Datei beigefügt und wäre sehr dankbar, wenn mir jemand helfen könnte.[/img][/code]
Dateianhänge
mbsp.log
(81.33 KiB) 244-mal heruntergeladen

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Zunächst: tikzpicture Umgebungen sollte man nicht verschachteln. Das ist auch überhaupt nicht nötig, da \matrix ebenfalls ein Node ist und sowohl einen Namen als auch ein Label erhalten und positioniert werden können.
\documentclass{scrartcl} 
%encoding and language 
\usepackage[utf8]{inputenc} 
\usepackage[T1]{fontenc} 
\usepackage[english]{babel} 

%diagrams and graphics 
\usepackage[svgnames]{xcolor} 
\usepackage{tikz}% lädt auch xcolor, graphicx, ...
\usetikzlibrary{positioning, matrix, arrows} 

\begin{document} 
\begin{tikzpicture}[->,>=stealth',shorten >=1pt, auto, thick, every text node part/.style={align=center}] 
\tikzset{
  cyk/.style = {
    matrix of math nodes,
    row sep=-\pgflinewidth,column sep=-\pgflinewidth,
    nodes={draw,minimum size=2em,font=\strut},
    nodes in empty cells
  }
}
\matrix[cyk, name=M1, label=above:$s_1$] 
{ 
|[fill=Green]| & |[fill=White]|& |[fill=White]| & |[fill=Green]| \\ 
|[fill=White]| & |[fill=Red]|  & |[fill=Green]| \\ 
|[fill=Green]| & |[fill=Green]| \\ 
|[fill=Green]| \\ 
}; 
\matrix[cyk, name=M2, right=of M1, label=above:$s_2$] 
{ 
|[fill=Green]| & |[fill=White]| & |[fill=Green]| & |[fill=Green]| \\ 
|[fill=White]| & |[fill=Red]|   & |[fill=Green]| \\ 
|[fill=Green]| & |[fill=Green]| \\ 
|[fill=Green]| \\ 
}; 
\path (M1) edge (M2); 
\end{tikzpicture} 
\end{document} 
Wenn Du \matrix in einen Befehl packst, dann kannst Du dort nicht & als Spaltentrenner verwenden, sondern musst einen Ersatz definieren. Außerdem musst Du sicher stellen, dass Deine Farben auch noch außerhalb der \foreach definiert sind.

\documentclass{scrartcl} 
%encoding and language 
\usepackage[utf8]{inputenc} 
\usepackage[T1]{fontenc} 
\usepackage[english]{babel} 

%diagrams and graphics 
\usepackage[svgnames]{xcolor} 
\usepackage{tikz}% lädt auch xcolor, graphicx, ...
\usetikzlibrary{positioning, matrix, arrows} 

\tikzset{
  cyk/.style = {
    matrix of math nodes,
    row sep=-\pgflinewidth,column sep=-\pgflinewidth,
    nodes={draw,minimum size=2em,font=\strut},
    nodes in empty cells
  }
}

\newcommand{\cykstate}[2][]{%
  \foreach[count=\i] \j  in {#2}
    {%
      \ifcase \j
        \xglobal\colorlet{cellcolor\i}{Red}%
      \or
        \xglobal\colorlet{cellcolor\i}{Green}%
      \or
        \xglobal\colorlet{cellcolor\i}{White}%
      \fi
    }%
  \matrix[cyk, ampersand replacement=\&, #1] 
  { 
  |[fill=cellcolor1]| \& |[fill=cellcolor2]| \& |[fill=cellcolor3]| \& |[fill=cellcolor4]| \\ 
  |[fill=cellcolor5]| \& |[fill=cellcolor6]| \& |[fill=cellcolor7]| \\ 
  |[fill=cellcolor8]| \& |[fill=cellcolor9]| \\ 
  |[fill=cellcolor10]| \\ 
  };%
}

\begin{document} 
\begin{tikzpicture}[->,>=stealth',shorten >=1pt, auto, thick, every text node part/.style={align=center}] 
\cykstate[name=M1, label=above:$s_1$]{1,2,2,1,2,0,1,1,1,1} 
\cykstate[name=M2, right=of M1, label=above:$s_2$]{1,2,1,1,2,0,1,1,1,1}
\cykstate[name=M3, right=of M2, label=above:$s_3$]{1,1,1,1,2,0,1,1,1,1}
\path
  (M1) edge (M2)
  (M2) edge (M3)
; 
\end{tikzpicture} 
\end{document}
Ergebnis:

Bild

Edit: Im ersten Beispiel arrows Bibliothek ergänzt.
Dateianhänge
gl_farbwahl.png
gl_farbwahl.png (6.68 KiB) 1248 mal betrachtet
Zuletzt geändert von esdd am Sa 17. Jun 2017, 11:08, insgesamt 1-mal geändert.

Anderesio
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: Sa 6. Jun 2015, 20:49

Beitrag von Anderesio »

Vielen Dank für die Lösung.

Die verschachtelte tikz-Umgebung hatte ich ursprünglich verwendet, da ich meine mal gelesen zu haben, dass man sich innerhalb des {}-Blocks vom Node nicht mehr in einer tikz-Umgebung befindet.
Dass die Matrix selbst ein Node ist, vereinfacht das allerdings.

Die Lösung mit einer Liste als Parameter statt mehreren einzelne Parameter erscheint mir auch um einiges eleganter.

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2456
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Beitrag von Bartman »

@esdd

In Deinem ersten Beispiel fehlt die arrows-Bibliothek.

@Anderesio

Ein paar eher "kosmetische" Hinweise meinerseits:

minimum width=2em,minimum height=2em darf als minimum size=2em zusammengefasst werden.

Wenn Deine Quadrate nicht mit mathematischem Inhalt belegt werden, reicht auch matrix of nodes.

Der Pfeil nach \path darf entfallen, weil er zuvor schon für die ganze Umgebung eingerichtet wurde.

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Anderesio hat geschrieben:Vielen Dank für die Lösung.

Die verschachtelte tikz-Umgebung hatte ich ursprünglich verwendet, da ich meine mal gelesen zu haben, dass man sich innerhalb des {}-Blocks vom Node nicht mehr in einer tikz-Umgebung befindet.
Du befindest Dich zwar nicht mehr in der TikZ Umgebung, aber die Optionen der äußeren Umgebung werden an die innere und deren Nodes vererbt. Siehe dazu auch Wie kann ich TikZ nodes verschachteln?

@Bartman Danke, die fehlende Bibliothek habe ich jetzt noch in dem Beispiel ergänzt.

Antworten