# Pointing to a node with calculated name, why do I get to the east, not to the center?

It seems like I'm doing something wrong when using foreach variables to indicate node numbers. The two foreach loops are anchoring the paths to the east of each node. Why does this happen?

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{backgrounds,fit,patterns,decorations.pathreplacing,calc}

\makeatletter
\tikzset{
labelnode/.style={draw=none, fill=none, black},
latentnode/.style={draw, minimum width=5mm, shape=circle, ultra thick, black},
dagconn/.style={arrows=->, black, thick},
}
\makeatother

\begin{document}
\begin{tikzpicture}[scale=1]
\pgfmathsetmacro{\colgap}{1.6}
\pgfmathsetmacro{\rowgap}{1.3}

\node[labelnode] (x1) at (\colgap*0,\rowgap*1) {$X_1$};
\node[labelnode] (x2) at (\colgap*1,\rowgap*1) {$X_2$};
\node[labelnode] (x3) at (\colgap*2,\rowgap*1) {$X_3$};

\node[latentnode,blue] (x4) at (\colgap*0,\rowgap*0) {$X_4$};
\node[latentnode,red] (x5) at (\colgap*1,\rowgap*0) {$X_5$};
\node[labelnode] (x6) at (\colgap*2,\rowgap*0) {$X_6$};

\foreach \c in {1,...,2} {
\foreach \r in {1,...,2} {
\pgfmathsetmacro{\st}{(((\r-1)*3)+\c)}
\pgfmathsetmacro{\en}{\st+1}
\draw[dagconn] ([xshift=0.2cm]x\st) to ([xshift=-0.9cm]x\en);
}
}

\foreach \c in {1,...,3} {
\foreach \r in {1,...,1} {
\pgfmathsetmacro{\st}{((\r-1)*3)+\c}
\pgfmathsetmacro{\en}{\st+3}
\draw[dagconn] (x\st) to (x\en);
}
}
\end{tikzpicture}
\end{document}

• Use \pgfmathtruncatemacro – percusse Feb 20 '14 at 20:30
• Yes, changing \pgfmathsetmacro to \pgfmathtruncatemacro fixes the problem. Thanks @percusse. – ahmadh Feb 20 '14 at 20:56

To not let the question unanswered, I explain why the east anchor was used and why @percusse recommended to use \pgfmathtruncatemacro.

By \pgfmathsetmacro{\st}{((\r-1)*3)+\c} you will get decimal values such as 1.0, 2.0 and 3.0. So your node names x\st will become x1.0, x2.0 and x3.0. Incidentally, those names are allowed, since that's the syntax for a so called border anchor. The expression after the dot is working as an angle given in degrees. That's why x1.0 is actually the same as x1.east. x1.90 would have been like x1.north.

So you need to get rid of the decimal point, which can be done by using \pgfmathtruncatemacro instead of \pgfmathsetmacro:

\foreach \c in {1,...,3} {
\foreach \r in {1,...,1} {
\pgfmathtruncatemacro{\st}{((\r-1)*3)+\c}
\pgfmathtruncatemacro{\en}{\st+3}
\draw[dagconn] (x\st) to (x\en) node{\st};
}
}