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.0
,x2.0
并且x3.0
。顺便说一句,这些名称是允许的,因为这是所谓的边界锚。点后的表达式用作以度为单位的角度。这就是为什么x1.0
实际上与 相同x1.east
。x1.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};
}
}