
数字の加算をモデル化するために、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{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 つはグリッドを描画し ( tensh
、tensv
)、もう 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}