在 tikz 中使用 \foreach 进行计算

在 tikz 中使用 \foreach 进行计算

我正在尝试学习\foreachTikZ,但遇到的所有错误都让我感到困惑。下面是我尝试过的代码示例,它给了我:

ForeachEvaluateTest.tex:0:File ended while scanning use of \pgffor@stripcontext
\documentclass{article}
\usepackage{tikz}

\begin{document} 
 \pgfmathsetmacro{\dx}{5}
 \pgfmathsetmacro{\offx}{2}

 \begin{tikzpicture}
  \pgfmathsetmacro{\endi}{\offx+\dx}
  \pgfmathsetmacro{\starti}{\offx}

  \foreach \i [evaluate=\i] in {\starti,...+1,\endi}
  {
   \draw (\i,0) -- (\i,1);
  }
 \end{tikzpicture}    
\end{document}

我设法通过一种奇怪的修改来解决这个问题,但这不可能是最好的解决办法。

\documentclass{article}
\usepackage{tikz}

\begin{document} 
 \pgfmathsetmacro{\dx}{5}
 \pgfmathsetmacro{\offx}{2}

 \begin{tikzpicture}
  \pgfmathsetmacro{\endi}{\offx+\dx-1}
  \pgfmathsetmacro{\starti}{\offx-1}

  \foreach \i [evaluate=\i] in {\starti+1,...+1,\endi+1}
  {
   \draw (\i,0) -- (\i,1);
  }
 \end{tikzpicture}    
\end{document}

有什么可以说明为什么会出现这种差异吗?

答案1

请参阅 TikZ/PGF 手册第 505 页:

语句的最后一个特殊情况...是上下文替换。如果...在某些上下文中使用,例如,,sin(...)则该上下文将被正确解释,前提是语句之前的列表项...具有确切地模式相同,不同之处在于它们不是点,而是数字或字符: \foreach \x in {2^1,2^...,2^7} {$\x$, }产生 2 1、 2 2、 2 3、 2 4、 2 5、 2 6、 2 7,[...]\foreach \x in {A_1,..._1,H_1} {$\x$, }产生 A11C111F1G1H1 .

您的第一种方法无法工作,因为您使用了...符号,但列表元素没有共同的模式。因此无法进行上下文替换。

第二种方法有效,因为列表中的所有元素都以 结尾+1。这是一种可以识别的模式pgffor,在这种情况下可以进行上下文替换。通过用由、、 、 ...组成的逗号分隔列表pgffor“替换”来填充缺失值,\starti+1,...+1,\endi+1\starti+1\starti+1+1\starti+2+1\endi+1

\starti但是,第二种方法需要在和的定义中减去 1 \endi,然后在列表的每个元素中加 1。这是一种相当迂回的做法。在我看来,更直接的方法是为列表中的第二个元素定义一个宏:

\documentclass{article}
\usepackage{tikz}

\begin{document} 
 \pgfmathsetmacro{\dx}{5}
 \pgfmathsetmacro{\offx}{2}

 \begin{tikzpicture}
  \pgfmathsetmacro\starti{\offx}
  \pgfmathsetmacro\secondi{\starti+1}
  \pgfmathsetmacro\endi{\offx+\dx}

  \foreach \i in {\starti,\secondi,...,\endi}
  {
   \draw (\i,0) -- (\i,1);
  }
 \end{tikzpicture}    
\end{document}

有关更多详细信息,请参阅手册第 56 节\foreach

相关内容