Создание новой команды для сетки десятков кадров с использованием tikz

Создание новой команды для сетки десятков кадров с использованием tikz

Я пытаюсь создать кадры десятков для моделирования сложения чисел. Мне бы очень хотелось, чтобы \tensframe{#1}{#2}было показано #1 зеленые круги, начинающиеся слева и увеличивающиеся вверх, затем #2 синие круги, продолжающиеся от зеленого и затем идущие вверх. Если #1 или #1+#2 больше 5, их нужно перенести во второй столбец. Кто-нибудь знает, как это работает?

\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}идеально введите описание изображения здесь

\tensframe{3}{5}отсутствует два синих круга в ячейках (2,2) и (2,3) введите описание изображения здесь

\tensframe{2}{1}даже не определен (я думаю, потому что у меня нет диапазона значений для foreach ys), хотя если бы он работал, то имел бы зеленые ячейки в (1,1) и (1,2) и синюю ячейку в (1,3) и выглядел бы так: введите описание изображения здесь

Кто-нибудь знает, как это можно закодировать? Спасибо большое

решение1

Только один цикл. Сначала создается узел и ему дается имя, и это имя используется для заливки его соответствующим цветом.

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

введите описание изображения здесь

Обновление: новый код для решения вопросов комментариев

Следующий код демонстрирует предложение по решению обновленного вопроса с помощью комментариев: горизонтальная схема и их позиционирование.

В этом случае foreachцикл был изменен для двух разных команд, одна будет рисовать сетку ( tensh, tensv), а другая будет заполнять ее ( filltens). Все эти команды должны быть внутри , tikzpictureкоторый не является их частью.

tens{v|h}Команда имеет обязательный параметр, который является именем matrixузла. Поскольку сетка теперь является node, на нее можно ссылаться для позиционирования других узлов или заполнять ее. Необязательный параметр будет использоваться для позиционирования.

filltensКоманда имеет три обязательных параметра: первый — имя матрицы, которую нужно заполнить кругами, а второй и третий — количество зеленых и синих кругов внутри.

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

введите описание изображения здесь

решение2

EDIT: исправление ошибки

С expl3, я не знаю, интересно ли это вам

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

введите описание изображения здесь

Связанный контент