TikZ 中的迭代过程计算

TikZ 中的迭代过程计算

在 TikZ 的许多\foreach迭代过程中,我想将称为n\x(其中x是自然数)的通用节点与另一个节点关联起来,该节点的名称是通过将基本的数学关系应用于前者名称中使用的数字而获得的。

为了清楚起见,我想比方说从n\xn\x+1或 到n\x*2或 到n\x-3等画一条线。因此,如果x=4我想画如下线:

(n4)--(n5)
(n4)--(n8)
(n4)--(n1)

这可能吗?

在下面的 MWE 中,我想使用前面提到的迭代过程在节点之间画线。

\documentclass{article}
\usepackage{tikz}
%\usetikzlibrary{calc} <-- Would it be necessary?

\begin{document}

\begin{tikzpicture}
  \matrix[column sep=1cm]{
  \node (n1) {1}; & \node (n2) {2}; & \node (n3) {3}; & \node (n4) {4};\\
  };
  %\foreach \x in {1,...,3} <-- Something like this
  %\draw (n\x)--(n\x+1); 
\end{tikzpicture}

\end{document}

编辑: 可能相关,特别是@Mark Wibrow 在最后的评论,但我无法让它发挥作用。

答案1

是的,这是可能的,你只需要先计算\x+1一下。一种方法是使用\pgfmathtruncatemacro

在此处输入图片描述

笔记:

  • 我添加了箭头以清楚地表明有三次迭代。
  • 正如 Paul Gaborit 指出的那样,使用\pgfmathsetmacro而不是\pgfmathtruncatemacro会产生一个实数,因此您会得到 3.0 而不是 3。因此箭头指向(以节点的n3.0角度为锚点)。0n3

    在此处输入图片描述


您还可以使用以下evaluate={\TempVar=int(\x+1)语法:

代码:\pgfmathtruncatemacro

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
  \matrix[column sep=1cm]{
  \node (n1) {1}; & \node (n2) {2}; & \node (n3) {3}; & \node (n4) {4};\\
  };
  \foreach \x in {1,...,3} {%<-- Something like this
      \pgfmathtruncatemacro{\TempVar}{\x+1}
      \draw [red, -latex] (n\x)--(n\TempVar); 
  }%
\end{tikzpicture}

代码:evaluate

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
  \matrix[column sep=1cm]{
  \node (n1) {1}; & \node (n2) {2}; & \node (n3) {3}; & \node (n4) {4};\\
  };
  \foreach [evaluate={\TempVar=int(\x+1);}] \x in {1,...,3} {%<-- Something like this
      \draw [red, -latex] (n\x)--(n\TempVar); 
  }%
\end{tikzpicture}

答案2

我认为你只需要可扩展的计算。很多事情都可以用 来完成\numexpr

\documentclass{article}
\usepackage{tikz}
\begin{document}\thispagestyle{empty}
\begin{tikzpicture}
  \matrix[column sep=1cm]{%
    \node (n11) {1}; & \node (n12) {2}; & \node (n13) {3}; & \node (n14) {4};\\
    \node (n21) {1}; & \node (n22) {2}; & \node (n23) {3}; & \node (n24) {4};\\
    \node (n31) {1}; & \node (n32) {2}; & \node (n33) {3}; & \node (n34) {4};\\
    };
  \foreach \x in {1,...,3} {%<-- Something like this
      \draw [red, -latex]
      (n\x\x)--(n\x\the\numexpr\x+1\relax);  
  }%
\end{tikzpicture}
\end{document}

节点

答案3

另一个版本evaluate

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
  \matrix[column sep=1cm]{
  \node (n1) {1}; & \node (n2) {2}; & \node (n3) {3}; & \node (n4) {4};\\
  };
  \foreach \x [remember=\x as \lastx (initially 1)] in {2,...,4}{
    \draw [red, -latex] (n\lastx)--(n\x);
  }%
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案4

由于没有人提到用途let,因此我添加了这个答案以寻求完整性。

\begin{tikzpicture}
  \matrix[column sep=1cm]{
  \node (n1) {1}; & \node (n2) {2}; & \node (n3) {3}; & \node (n4) {4};\\
  };
  \foreach \a in {1,...,3} {%<-- Something like this (but don't use \x inside let!)
      \draw[red, -latex] let \n{a}={int(\a+1)} in (n\a)--(n\n{a});
  }%
\end{tikzpicture}

在此处输入图片描述

相关内容