Criando novo comando para uma grade de dezenas de quadros usando tikz

Criando novo comando para uma grade de dezenas de quadros usando tikz

Estou tentando criar quadros de dezenas para modelar a adição de números. Eu adoraria que \tensframe{#1}{#2}mostrasse os círculos verdes nº 1 começando à esquerda e crescendo, depois os círculos azuis nº 2 continuando a partir do verde e subindo. Se #1 ou #1+#2 for maior que 5, ele precisará ser transferido para a segunda coluna. Alguém sabe como fazer isso funcionar?

\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}é perfeito insira a descrição da imagem aqui

\tensframe{3}{5}faltam dois círculos azuis nas células (2,2) e (2,3) insira a descrição da imagem aqui

\tensframe{2}{1}nem está definido (acho que porque não tenho um intervalo de valores para o foreach ys), embora se estivesse funcionando teria células verdes em (1,1) e (1,2) e uma célula azul em (1,3) e fica assim: insira a descrição da imagem aqui

Alguém sabe como isso pode ser codificado? Muito obrigado

Responder1

Apenas um loop. Primeiro o nó é criado e nomeado, e este nome é usado para preenchê-lo com a cor correspondente.

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

insira a descrição da imagem aqui

Atualização: Novo código para resolver questões de comentários

O código a seguir mostra uma proposta para resolver questões atualizadas por meio de comentários: um esquema horizontal e seu posicionamento.

Neste caso, o foreachloop foi alterado para dois comandos diferentes, um irá desenhar a grade ( tensh, tensv) e outro irá preenchê-la ( filltens). Todos esses comandos devem estar dentro de um tikzpicturearquivo que não faz parte deles.

tens{v|h}O comando possui um parâmetro obrigatório que é o nome do matrixnó. Como a grade agora é um node, ela pode ser referenciada para posicionamento de outros nós ou ser preenchida. O parâmetro opcional será usado para posicionamento.

filltensO comando possui três parâmetros obrigatórios, o primeiro é o nome da matriz a ser preenchida com círculos, enquanto o segundo e o terceiro são o número de círculos verdes e azuis dentro dela.

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

insira a descrição da imagem aqui

Responder2

EDITAR: correção de bug

Com expl3, não sei se isso lhe interessa

%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}

insira a descrição da imagem aqui

informação relacionada