Erstellen eines neuen Befehls für ein Zehnerrahmenraster mit Tikz

Erstellen eines neuen Befehls für ein Zehnerrahmenraster mit Tikz

Ich versuche, Zehnerrahmen zu erstellen, um die Addition von Zahlen zu modellieren. Ich fände es toll, wenn die \tensframe{#1}{#2}grünen Kreise Nr. 1 links beginnen und nach oben wachsen würden, dann die blauen Kreise Nr. 2, die vom Grün aus weitergehen und dann nach oben wachsen. Wenn Nr. 1 oder Nr. 1+Nr. 2 größer als 5 ist, muss es in die zweite Spalte übertragen werden. Weiß jemand, wie man das zum Laufen bringt?

\documentclass{article}
\usepackage{ifthen}
\usepackage{listofitems}
\usepackage{multicol}
\usepackage{tikz}
\usepackage{pgfplots}


\newcommand{\tensframe}[2]{\begin{tikzpicture}
    [%
        box/.style={rectangle,draw=black, minimum size=10mm},
    ]%

\foreach \x in {1,2}{
    \foreach \y in {1,...,5}
        \node[box] at (\x,\y){};
}

\foreach \x in {1,1}{
    \foreach \y in {1,...,#1}
      \filldraw[green] (\x,\y) circle (8pt);
}

\foreach \x in {1,1}{
   \foreach \y in {#1+1,...,5}
      \filldraw[blue] (\x,\y) circle (8pt);
}


    \foreach \y in {1,...,#2+#1-5}
      \filldraw[blue] (2,\y) circle (8pt);


\end{tikzpicture}}

\begin{document}
\tensframe{1}{5}
\vspace{1cm}

\tensframe{3}{5}

\vspace{1cm}

\tensframe{2}{1}
    \end{document}

\tensframe{1}{5}ist perfekt Bildbeschreibung hier eingeben

\tensframe{3}{5}In den Zellen (2,2) und (2,3) fehlen zwei blaue Kreise Bildbeschreibung hier eingeben

\tensframe{2}{1}ist nicht einmal definiert (ich glaube, weil ich keinen Wertebereich für das foreach ys habe), aber wenn es funktionieren würde, hätte es grüne Zellen in (1,1) und (1,2) und eine blaue Zelle in (1,3) und würde so aussehen: Bildbeschreibung hier eingeben

Weiß jemand, wie das codiert werden könnte? Vielen Dank

Antwort1

Nur eine Schleife. Zuerst wird der Knoten erstellt und benannt, und dieser Name wird verwendet, um ihn mit der entsprechenden Farbe zu füllen.

\documentclass{article}
\usepackage{tikz}

\newcommand{\tensframe}[2]{\begin{tikzpicture}
    [%
        box/.style={rectangle,draw=black, minimum size=10mm},
    ]%

\foreach \y in {1,...,5}{
    \foreach \x [evaluate=\x as \ni using int(5*(\x-1)+\y)] in {1,2}{
            \node[box] (\ni) at (\x,\y){};
            \ifnum\ni<\numexpr#1+1\relax
                     \filldraw[green] (\ni.center) circle (8pt);
            \else
                \ifnum\ni<\numexpr#1+#2+1\relax
                     \filldraw[blue] (\ni.center) circle (8pt);
                \fi
            \fi
            
    }
}
\end{tikzpicture}}

\begin{document}
\tensframe{1}{5}\ \tensframe{3}{5}\ \tensframe{2}{1}\ \tensframe{6}{2}
\end{document}

Bildbeschreibung hier eingeben

Update: Neuer Code zum Lösen von Kommentarfragen

Der folgende Code zeigt einen Vorschlag zur Lösung aktualisierter Fragen durch Kommentare: ein horizontales Schema und deren Positionierung.

In diesem Fall foreachwurde die Schleife für zwei verschiedene Befehle geändert, einer zeichnet das Raster ( tensh, tensv) und ein anderer füllt es ( filltens). Alle diese Befehle sollten innerhalb eines stehen, tikzpicturedas nicht Teil davon ist.

tens{v|h}Der Befehl hat einen obligatorischen Parameter, nämlich den Namen des matrixKnotens. Da das Raster jetzt ein ist node, kann es zur Positionierung anderer Knoten referenziert oder gefüllt werden. Der optionale Parameter wird zur Positionierung verwendet.

filltensDer Befehl hat drei obligatorische Parameter: Der erste ist der Name der Matrix, die mit Kreisen gefüllt werden soll, während der zweite und dritte die Anzahl der grünen und blauen Kreise darin angibt.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix, positioning}

\newcommand{\tensh}[2][]{%
    \matrix[matrix of nodes, inner sep, nodes in empty cells, 
        nodes={draw, minimum size=1cm, inner sep=.3333em},
        row sep=-\pgflinewidth, column sep=-\pgflinewidth, 
        ampersand replacement=\&, #1] (#2) {
    |(#2-1)| \& |(#2-2)| \& |(#2-3)| \& |(#2-4)| \& |(#2-5)|\\
    |(#2-6)| \& |(#2-7)| \& |(#2-8)| \& |(#2-9)| \& |(#2-10)|\\};
}

\newcommand{\tensv}[2][]{%
    \matrix[matrix of nodes, inner sep, nodes in empty cells, 
        nodes={draw, minimum size=1cm, inner sep=.3333em},
        row sep=-\pgflinewidth, column sep=-\pgflinewidth, 
        ampersand replacement=\&, #1] (#2){
    |(#2-5)| \& |(#2-10)| \\ |(#2-4)| \& |(#2-9)| \\ 
    |(#2-3)| \& |(#2-8)|  \\ |(#2-2)| \& |(#2-7)| \\ 
    |(#2-1)| \& |(#2-6)|\\};
}

\newcommand{\filltens}[3]{%
    \foreach \i in {1,...,#2}
        \filldraw[green] (#1-\i.center) circle (8pt);
    \foreach \i [evaluate=\i as \ni using int(#2+\i)] in {1,...,#3}
        \filldraw[blue] (#1-\ni.center) circle (8pt);
}

\begin{document}

\begin{tikzpicture}
\tensh{a}
\tensv[above = 5mm of a.north east, anchor=south east]{b}
\tensh[right = 5mm of b.south east, anchor=south west] {c}
\tensv[right = 5mm of a.north east, anchor=north west]{d}
\filltens{a}{2}{4}
\filltens{b}{5}{3}
\filltens{c}{7}{2}
\filltens{d}{6}{1}
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

Antwort2

BEARBEITEN: Fehlerbehebung

Mit expl3, ich weiß nicht, ob das Sie interessiert

%https://tex.stackexchange.com/questions/661181/creating-newcommand-for-a-tens-frame-grid-using-tikz
\documentclass{article}
\usepackage{tikz}
\ExplSyntaxOn
\NewDocumentCommand{\tensframe}{ m m }
{
\begin{tikzpicture}
  [%
  box/.style={rectangle,draw=black, minimum~size=10mm},
  ]%
  \foreach \x in {1,2}
    {
      \foreach \y in {1,...,5}
      \node[box] at (\x,\y){};
    }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \int_step_inline:nn { #1 }
    {
      \int_compare:nNnTF {##1} < {6}
        {
          \int_set:Nn \l_tmpa_int { 1 }
          \int_set:Nn \l_tmpb_int { ##1 }
        }
        {
          \int_set:Nn \l_tmpa_int { 2 }
          \int_set:Nn \l_tmpb_int { \int_eval:n { ##1 - 5 } }
        }
      \filldraw[green] (\l_tmpa_int,\l_tmpb_int) circle (8pt);
    }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \int_step_inline:nn { #2 }
    {
      \int_compare:nNnTF {#1+##1} < {6}
      {
        \int_set:Nn \l_tmpa_int { 1 }
        \int_set:Nn \l_tmpb_int { \int_eval:n { #1+##1 } }
      }
      {
        \int_set:Nn \l_tmpa_int { 2 }
        \int_set:Nn \l_tmpb_int { \int_eval:n { #1+##1 - 5 } }
      }
      \filldraw[blue] (\l_tmpa_int,\l_tmpb_int) circle (8pt);    
    }
\end{tikzpicture}
}
\ExplSyntaxOff
\begin{document}
\tensframe{1}{5}
\vspace{1cm}

\tensframe{3}{5}

\vspace{1cm}

\tensframe{2}{1}

\vspace{1cm}

\tensframe{6}{4}

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen