TikZ で手続き的に生成されたノードを作成する

TikZ で手続き的に生成されたノードを作成する

私はTiに比較的慣れていないZ、そして大学の課題に必要な数字をインターネット上のさまざまな例から集めてきました。

今は研究の段階に移っており、より多くの文章を書いたり、より複雑な図を作成したりする必要があるため、適切なやり方を学ぶ時期が来たのではないかと思いました。

私が作成したいフィギュアの種類の例を以下に示します。

分割されたネットワーク

多数のノードがあり、それらのノード間には多数の接続があります。

Tiを使ってこの図を再現することができましたZ では、すべてのノードを個別に配置し、それぞれに個別に接続を作成することで作成できますが、これは非常に時間がかかり、さらに多くの接続を使用して作成する必要があるさらに大きな図形もあり、さらに時間がかかります。

多くの機能を備えながらも構造的には非常にシンプルな大きな図 (たとえば、列の各ノードから次の列の各ノードに接続されたノードの大きなマトリックス) を作成するためのよりスマートな方法は何かと考えていました。

いくつかのものにおいて、ノードの配置にマトリックスを使用しているのを見たことがあります。また、Tiではforループやif文を使用できることもわかりました。Zも同様ですが、Tiの言語全体を掘り下げて理解しようとする可能性はZ 自身も、現在取り組んでいる他の作業に加えて、少々大変です。そのため、私の目的に役立つような技術に関する優れた高レベルの情報を提供する良い例やリソース、あるいはどこから始めればよいかについてのヒントなど、何かご存知の方がいらっしゃいましたら、大変ありがたく思います。

答え1

複数の\foreachループを使用すると、ネットワークの「セマンティック」レイアウトが少しわかりにくくなりますが、作成が簡単になることは確かです。必要な接続については多少の自由を取っています。そうしないと、ネットワークが少し乱雑に見え始めます。

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{arrows.meta,calc}
\begin{document}
\begin{tikzpicture}[>=Triangle,
   cell/.style={circle, draw},
   connection/.style={shorten >=.125cm, shorten <=.125cm},
]

\foreach \i in {1,...,8}
  \foreach \x [count=\j] in {1,2,5,6,7}
    \node [cell] (cell-\i-\j) at (\x*1.5, \i) {};

\node [cell, draw=none, below=1cm] (cell')  at ($(cell-1-4)!0.5!(cell-1-5)$) {};
\node [cell, draw=none, above=1cm] (cell'') at ($(cell-8-4)!0.5!(cell-8-5)$) {};

\foreach \i in {1,...,8}{
  \foreach \j in {1,3} \draw [->] (cell-\i-\j)++(-1,0) -- (cell-\i-\j);
  \foreach \j in {2,5} \draw [<-] (cell-\i-\j)++(1,0) -- (cell-\i-\j);
}

\foreach \m/\n/\o/\p in {1/4/1/2,5/8/1/2, 3/6/1/2, 1/4/3/4, 5/8/3/4, 3/6/4/5}
  \foreach \i in {\m,...,\n}
    \foreach \j in {\m,...,\n} \draw [connection] (cell-\i-\o) -- (cell-\j-\p);

\foreach \m/\n/\q in {1/2/', 7/8/''}
  \foreach \i in {\m,\n}{
    \draw [connection] (cell-\i-4) -- (cell-\i-5);
    \foreach \j in {4,5} \draw [connection] (cell\q) -- (cell-\i-\j);
  }

\coordinate (@')  at ($(cell') +(5/4,-1/2)$);
\coordinate (@'') at ($(cell'')+(5/4, 1/2)$);
\draw [<->] (cell'.center) |- (@') -- (@'') -| (cell''.center);

\node [above left=.5cm]  at (cell-8-1) {in};
\node [above right=.5cm] at (cell-8-2) {out};

\node [above left=.5cm]  at (cell-8-3) {in};
\node [above right=.5cm] at (cell-8-5) {out};

\draw [Implies-Implies, double, thick, double distance=5pt, 
  shorten >=1.25cm, shorten <=1.25cm] 
  ($(cell-4-2)!0.5!(cell-5-2)$) -- ($(cell-4-3)!0.5!(cell-5-3)$)
  node [midway, above=1cm, font=\large] {?};

\end{tikzpicture}
\end{document}

ここに画像の説明を入力してください

関連情報