当列表不以逗号结尾时,TikZ foreach 循环失败

当列表不以逗号结尾时,TikZ foreach 循环失败

以下 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}

你会得到

在此处输入图片描述

我认为这就算是一个缺陷,尤其是在第二种情况下,TiZ 能够检测到范围,但是第一个项目仍然有间隔。

输入如

\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.

如果结束括号位于下一行,则始终删除此类列表中逗号前的空格,并保护最后一个元素以免出现在行尾。

相关内容