我正在尝试创建十进制框架来模拟数字的加法。如果\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{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
编辑:错误修复
有了 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}