
我這段時間正在學習 TikZ,但我在為論文繪製一些網路時遇到了一些問題。我正在嘗試在 TikZ 中繪製一個網絡,它應該類似於this picture
:
我編寫了以下程式碼:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary[topaths]
\newcount\mycount
\begin{document}
\begin{tikzpicture}[transform shape]
\foreach \x in {1,...,8}{
\pgfmathparse{(\x-1)*45+floor(\x/9)*22.5}
\node[draw,circle,inner sep=0.25cm] (N-\x) at (\pgfmathresult:5.4cm) {};
}
\foreach \x [count=\xi from 1] in {1,...,8}{
\foreach \y in {\x,...,8}{
\path (N-\xi) edge[-] (N-\y);
}
}
\end{tikzpicture}
\end{document}
它只繪製圖像中的一個派系。你能幫我畫出圖中所示的整個網路嗎?
謝謝。
答案1
該命令\MyFive
繪製基本圖形並使用第一個參數中的字串和\x
第一個參數中的計數器為其節點分配名稱\foreach
(例如\MyFive{A}
繪製圖形並命名其節點A-1
, A-2
,..., A-8
)。然後scope
使用 s 來移動基本圖形並\draw
進行繪製線條的操作。
\documentclass[border=3pt]{standalone}
\usepackage{tikz}
\usetikzlibrary[topaths]
\newcommand\MyFive[1]{%
\foreach \x in {1,...,8}{
\pgfmathparse{(\x-1)*45+floor(\x/9)*22.5}
\node[draw,circle,inner sep=2pt] (#1-\x) at (\pgfmathresult:1.5cm) {};
}
\foreach \x [count=\xi from 1] in {1,...,8}{
\foreach \y in {\x,...,8}{
\path (#1-\xi) edge[-] (#1-\y);
}
}
}
\begin{document}
\begin{tikzpicture}
\MyFive{A}
\begin{scope}[xshift=4.5cm]
\MyFive{B}
\end{scope}
\begin{scope}[xshift=9cm]
\MyFive{C}
\end{scope}
\begin{scope}[xshift=13.5cm]
\MyFive{D}
\end{scope}
\begin{scope}[yshift=-4.5cm]
\MyFive{E}
\end{scope}
\begin{scope}[xshift=4.5cm,yshift=-4.5cm]
\MyFive{F}
\end{scope}
\begin{scope}[xshift=9cm,yshift=-4.5cm]
\MyFive{G}
\end{scope}
\begin{scope}[xshift=13.5cm,yshift=-4.5cm]
\MyFive{H}
\end{scope}
\begin{scope}[yshift=-9cm]
\MyFive{I}
\end{scope}
\begin{scope}[xshift=4.5cm,yshift=-9cm]
\MyFive{J}
\end{scope}
\begin{scope}[xshift=9cm,yshift=-9cm]
\MyFive{K}
\end{scope}
\begin{scope}[xshift=13.5cm,yshift=-9cm]
\MyFive{L}
\end{scope}
\begin{scope}[yshift=-13.5cm]
\MyFive{M}
\end{scope}
\begin{scope}[xshift=4.5cm,yshift=-13.5cm]
\MyFive{N}
\end{scope}
\begin{scope}[xshift=9cm,yshift=-13.5cm]
\MyFive{O}
\end{scope}
\begin{scope}[xshift=13.5cm,yshift=-13.5cm]
\MyFive{P}
\end{scope}
\draw (A-7) -- (E-3);
\draw (A-8) -- (F-4);
\draw (A-1) -- (B-5);
\draw (E-2) -- (B-6);
\draw (E-1) -- (F-5);
\draw (B-7) -- (F-3);
\draw (C-7) -- (G-3);
\draw (C-8) -- (H-4);
\draw (C-1) -- (D-5);
\draw (G-2) -- (D-6);
\draw (G-1) -- (H-5);
\draw (D-7) -- (H-3);
\draw (I-7) -- (M-3);
\draw (I-8) -- (N-4);
\draw (I-1) -- (J-5);
\draw (M-2) -- (J-6);
\draw (M-1) -- (N-5);
\draw (J-7) -- (N-3);
\draw (K-7) -- (O-3);
\draw (K-8) -- (P-4);
\draw (K-1) -- (L-5);
\draw (O-2) -- (L-6);
\draw (O-1) -- (P-5);
\draw (L-7) -- (P-3);
\draw (F-8) -- (K-4);
\draw (G-6) -- (J-2);
\end{tikzpicture}
\end{document}
\foreach
透過為基本圖形選擇一些其他名稱,允許使用額外的循環,可以大大簡化程式碼;然而,在這裡我更喜歡清晰而不是簡潔。
答案2
力求簡潔而不是清晰,並利用和 多個語句pic
的特性:PGF 3.0
foreach
\documentclass[tikz,border=5]{standalone}
\tikzset{pics/clique/.style={
code={
\foreach \i in {1,...,8}
\node [circle, draw] (n-#1-\i) at (\i*45-45:2) {};
\foreach \i [evaluate={\k=int(\i+1);}] in {1,...,7}
\foreach \j in {\k,...,8}
\draw (n-#1-\i) -- (n-#1-\j);
}
}}
\begin{document}
\begin{tikzpicture}
\foreach \x in {1,...,4}
\foreach \y in {1,...,4}
\path (\x*6,\y*6) pic {clique={\x-\y}};
\draw \foreach \a/\b [evaluate={\c=int(\a+1); \d=int(\b+1);}] in {1/1, 3/1, 1/3, 3/3}{
(n-\a-\b-2) -- (n-\c-\d-6) (n-\a-\b-3) -- (n-\a-\d-7)
(n-\a-\b-1) -- (n-\c-\b-5) (n-\c-\b-3) -- (n-\c-\d-7)
(n-\c-\b-4) -- (n-\a-\d-8) (n-\a-\d-1) -- (n-\c-\d-5)
}
(n-2-2-2) -- (n-3-3-6) (n-3-2-4) -- (n-2-3-8);
\end{tikzpicture}
\end{document}
答案3
matrix node
透過from進行的另一次嘗試tikzlibrary
。首先將基本 tikz 圖像定義為\single
兩種連接線樣式 -lineS
紅色和lineL
黑色,然後將所有圖像放入矩陣節點中。透過找出它們之間的規律性來繪製連接線,並透過foreach
循環來實現。
程式碼
\documentclass[border=3pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{topaths,matrix}
\begin{document}
\def\single{
\begin{tikzpicture}[scale=0.3]
\foreach \x in {1,...,8}{
\pgfmathparse{(\x-1)*45+floor(\x/9)*22.5}
\node[draw,circle,inner sep=0.25cm] (N-\x) at (\pgfmathresult:5.4cm) {};
}
\foreach \x [count=\xi from 1] in {1,...,8}{
\foreach \y in {\x,...,8}{
\path (N-\xi) edge[-] (N-\y);
}
}
\end{tikzpicture}
}
\tikzset{
lineL/.style={draw, shorten >=-29pt,shorten <=-29pt,},
lineS/.style={draw, red, shorten >=-4pt,shorten <=-4pt}
}
\begin{tikzpicture}[auto]
% Place nodes with matrix nodes
\matrix[matrix of nodes, column sep=1cm, row sep=1cm]{%
\node [] (A) {\single}; & \node [] (B) {\single}; & \node [] (C) {\single}; & \node [] (D) {\single};\\
\node [] (A1) {\single}; & \node [] (B1) {\single}; & \node [] (C1) {\single}; & \node [] (D1) {\single};\\
\node [] (A2) {\single}; & \node [] (B2) {\single}; & \node [] (C2) {\single}; & \node [] (D2) {\single};\\
\node [] (A3) {\single}; & \node [] (B3) {\single}; & \node [] (C3) {\single}; & \node [] (D3) {\single};\\
};
% Draw edges
\foreach \c in{A,B,C,D}{
\foreach \f/\t in {{}/1,2/3}
{
\path [lineS] (\c\f) -- (\c\t);
}
};
\foreach \c/\d in{A/B,C/D,A1/B1/,C1/D1,A2/B2,C2/D2,A3/B3/,C3/D3}{
\path [lineS] (\c.0) -- (\d.180);
};
\foreach \f/\t in {A/B1,C/D1,B1/C2,A2/B3,C2/D3}
{
\path [lineL] (\f.-45) -- (\t.135) ;
};
\foreach \f/\t in {B/A1,D/C1,C1/B2,B2/A3,D2/C3}
{
\path [lineL] (\f.-135) -- (\t.45) ;
};
\end{tikzpicture}
\end{document}