如何在 \pgfmathsetmacro 计算的节点名称后指定锚点?

如何在 \pgfmathsetmacro 计算的节点名称后指定锚点?

我正在学习 TikZ 并尝试创建类似这里有一个

到目前为止,我得到以下内容:

在此处输入图片描述

\documentclass{minimal}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
    [ yscale=-1,
      dot/.style={circle, fill=black, inner sep=0pt, minimum size=5mm}]
  \begin{scope}
    \foreach \y in {0,...,3} {
      \node (a\y) at (0, \y) [dot, label=left:$x(\y)$] {};
      \node (b\y) at (4, \y) [dot] {};
      \draw[->] (a\y) -- (b\y);
    }

    \foreach \y in {0,...,1} {
      \pgfmathsetmacro\othery{\y+2};
      \draw[->] (a\y.east) -- (b\othery);
      \draw[->] (a\othery) -- (b\y.west);
    }

  \end{scope}
\end{tikzpicture}
\end{document}


不幸的是,向下的对角箭头连接到的是东锚点而不是西锚点,但我无法添加.west(即\draw[->] (a\y.east) -- (b\othery.west);),因为它给出了错误:

! Package PGF Math Error: Unknown operator `w' or `we' (in '0.west').

我如何让向下的对角箭头连接到西锚点?或者也许这是错误的方法,有更好的方法?

答案1

您需要使用\pgfmathtruncatemacro或任何其他避免放在.0计算结果之后的方法。

\documentclass[tikz,border=3mm]{standalone}
\begin{document}
\begin{tikzpicture}
    [ yscale=-1,
      dot/.style={circle, fill=black, inner sep=0pt, minimum size=5mm}]
  \begin{scope}
    \foreach \y in {0,...,3} {
      \node (a\y) at (0, \y) [dot, label=left:$x(\y)$] {};
      \node (b\y) at (4, \y) [dot] {};
      \draw[->] (a\y) -- (b\y);
    }

    \foreach \y in {0,...,1} {
      \pgfmathtruncatemacro\othery{\y+2};
      \draw[->] (a\y.east) -- (b\othery);
      \draw[->] (a\othery) -- (b\y.west);
    }

  \end{scope}
\end{tikzpicture}
\end{document}

当然,在像这样的简单情况下,您可以使用它\the\numexpr来完全避免解析。(我添加了\relax它,以便您可以在需要时添加锚点。)

\documentclass[tikz,border=3mm]{standalone}
\begin{document}
\begin{tikzpicture}
    [ yscale=-1,
      dot/.style={circle, fill=black, inner sep=0pt, minimum size=5mm}]
  \begin{scope}
    \foreach \y in {0,...,3} {
      \node (a\y) at (0, \y) [dot, label=left:$x(\y)$] {};
      \node (b\y) at (4, \y) [dot] {};
      \draw[->] (a\y) -- (b\y);
    }

    \foreach \y in {0,...,1} {
      \draw[->] (a\y.east) -- (b\the\numexpr\y+2\relax);
      \draw[->] (a\the\numexpr\y+2\relax) -- (b\y.west);
    }

  \end{scope}
\end{tikzpicture}
\end{document}

相关内容