我正在尝试在七个顶点上绘制一个有向图,其中每个顶点i
都连接到顶点i+1
,i+2
并且i+4
(mod 8)。这是我写的代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows, calc}
\begin{document}
\begin{tikzpicture}[thick, scale=1]
% Nodes
\draw \foreach \x in {1,...,7}{
(51.42*\x + 38.58:2.5) node(\x){\footnotesize\textsf \x}
};
% Edges
\foreach \x in {1,...,7}
\path[line width = 0.4mm, ->, >=stealth']
let \n1 = {int(mod(\x + 1,8))},
\n2 = {int(mod(\x + 2,8))},
\n3 = {int(mod(\x + 4,8))}
in
(\x) edge (\n1) edge (\n2) edge (\n3);
\end{tikzpicture}
\end{document}
但它甚至没有编译,我不明白为什么。 我将不胜感激任何帮助。
答案1
这里有一个不同的方法,使用evaluate
。请注意,我制作了从 0 到 6 的循环,并使用mod(i, 7)
。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows, calc}
\begin{document}
\begin{tikzpicture}[thick, scale=1]
% Nodes
\draw foreach \x in {0,...,6}{
(51.42*\x + 38.58:2.5) node(\x) {\footnotesize\textsf \x}
};
% Edges
\foreach [evaluate={
\NA=int(mod(\x + 1,7));
\NB=int(mod(\x + 2,7));
\NC=int(mod(\x + 4,7));
}]
\x in {0,...,6}{
\path[line width = 0.4mm, ->, >=stealth'] (\x) edge (\NA) edge (\NB) edge (\NC);
};
\end{tikzpicture}
\end{document}
答案2
当您使用let ... in
语法时, 的定义\x
会发生变化,因为当您使用点声明\p1=...
时,TikZ 会自动定义\x1
和\y1
。因此,如果您将循环变量更改为其他变量,它就会起作用。我还添加了节点0
以使其工作,但我不知道这是否是您的意图
\begin{tikzpicture}[thick, scale=1]
% Nodes
\draw \foreach \x in {0,...,7}{
(51.42*\x + 38.58:2.5) node[font={\footnotesize\sffamily}](n-\x){\x}
};
\pgfnodealias{n-0}{n-7} % Make n-0 point to n-7
% Edges
\foreach \zz in{1,...,7}{\draw let \n1 = {int(mod(\zz + 1,8))},
\n2 = {int(mod(\zz + 2,8))},
\n3 = {int(mod(\zz + 4,8))} in
(n-\zz) edge (n-\n1) edge (n-\n2) edge (n-\n3);}
\end{tikzpicture}
答案3
这是另一种选择元帖子- 一种实际上为绘图而设计的语言,您可能也想学习(或代替学习)。
\RequirePackage{luatex85}
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
vardef connect(expr a, b) =
drawarrow a--b
cutbefore fullcircle scaled 20 shifted a
cutafter fullcircle scaled 20 shifted b;
enddef;
beginfig(1);
% how many points?
N = 7;
% define the points, from the top, counter-clockwise
for i=0 upto N-1:
z[i] = up scaled 100 rotated (360/N*i);
endfor
% connect as desired
interim ahangle := 30; % with slim arrow heads
for i=0 upto N-1:
connect(z[i], z[(i+1) mod N]);
connect(z[i], z[(i+2) mod N]);
connect(z[i], z[(i+4) mod N]);
endfor
% label all the points...
for i=0 upto N-1:
label(decimal (i+1), z[i]) withcolor .67 red;
endfor
endfig;
\end{mplibcode}
\end{document}
这被包裹在内luamplib
,因此可以使用 进行编译lualatex
或者将其改编为gmp
包或普通 MP。
答案4
这是使用图表的另一种方法。使用以下方法编译lualatex
\RequirePackage{luatex85}
\documentclass[tikz,margin=5]{standalone}
\usetikzlibrary{arrows,graphs,graphdrawing,graphs.standard}
\def\typeset{\pgfmathparse{int(\tikzgraphnodename-1)}\pgfmathresult}
\begin{document}
\tikz[>=stealth']\graph [radius=2cm, typeset=\typeset, ->]
{ subgraph K_n [n=7, clockwise]; };
\end{document}