使用 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循环已更改为两个不同的命令,一个将绘制网格(tenshtensv),另一个将填充网格(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

编辑:错误修复

有了 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}

在此处输入图片描述

相关内容