goLaTeX - Mein LaTeX-Forum

Mein LaTeX-Forum


Login  | Registrieren
Forum
      Option
[Erweitert]
  • Diese Seite weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Generische Farbwahl in Tikzpictures

 

Anderesio
Forum-Newbie
Forum-Newbie

Beiträge: 6
Anmeldedatum: 06.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.06.2017, 18:15     Titel: Generische Farbwahl in Tikzpictures
  Antworten mit Zitat      
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:

Code • Öffne in Overleaf

\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:



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:

Code • Öffne in Overleaf

\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]

mbsp.log
 Beschreibung:

Download
 Dateiname:  mbsp.log
 Dateigröße:  81.33 KB
 Heruntergeladen:  9 mal
Private Nachricht senden Benutzer-Profile anzeigen

esdd
Forum-Meister
Forum-Meister

Beiträge: 2094
Anmeldedatum: 07.02.10
Wohnort: Stutensee
Version: MiKTeX 2.9
     Beitrag Verfasst am: 17.06.2017, 02:23     Titel:
  Antworten mit Zitat      
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.

Code • Öffne in Overleaf
\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.


Code • Öffne in Overleaf
\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:



Edit: Im ersten Beispiel arrows Bibliothek ergänzt.

gl_farbwahl.png
 Beschreibung:

Download
 Dateiname:  gl_farbwahl.png
 Dateigröße:  6.68 KB
 Heruntergeladen:  7 mal


Zuletzt bearbeitet von esdd am 17.06.2017, 11:08, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen

Anderesio
Forum-Newbie
Forum-Newbie

Beiträge: 6
Anmeldedatum: 06.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2017, 03:12     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen

Bartman
Forum-Meister
Forum-Meister


Beiträge: 798
Anmeldedatum: 16.07.09
Wohnort: Hessische Provinz
Version: Windows 7 64 Bit MiKTeX 2.9 32-Bit
     Beitrag Verfasst am: 17.06.2017, 07:14     Titel:
  Antworten mit Zitat      
@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.
Private Nachricht senden Benutzer-Profile anzeigen

esdd
Forum-Meister
Forum-Meister

Beiträge: 2094
Anmeldedatum: 07.02.10
Wohnort: Stutensee
Version: MiKTeX 2.9
     Beitrag Verfasst am: 17.06.2017, 11:14     Titel:
  Antworten mit Zitat      
Anderesio hat Folgendes 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.
Private Nachricht senden Benutzer-Profile anzeigen

Neues Thema eröffnen Neue Antwort erstellen



Options and Permissions
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen
.

goLaTeX ist Teil der goForen
goForen.de goMATLAB.de goLaTeX.de goPCB.de


  Impressum | FAQ | goLaTeX RSS Button RSS-Feed

Copyright © 2008 - 2017 goLaTeX.de