Tikz:foreach 循环-如何将索引增加 1?

Tikz:foreach 循环-如何将索引增加 1?

我习惯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

从我上面的各种评论来看。

  1. 您可以使用\numexpr
  2. 您可以evaluate使用int
  3. 您可以使用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,它不会将其迭代的内容分组(可以在\pgfmathlooppgf 上下文中替换)。此外,pgfplots 还提供\pgfplotsforeachungrouped,这也可以避免分组。更多信息可以在部分中找到8.1 实用命令pgfplots (!) 手册 v1.17。这只能用于定义内容本地(尽管这与问题中的例子不太相关)。

还有更多来自expl3、的循环例程listofitemsetoolbox我肯定忘记了很多。它们每个都有一些特定的优势(有时也有弱点)。

答案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}

相关内容