答案1
由于您打算绘制“相当多”这些,因此您需要一个合理的界面,那么如何使用这样的代码
\abacus{{2,1},{1,1},{3,3,2},{},{4,2},{1}}
\qquad
\abacus{{1},{},{},{},{2},{1}}
产生如下结果:
其工作原理是,该\abacus
命令接受以逗号分隔的“算盘行”列表,这些行从算盘底部开始向上攀升。每个“算盘行”本身都是以逗号分隔的列表,从左到右给出算盘每列中的球数。
完整代码如下:
\documentclass{article}
\usepackage{tikz}
\tikzset{
pics/abacus/.style = {
code={
\ifnum#1>0% have to treat 0 separately
\foreach \ball [evaluate=\ball as \x
using {(\ball-0.5-#1/2)*0.2}] in {1,...,#1} {
\fill[black] (\x,0) circle (2.5pt);
}
\fi
}
},
/tikz/abacus/.is family,% default values
/tikz/abacus,
xscale/.initial=1, % default xscale=1 (no scaling)
yscale/.initial=0.6,% default yscale=0.6
columns/.initial=2, % default of 2 vertical rules
rows/.initial=4 % default of 4 horizontal rules
}
% shortcut for accessing options
\newcommand\AbacusOption[1]{\pgfkeysvalueof{/tikz/abacus/#1}}
\newcommand\abacus[2][]{\tikzset{abacus, #1}%
\begin{tikzpicture}[
xscale=\AbacusOption{xscale},
yscale=\AbacusOption{yscale}
]
\foreach \ypos in {1,...,\AbacusOption{rows}} {
\draw(0,2*\ypos-1)--++(2*\AbacusOption{columns},0);
}
\foreach \xpos in {1,...,\AbacusOption{columns}} {
\draw(2*\xpos, 0)--++(0,2*\AbacusOption{rows});
}
\foreach \row [count=\ypos] in {#2} {
\foreach \col [count=\xpos] in \row {
\draw (2*\xpos-1,\ypos) pic{abacus={\col}};
}
}
\end{tikzpicture}%
}
\begin{document}
\abacus{{2,1},{1,1},{3,3,2},{},{4,2},{1}}
\qquad
\abacus{{1},{},{},{},{2},{1}}
\end{document}
该\abacus
命令接受一个可选参数,该参数接受以逗号分隔的键值对列表,用于更改默认的行数和列数以及 x 和 y 缩放比例。例如,
\abacus[rows=2, columns=3, xscale=0.5, yscale=0.3]{{1,2,3,4},{0,3,1}}
生成:
答案2
这是我画的第一张图。你可以根据这张图画出另一张。
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[x=1.5cm]
\foreach \i in {1,2} \draw (\i,-.2) -- (\i,3.2);
\foreach \i in {0,1,2,3} \draw (0,\i) -- (3,\i);
\foreach \x/\y in {
.5/0,
.4/2,
.6/2,
.5/2.5
} \fill (\x,\y) circle (2pt);
\end{tikzpicture}
\end{document}