tikz - foreach:值列表中的尾随空格不会被忽略

tikz - foreach:值列表中的尾随空格不会被忽略

以下代码导致错误“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 所评论的:由于\lwill 保持其形式直到\ifx\csname...\endcsname\relax测试完成,pgfkeys因此将发现键未定义并触发处理程序.unknown

相关内容