在 Tikz 中使用 Loop 和 Mod 函数绘制图形

在 Tikz 中使用 Loop 和 Mod 函数绘制图形

我正在尝试在七个顶点上绘制一个有向图,其中每个顶点i都连接到顶点i+1i+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}

在此处输入图片描述

相关内容