tikz を使用して 10 フレーム グリッドの新しいコマンドを作成する

tikz を使用して 10 フレーム グリッドの新しいコマンドを作成する

数字の加算をモデル化するために、10 フレームを作成しようとしています。\tensframe{#1}{#2}#1 の緑の円が左から始まって上に向かって大きくなり、#2 の青い円が緑から続いて上に向かって表示されると便利です。#1 または #1+#2 が 5 より大きい場合は、2 番目の列に繰り越す必要があります。これを機能させる方法を誰か知っていますか?

\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)に青い円が2つ欠けている ここに画像の説明を入力してください

\tensframe{2}{1}定義されていません (foreach ys の値の範囲を取得していないためだと思います)。ただし、動作している場合は (1,1) と (1,2) に緑のセル、(1,3) に青のセルが表示され、次のようになります。 ここに画像の説明を入力してください

これをどうコード化できるか知っている人はいますか? どうもありがとう

答え1

ループは 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ループは 2 つの異なるコマンドに変更されています。1 つはグリッドを描画し ( tenshtensv)、もう 1 つはグリッドを塗りつぶします ( )。これらのコマンドはすべて、それらの一部ではないfilltensの中にある必要があります。tikzpicture

tens{v|h}コマンドには、ノードの名前である必須パラメータがありますmatrix。グリッドは になったのでnode、他のノードを配置するために参照したり、埋めたりすることができます。オプションのパラメータは配置に使用されます。

filltensコマンドには 3 つの必須パラメータがあり、最初のパラメータは円で塗りつぶされるマトリックスの名前で、2 番目と 3 番目はマトリックス内の緑と青の円の数です。

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

ここに画像の説明を入力してください

関連情報