假设我已经在 TikZ 中创建了一堆节点——可能是 v0、v1、...、vn-1。我想通过对索引进行算术运算(理想情况下是 mod n)以系统的方式连接这些节点中的某些节点。例如,
\foreach \i \in {0,1,...,n-1} {\draw[->] (v\i) -- (v\{i+2})}
但那行不通,我似乎找不到正确的语法。当我尝试使用 \pgfmathmod 执行复杂操作以对节点名称进行模数运算时,我得到的不是箭头在节点之间很好地连接,而是箭头连接到不合适的边缘。
当我尝试类似的操作时
\foreach \i / \j in {0 / 2, ..., n-2 / n}{ (v\i) -- (v\j)}
,我收到一个奇怪的错误消息“没有名为 v0 的节点”(或类似的消息)。
有什么建议吗?这似乎是一件很明显的事情。
答案1
let 命令在这里很有用,并允许“内联计算”:
\begin{tikzpicture}
\foreach \i in {0,...,9} \draw (\i*36:2cm) node(\i){\i};
\foreach \i in {0,...,9} \draw let \n1={int(mod(\i+2,10))} in (\i) -- (\n1);
\end{tikzpicture}
答案2
如果int
不起作用,可能是因为您需要升级您的软件包。
但是,一种不需要的解决方案int
是使用\pgfmathtruncatemacro
宏。例如,
\begin{tikzpicture}
\foreach \i in {0,...,9}
{
\draw (\i*36:2cm) node(v\i){v\i};
}
\foreach \i in {0,...,9}
{
\pgfmathtruncatemacro{\j}{mod(\i+2,10)}
\draw [->] (v\i) -- (v\j);
}
\end{tikzpicture}
答案3
您可以使用\pgfmathparse
宏来执行此操作。它记录在(惊人的) TikZ 和 PGF 手册,第七部分,但现在你需要知道的是:\pgfmathparse{...}
评估数学表达式...
并将结果存储在中\pgfmathresult
。应该...
看起来像3 + 4 * 5 - sin(6)
。我不知道有没有更好的语法,但如果你用它来有效地预先声明变量(例如,\pgfmathparse{...}\let\j\pgfmathresult
), 不算太差。
在介绍示例代码之前,我还要说两点。首先,第二种情况失败的原因是,据我所知,您只能...
在单变量情况下使用。其次,第一种情况——with——\{i+2}
是错误的,我觉得值得指出。一方面,\i
是一个扩展为某个值的宏:首先0
,然后1
,等等。另一方面,是一个字符,在排版时会产生“i ” i
。两者之间没有任何联系。因此,当您编写时\{i+2}
,您会看到五个标记:\{
、、、和。第一个表示,后三个表示它们自己,最后一个将尝试在之后结束该i
组。+
2
}
{
\foreach
无论如何,使用\pgfmathparse
,我们可以得到如下结果:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{center}\begin{tikzpicture}
\foreach \i in {0,1,...,5} {
\pgfmathparse{60*\i}
\node[draw] (v\i) at (\pgfmathresult:2) {\i} ; % Polar coordinates
}
\foreach \i in {0,1,...,5} {
\pgfmathparse{mod(\i+2,6)}
\draw[->] (v\i) -- (v\pgfmathresult) ;
}
\end{tikzpicture}\end{center}
\end{document}
第一个\foreach
在极坐标中写出节点(即(angle:radius)
);第二个按照您的需要连接它们。
答案4
另一个选项是foreach
使用以下选项将算术转换为标题evaluate
:
evaluate=<variable> as <macro> using <formula>
<variable>
表示要评估的变量,如果未使用,则<macro>
在哪里存储结果,以及要评估的必须包含对的某些引用。<variable>
<formula>
<variable>
\documentclass[tikz, border=2mm]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \i in {0,...,9}
\node (v\i) at (\i*36:2) {\i};
\foreach \i [evaluate=\i as \j using {int(mod(\i+2,10))}]in {0,...,9}
\draw[->] (v\i) -- (v\j);
\end{tikzpicture}
\end{document}