答案1
您提到的修复之前的旧版本。
\def\tikz@expand{%
\advance\tikz@expandcount by -1%
\ifnum\tikz@expandcount<0\relax%
\tikzerror{Giving up on this path. Did you forget a semicolon?}%
\let\pgfutil@next=\tikz@finish%
\else%
\let\pgfutil@next=\tikz@@expand
\fi%
\pgfutil@next}%
有什么问题?\tikz@expand
扩展时,TeX 发现(换行符只是为了不产生太长的行)
\advance\tikz@expandcount by -1\ifnum\tikz@expandcount<0\relax
\tikzerror{Giving up on this path. Did you forget a semicolon?}
\let\pgfutil@next=\tikz@finish\else\let\pgfutil@next=\tikz@@expand\fi
\pgfutil@next
并且其处理规则要求\ifnum
扩展,因为可能会有另一个数字出现。会发生什么?假设当前的值为\tikx@expandcount
2。那么\ifnum
测试返回 false,TeX 认为
\advance\tikz@expandcount by -1\else\let\pgfutil@next=\tikz@@expand\fi
\pgfutil@next
注意该\advance
指令仍处于待处理状态。现在 `\else 被展开,TeX 看到
\advance\tikz@expandcount by -1\let\pgfutil@next=\tikz@@expand\fi
\pgfutil@next
没有数字出现,\advance
指令完成。然后 TeX 继续
\let\pgfutil@next=\tikz@@expand\fi\pgfutil@next
相反,假设的值为\tikz@expand
0。\ifnum
测试将返回错误的,因为\advance
指令还没有最终确定。将会走错路!错误消息之后, Indeed\pgfutil@next
将会变成\tikz@@expand
wanted 。\tikz@finish
如何正确书写该代码?
\def\tikz@expand{%
\advance\tikz@expandcount by -1
\ifnum\tikz@expandcount<0
\tikzerror{Giving up on this path. Did you forget a semicolon?}%
\let\pgfutil@next=\tikz@finish
\else
\let\pgfutil@next=\tikz@@expand
\fi
\pgfutil@next
}
请注意,我删除了无用的\relax
,可以简单地用空格(结束行)替换它。TeX 查找数字时的规则是,搜索数字时会进行宏扩展,并在找到非数字的不可扩展内容时结束。空格不是数字,TeX 会吞掉它(在相同情况下,它不会吞掉任何其他标记)。
在其他地方使用%
字符(我删除了它们)表示对 TeX 语法规则的掌握不佳。
答案2
对于 TeX 来说,行尾位于此上下文空间中。当数字后有空格时,TeX 知道这是停止读取数字参数的点(嗯,\relax
这是一个更强大的选项)。在另一种情况下,TeX 可能会假设下一个命令也是参数的一部分。