以下 LaTeX 文档保存在路径为 的文件中~/test.tex
。
\documentclass[border=1cm,tikz]{standalone}
\tikzset{ square/.pic={\draw (0,0) rectangle (1,1);} }
\begin{document}
\begin{tikzpicture}
\foreach \i in {
square,
}{\pic {\i};}
\end{tikzpicture}
\end{document}
当在终端执行以下命令时:
cd ~
pdflatex 测试
在路径 处生成一个 PDF 文件~/test.pdf
。在 PDF 查看器中打开时,文件显示如下:
square
如果现在在文档中的单词第二次出现后删除逗号~/test.tex
,那么\foreach
结构看起来如下:
\foreach \i in {
square
}{\pic {\i};}
并重新运行该命令pdflatex test
,执行失败,并且文件~/test.log
包含以下代码片段:
! Package pgfkeys Error: I do not know the key '/tikz/pics/square ' and I am go
ing to ignore it. Perhaps you misspelled it.
See the pgfkeys package documentation for explanation.
Type H <return> for immediate help.
...
l.10 }{\pic {\i};}
?
! Emergency stop.
...
l.10 }{\pic {\i};}
End of file on the terminal!
为什么第二种情况下执行失败?这是 PGF/TikZ 中的错误吗?
答案1
在 的“list”参数中,逗号前的空格不会被忽略\foreach
。使用以下命令会得到同样的错误
\foreach \i in {square , square}{...}
并且您的输入后面确实有一个空格square
,由结束行生成。
考虑一下代码
\documentclass{article}
\usepackage{tikz}
\begin{document}
\foreach \i in { square , circle}{X\i X\endgraf}
\foreach \i in {1 ,...,4}{X\i X\endgraf}
\end{document}
你会得到
我认为这就算是一个缺陷,尤其是在第二种情况下,Ti钾Z 能够检测到范围,但是第一个项目仍然有间隔。
输入如
\foreach \i in {1,... ,4}{ whatever }
导致低级错误
Runaway argument?
4\pgffor@@stop \expandafter \pgffor@dots@charcheck \pgffor@dotsvalue \ETC.
! Paragraph ended before \pgffor@dots@stripcontext was complete.
如果结束括号位于下一行,则始终删除此类列表中逗号前的空格,并保护最后一个元素以免出现在行尾。