我正在尝试学习\foreach
TikZ,但遇到的所有错误都让我感到困惑。下面是我尝试过的代码示例,它给了我:
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$, }
产生 A1、乙1、C1、德1、埃1、F1、G1、H1 .
您的第一种方法无法工作,因为您使用了...
符号,但列表元素没有共同的模式。因此无法进行上下文替换。
第二种方法有效,因为列表中的所有元素都以 结尾+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
。