Fehlende Zahl, wird als Nullfehler behandelt, wenn for-Schleifen und Bedingungen in Tikz verwendet werden

Fehlende Zahl, wird als Nullfehler behandelt, wenn for-Schleifen und Bedingungen in Tikz verwendet werden

Ich fände es schön, wenn ich einen Code hätte, der durch Ändern bestimmter Parameter wie Höhe und Breite und das Einfärben von Zellen in Rot oder Grün eine Tabelle für mich generiert. Der Code, den ich habe, ist bereits eine Änderung von etwas, das ich gefunden habe, aber ich kann die farbigen Zellen nicht zum Laufen bringen. Der Fehler lautet „Fehlende Zahl, wird als Null behandelt.“ Ich fange gerade erst mit Tikz an und verstehe nicht viel.

\begin{figure}[H]
\centering
 \begin{tikzpicture}
[
    square/.style = {
        draw, 
        rectangle, 
        minimum size=\m, 
        outer sep=0, 
        inner sep=0, 
        font=\normalsize\bfseries,
        label={[anchor=north,yshift=1.1em,opacity=0.7]south:\scriptsize\label}
    },
]
\def\m{35pt}
\def\w{4}
\def\h{4}

% Array of personalized messages
\def\content{{
    {1, 0, 1, 1},
    {1, 1, 0, 0},
    {0, 0, 1, 0},
    {0, 1, 1, 1}
}}

% Separate arrays for x and y coordinates in greenCoords
\def\greenXCoords{{1, 1, 1, 1}} % x-coordinates
\def\greenYCoords{{1, 2, 3, 4}} % y-coordinates

% Y
\foreach \x in {1,...,\w}
    \foreach \y in {1,...,\h}
    {   
        % Check if the current coordinates match any green cells
        \foreach \i in {1,...,4}
        {
            \ifthenelse{\x=\greenXCoords[\i] \AND \y=\greenYCoords[\i]}
                {\def\fillColor{green!30}\break}
                {\def\fillColor{black!5}}
        }
        
        \pgfmathtruncatemacro{\label}{(\y-1) * \w + \x}
        \node [square, fill=\fillColor]  (Y\x,\y) at (\x*\m,-\y*\m) {\pgfmathparse{\content[\y-1][\x-1]}\pgfmathresult};
    }
\end{tikzpicture}
    \caption{Caption}
    \label{fig:enter-label}
\end{figure}

Tabelle erhalten

Antwort1

Die Array-Syntax \greenXCoords[\i]ist einePGFMath-Syntaxund nicht verstanden von \ifthenelse.

Sie müssen diese im Voraus bewerten, sagen wir

\pgfmathsetmacro\xTest{\greenXCoords[\i]}
\pgfmathsetmacro\yTest{\greenYCoords[\i]}
\ifthenelse{\x=\xTest \AND \y=\yTest}

oder verwenden Sie PGFMaths eigeneifthenelseFunktionoder verwenden Sie einen ganz anderen Ansatz für Arrays und Bedingungen.

Oder Sie konstruieren Ihre Tabelle, ohne so viele Arrays und Schleifen durchlaufen zu müssen. (Ein PGFMath-Array ist nicht die beste Datenstruktur.)


contentHier ist eine Lösung, die den Wert mithilfe ihrer eigenen Struktur (sie besteht bereits aus Zeilen und Spalten) direkt durchläuft .

Mit ein paar Stilen und Schlüsseln können Sie eine Tabelle mit beliebigem Inhalt, beliebiger Größe und beliebiger Kombination grüner Zellen erstellen.

Hier muss die Anzahl der Spalten (für die Berechnung der Beschriftung) angegeben werden, es könnte jedoch Lösungen geben, die dies automatisch ermitteln (aus der ersten/längsten Zeile?) oder einfach für jedes Element hochzählen, wodurch keine Lücken entstehen, wenn die Zeilen nicht alle die gleiche Anzahl Spalten haben.

Code

\documentclass[tikz]{standalone}
\tikzset{
  % let's do this in our own namespace
  my table/.cd,
  % initial values and settings
  content/.initial={{1, 0, 1, 1},
                    {1, 1, 0, 0},
                    {0, 0, 1, 0},
                    {0, 1, 1, 1}},
  size/.initial=35pt,
  columns/.initial=4,
  square/.style={
    shape=rectangle, draw, minimum size=\pgfkeysvalueof{/tikz/my table/size},
    outer sep=+0pt, inner sep=+0pt, fill=black!5, font=\normalsize\bfseries},
  label/.style={
    label={[anchor=south, font=\scriptsize, lightgray]south:{#1}}},
  % styles to set which rows, cols and cells should be green!30
  green rows/.style={green row/.list={#1}},
  green cols/.style={green col/.list={#1}},
  green cells/.style={green cell/.list={#1}},
  green row/.style={/tikz/my table/rowstyle #1/.append style={fill=green!30}},
  green col/.style={/tikz/my table/colstyle #1/.append style={fill=green!30}},
  green cell/.style={/tikz/my table/style #1/.append style={fill=green!30}}}

% the macro with one optional (!) argument
\newcommand*\PrintTable[1][]{%
  \tikz[
    my table/.cd,#1,content/.get=\myTableContent,
    % make the xyz coordinate system dependent on the size of your squares
    /tikz/x=\pgfkeysvalueof{/tikz/my table/size},
    /tikz/y=\pgfkeysvalueof{/tikz/my table/size}]
  \foreach[count=\myTableY from 0,
           count=\myTableYY from 1]\myTableRow in \myTableContent
    \foreach[count=\myTableX]\myTableCol in \myTableRow
      \node[
        my table/square,
        my table/label=\inteval{\myTableY*
          \pgfkeysvalueof{/tikz/my table/columns}+\myTableX},
        my table/rowstyle \myTableYY/.try,        % 1. row style
        my table/colstyle \myTableX/.try,         % 2. col style
        my table/style \myTableYY-\myTableX/.try, % 3. cell style
      ] at (\myTableX,-\myTableY) {\myTableCol};%
}
\begin{document}
\PrintTable[green cells={1-1, 1-2, 1-3, 1-4}]
\PrintTable[green row=1, columns=3, content={{  1,   2,   3},
                                             { 19,  20,  21},
                                             {123, 456, 789}}]
\end{document}

Ausgabe

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

verwandte Informationen