【问题标题】:Modular arithmetic on node names in TikZ?TikZ中节点名称的模块化算法?
【发布时间】:2026-01-19 10:00:01
【问题描述】:

假设我想在 TikZ 中构建一个循环图,具有可变数量的节点,标记为 v0、v1、...、v_n-1,用于我选择的一些 n(比如 5)。

我希望能够使用 TikZ 中的 \foreach 命令迭代地(1)定义节点,以及(2)连接节点。比如说,我希望能够将 v_i 连接到 v_(i+1) 并将 v_i 连接到 v_{i+2}。

\foreach \i in {0, ..., 4} {\path (\i*72:3) node (v\i) {};}

完美地构建节点。但是当我想画一些线时,

\foreach \i \in {0, ..., 3} { \draw (v\i) -- (v{\i+1}); }????

不起作用。也没有

\foreach \i / \j in {0/1, ..., 3/4} { \draw (v\i) -- (v{\j}); }

我收到“没有这样的形状 v0”或类似的错误。

我知道这一定很容易做到,但我不知道怎么做。有什么建议吗?

作为后续,如果能够使用单个 \foreach 命令连接 v_i 和 v_{i+4} 或其他东西,并让 TikZ/pgf 为我做模运算而不必担心,那就太好了关于溢出。

【问题讨论】:

    标签: latex tikz


    【解决方案1】:

    这对我有用:

    \documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{shapes,fit,arrows,positioning}
    \tikzstyle{vertex} = [circle, draw, thick, text centered]
    \tikzstyle{edge} = [draw, thick,->]
    \begin{document}
    \begin{tikzpicture}[scale=1]
      \foreach \x in {0,...,6}
        \node[vertex] (\x) at (\x*360/7:3) {v\x};
      \foreach \x/\y in {0/1,1/2,2/3,3/4,4/5,5/6,6/0}
        \draw[edge] (\x) to (\y);
    \end{tikzpicture}
    \end{document}
    

    {0/1,...,5/6} 语法对我不起作用。但我承认,我花了一些时间试图找到一个好的解决方案,但我仍然不完全满意。

    【讨论】:

      【解决方案2】:

      另一个解决方案,由 Steve Tjoa 实现了代码编辑:

      \documentclass[tikz,border=1mm]{standalone}
      \usetikzlibrary{arrows}
      
      \begin{document}
      \begin{tikzpicture}[thick]
      \foreach \x in {0,...,4}{%
        \node [circle, draw] at (\x*72:3) {$v_{\x}$};
        \draw [->] (\x*72+10:3) arc (\x*72+10:\x*72+62:3);
      }
      \end{tikzpicture}
      \end{document}
      

      【讨论】:

      • @SteveTjoa:有点晚了,但是看看上面的codegolfin'和你的答案;)干杯