为什么这个修复会破坏 pgfplots?

为什么这个修复会破坏 pgfplots?

pgf 上的提交删除%行末的无用部分。此提交似乎损坏了 pgf-plots。这是为什么?用户赫门克州

事实上它之前可以正常工作,这是一个错误。

并提供了修复,但我不明白发生了什么。

%是注释的标记,那么%一行末尾的额外内容如何改变程序的行为?为什么这个额外内容会%导致 pgf-plots 工作?

答案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@expandcount2。那么\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@expand0。\ifnum测试将返回错误的,因为\advance指令还没有最终确定。将会走错路!错误消息之后, Indeed\pgfutil@next将会变成\tikz@@expandwanted 。\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 可能会假设下一个命令也是参数的一部分。

相关内容