TikZ 中节点名称的模块化运算?

TikZ 中节点名称的模块化运算?

假设我已经在 TikZ 中创建了一堆节点——可能是 v0、v1、...、vn-1。我想通过对索引进行算术运算(理想情况下是 mod n)以系统的方式连接这些节点中的某些节点。例如,

\foreach \i \in {0,1,...,n-1} {\draw[->] (v\i) -- (v\{i+2})} 但那行不通,我似乎找不到正确的语法。当我尝试使用 \pgfmathmod 执行复杂操作以对节点名称进行模数运算时,我得到的不是箭头在节点之间很好地连接,而是箭头连接到不合适的边缘。

当我尝试类似的操作时 \foreach \i / \j in {0 / 2, ..., n-2 / n}{ (v\i) -- (v\j)},我收到一个奇怪的错误消息“没有名为 v0 的节点”(或类似的消息)。

有什么建议吗?这似乎是一件很明显的事情。

答案1

let 命令在这里很有用,并允许“内联计算”:

\begin{tikzpicture}
  \foreach \i in {0,...,9} \draw (\i*36:2cm) node(\i){\i};
  \foreach \i in {0,...,9} \draw let \n1={int(mod(\i+2,10))} in (\i) -- (\n1);
\end{tikzpicture}

结果

答案2

如果int不起作用,可能是因为您需要升级您的软件包。

但是,一种不需要的解决方案int是使用\pgfmathtruncatemacro宏。例如,

\begin{tikzpicture}
  \foreach \i in {0,...,9} 
  {
      \draw (\i*36:2cm) node(v\i){v\i};
  }

\foreach \i in {0,...,9} 
{
    \pgfmathtruncatemacro{\j}{mod(\i+2,10)} 
    \draw [->] (v\i) -- (v\j);
}
\end{tikzpicture} 

答案3

您可以使用\pgfmathparse宏来执行此操作。它记录在(惊人的) TikZ 和 PGF 手册,第七部分,但现在你需要知道的是:\pgfmathparse{...}评估数学表达式...并将结果存储在中\pgfmathresult。应该...看起来像3 + 4 * 5 - sin(6)。我不知道有没有更好的语法,但如果你用它来有效地预先声明变量(例如\pgfmathparse{...}\let\j\pgfmathresult), 不算太差。

在介绍示例代码之前,我还要说两点。首先,第二种情况失败的原因是,据我所知,您只能...在单变量情况下使用。其次,第一种情况——with——\{i+2}是错误的,我觉得值得指出。一方面,\i是一个扩展为某个值的宏:首先0,然后1,等等。另一方面,是一个字符,在排版时会产生“i ” i。两者之间没有任何联系。因此,当您编写时\{i+2},您会看到五个标记:\{、、、和。第一个表示,后三个表示它们自己,最后一个将尝试在之后结束该i组。+2}{\foreach

无论如何,使用\pgfmathparse,我们可以得到如下结果:

\documentclass{article}

\usepackage{tikz}

\begin{document}
  \begin{center}\begin{tikzpicture}
    \foreach \i in {0,1,...,5} {
      \pgfmathparse{60*\i}
      \node[draw] (v\i) at (\pgfmathresult:2) {\i} ; % Polar coordinates
    }

    \foreach \i in {0,1,...,5} {
      \pgfmathparse{mod(\i+2,6)}
      \draw[->] (v\i) -- (v\pgfmathresult) ;
    }
  \end{tikzpicture}\end{center}
\end{document}

第一个\foreach在极坐标中写出节点(即(angle:radius));第二个按照您的需要连接它们。

答案4

另一个选项是foreach使用以下选项将算术转换为标题evaluate

evaluate=<variable> as <macro> using <formula>

<variable>表示要评估的变量,如果未使用,则<macro>在哪里存储结果,以及要评估的必须包含对的某些引用。<variable><formula><variable>

\documentclass[tikz, border=2mm]{standalone}

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
\foreach \i in {0,...,9} 
  \node (v\i) at (\i*36:2) {\i};

\foreach \i [evaluate=\i as \j using {int(mod(\i+2,10))}]in {0,...,9}
  \draw[->] (v\i) -- (v\j);
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容