![Tikz:foreach 循环-如何将索引增加 1?](https://linux22.com/image/412799/Tikz%EF%BC%9Aforeach%20%E5%BE%AA%E7%8E%AF-%E5%A6%82%E4%BD%95%E5%B0%86%E7%B4%A2%E5%BC%95%E5%A2%9E%E5%8A%A0%201%EF%BC%9F.png)
我习惯tkz-euclide
像这样转移观点
\tkzDefShiftPoint[A1](1,0){A2}
假设我想要 7 个相邻的点。我可以这样做
\tkzDefShiftPoint[A1](1,0){A2}
\tkzDefShiftPoint[A2](1,0){A3}
\tkzDefShiftPoint[A3](1,0){A4}
\tkzDefShiftPoint[A4](1,0){A5}
\tkzDefShiftPoint[A5](1,0){A6}
\tkzDefShiftPoint[A6](1,0){A7}
这种情况有捷径吗?
我已经尝试过的方法
\foreach \i in {1,...,6}{
\tkzDefShiftPoint[A\i](1,0){A{\i+1}}
}
...但是{\i+1}
部分导致错误。
解决方法
\foreach \i in {1,...,6}{
\edef\indexnew{\fpeval{\i + 1}}
\tkzDefShiftPoint[A\i](1,0){A\indexnew}
}
这可以完成工作,但我认为还有一个更简单的解决方案。
答案1
从我上面的各种评论来看。
- 您可以使用
\numexpr
。 - 您可以
evaluate
使用int
。 - 您可以使用
count=<variable> from <start>
。
此列表并不详尽,并且除了\numexpr
您还可以在部分中找到这些内容89 重复的事情:Foreach 语句pgfmanual v3.1.5。请注意,使用整数时必须小心parse
,这就是我没有将其添加到列表中的原因。
这些只是一些例子,有趣的是最后一个也可以使用,但没有括号。
\documentclass{article}
\usepackage{pgffor}
\begin{document}
\foreach \i in {1,...,5}
{\i,\the\numexpr\i+4\relax\par} %<- sometimes one needs a \relax to delimit
% the numexpr stuff from other expressions that could be parsed
\bigskip
\foreach \i [evaluate=\i as \j using {int(\i+4)}] in {1,...,5}
{\i,\j\par}
\bigskip
\foreach \i [count=\j from 5] in {1,...,5}
{\i,\j\par}
\bigskip
% if you want to start from an expression, do not add braces
% i.e. no braces around \i+1
\foreach \i in {1,...,5}
{\foreach \j [count=\k from \i+1] in {1,2,3}
{\i,\j,\k\par}}
\end{document}
tikzmath
有一些非常密切相关但又略有不同的选项。
请注意,还有一个好的旧方法\loop
,它不会将其迭代的内容分组(可以在\pgfmathloop
pgf 上下文中替换)。此外,pgfplots 还提供\pgfplotsforeachungrouped
,这也可以避免分组。更多信息可以在部分中找到8.1 实用命令pgfplots (!) 手册 v1.17。这只能用于定义内容本地(尽管这与问题中的例子不太相关)。
还有更多来自expl3
、的循环例程listofitems
,etoolbox
我肯定忘记了很多。它们每个都有一些特定的优势(有时也有弱点)。
答案2
我建议使用循环evaluate
的功能foreach
:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
%%% modification according to comments; thanks for pointing it out
\foreach \i [evaluate=\i as \ieval using {int(\i+42)}] in {1,...,6} {
\node at (\i,0) {\ieval};
}
\end{tikzpicture}
\end{document}