按照亚当·里斯的书画德国算盘

按照亚当·里斯的书画德国算盘

我正在教授一门数学史课程,想画一些类似下面的内容:

在此处输入图片描述

要点应该能够画在线条上和线条之间。有人能帮我吗?非常感谢!

答案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}

在此处输入图片描述

相关内容