
Estoy intentando crear cuadros de decenas para modelar la suma de números. Me encantaría que \tensframe{#1}{#2}
mostrara los círculos verdes número 1 comenzando a la izquierda y creciendo, luego los círculos azules número 2 continuando desde el verde y luego subiendo. Si #1 o #1+#2 es mayor que 5, debe transferirse a la segunda columna. ¿Alguien sabe cómo hacer que esto funcione?
\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}
faltan dos círculos azules en las celdas (2,2) y (2,3)
\tensframe{2}{1}
ni siquiera está definido (creo que porque no tengo un rango de valores para foreach ys), aunque si funcionara tendría celdas verdes en (1,1) y (1,2) y una celda azul en (1,3) y se ve así:
¿Alguien sabe cómo se podría codificar esto? Muchas gracias
Respuesta1
Sólo un bucle. Primero se crea el nodo y se le asigna un nombre, y este nombre se utiliza para rellenarlo con el color correspondiente.
\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}
Actualización: nuevo código para resolver preguntas de comentarios
El siguiente código muestra una propuesta para resolver preguntas actualizadas a través de comentarios: un esquema horizontal y su posicionamiento.
En este caso foreach
se ha cambiado el bucle por dos comandos diferentes, uno dibujará la cuadrícula ( tensh
, tensv
) y otro la rellenará ( filltens
). Todos estos comandos deben estar dentro de un archivo tikzpicture
que no forma parte de ellos.
tens{v|h}
El comando tiene un parámetro obligatorio que es el nombre del matrix
nodo. Como la cuadrícula ahora es un node
, se puede hacer referencia a ella para ubicar otros nodos o completarla. El parámetro opcional se utilizará para el posicionamiento.
filltens
El comando tiene tres parámetros obligatorios, el primero es el nombre de la matriz que se rellenará con círculos, mientras que el segundo y el tercero son el número de círculos verdes y azules en su interior.
\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}
Respuesta2
EDITAR: corrección de errores
Con expl3, no se si esto te interesa
%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}