指向具有计算名称的节点,为什么我到达东边,而不是中心?

指向具有计算名称的节点,为什么我到达东边,而不是中心?

foreach在使用变量表示节点编号时,我似乎做错了。两个 foreach 循环将路径锚定到每个节点的东边。为什么会发生这种情况?

示例输出

\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}

答案1

为了不让问题得不到解答,我解释了为什么使用东锚以及为什么@percusse 建议使用\pgfmathtruncatemacro

\pgfmathsetmacro{\st}{((\r-1)*3)+\c}您将获得十进制值,例如 1.0、2.0 和 3.0。因此,您的节点名称将x\st变为x1.0x2.0并且x3.0。顺便说一句,这些名称是允许的,因为这是所谓的边界锚。点后的表达式用作以度为单位的角度。这就是为什么x1.0实际上与 相同x1.eastx1.90本来应该是x1.north

因此,您需要去掉小数点,可以通过使用\pgfmathtruncatemacro而不是 来实现\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};
  }
}

相关内容