以下代码导致错误“key '/tikz/below '
not known”。显然,tikz 忽略了循环值列表中的前导空格,但不会忽略尾随空格\foreach
。
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \l in { above} \draw (0,0) -- node[\l]{a} (1,0);
\foreach \l in {below } \draw (0,0) -- node[\l]{b} (1,0);
\end{tikzpicture}
\end{document}
这是意料之中的事吗?我在 tikz/pgf 手册中没有找到任何说明,考虑到 tikz 其他地方对逗号分隔列表中空格的处理,这种行为是意料之外的。这应该被视为错误吗?值得报告错误吗?
答案1
问题发生(或不发生)的方式如下:在pgffor.code.tex
第 141-149 行
\def\pgffor@iterate{% % Must do all of these in case the internal stack is used. \let\pgffor@last=\pgfutil@empty% \let\pgffor@prevlast=\pgfutil@empty% \let\pgffor@dotsend=\pgfutil@empty% \let\pgffor@dots@pre=\pgfutil@empty% \let\pgffor@dots@post=\pgfutil@empty% % \expandafter\pgffor@scan\pgffor@values}
这里\pgffor@values
是 above, \pgf@stop ,
或below , \pgf@stop ,
(注意空格)。
对于第一种情况,
\expandafter
将产生\pgffor@scan above, \pgf@stop
above
由于它遵循控制序列,所以它之前的空间被吸收了。对于第二种情况,空格将一直存在,并最终成为 的一部分
\l
。
然后,正如@cfr 所评论的:由于\l
will 保持其形式直到\ifx\csname...\endcsname\relax
测试完成,pgfkeys
因此将发现键未定义并触发处理程序.unknown
。