答案1
我会通过为每个“点块”定义一个“图片”来实现这一点。您可以在 tikz 手册(版本 3.0.1a)第 18.2 节中阅读有关这些内容的所有内容。使用图片,下面的 MWE 生成以下图表:
MWE 的理念应该可以帮助您入门,即定义一个dotblock
带有两个参数的图片:块的标签和点的数量。您可以通过多种不同的方式使用此图片,包括
\pic at (0,0) {dotblock={a,2}};
\draw (0,0) pic{dotblock={a,2}};
我认为这两个命令是等效的。
点块以放置点为中心垂直绘制。给出标签的目的dotblock
是为了使用坐标轻松绘制块中点之间的边缘:命令
\draw(a2)--(b3);
从“块 a”中的第二个点到“块 b”中的第三个点画一条线。
以下是完整的 MWE:
\documentclass{article}
\usepackage{tikz}
\tikzset{
pics/dotblock/.style args = {#1,#2}{% #1=label, #2=number of dots
code = {
\foreach \adot [remember=\adot as \bdot,
evaluate=\adot as \y using 0.5-\adot+#2/2] in {1,...,#2} {
\node[circle, fill=black, radius=1mm] (#1\adot) at (0.5,\y) {};
}
\draw[blue](0,-#2/2) rectangle (1,#2/2);
}
}
}
\begin{document}
\begin{tikzpicture}
\pic at (0,0) {dotblock={a,2}};
\draw (2,0) pic{dotblock={b,3}};
\pic at (4,0) {dotblock={c,1}};
\draw[red, dashed, thin](-0.2,1.7) rectangle (5.2,-1.7);
\pic at (7,0) {dotblock={d,1}};
\draw(a1)--(b3)--(c1)--(d1);
\end{tikzpicture}
\end{document}
鉴于 OP 中的图像本质上有三种不同类型的重复块,我实际上会为它们中的每一个定义图片,然后将它们链接起来。例如,右边的块可以用
pics/twoBlock/.style args = {#1}{
code = {
\draw[dashed,green!80!black](0,0)--(6,0);
\draw(0,0) pic{dotblock={{#1}1,2}};
\draw(2,0) pic{dotblock={{#1}2,1}};
\draw[thin,red,dashed] (-0.2,1.2) rectangle (3.2,-1.2);
\draw(5,0) pic{dotblock={{#1}3,2}};
\draw[thin,red,dashed] (4.8,1.2) rectangle (6.2,-1.2);
}
}
这样\draw (7,0) pic{twoBlock={A}};
就能产生
twoBlock={A}
,以及 的定义意味着twoBlock
此图中的点被标记为A11
、A12
、A21
和。请注意,首先绘制绿线A31
,A32
以便它位于图片中其他对象的下方。