我正在学习 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}