我该如何解决这个 TikZ 错误:(\x)^2 和 \x^2 在 TikZ 图中产生不同的结果?

我该如何解决这个 TikZ 错误:(\x)^2 和 \x^2 在 TikZ 图中产生不同的结果?

我有一些包含 TikZ 图形的文件,自从我升级到 PGF-2.10 以来,它们的外观突然发生了变化。这是一个最简单的例子:

\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\pgfversion\par
\begin{tikzpicture}
\draw[blue] plot[domain=-1:1] (\x,{\x^2 + \x^3});
\draw[xshift=4cm,blue] plot[domain=-1:1] (\x,{(\x)^2 + (\x)^3});
\end{tikzpicture}
\end{document}

在 PGF 2.00 中我有这个:

最小示例

而在 2.10 中我有这个:

最小示例

PGF 2.10 中左侧的图看起来像 y=x^3 的图,但也可能是 y=x^3 + x|x|。这已经已报告在 sourceforge 和讨论在 pgf-users 邮件列表上。虽然我还没有亲自检查,但这个错误仍然悬而未决,下面的一些评论者报告说 CVS 版本中仍然存在问题。

Geoffrey Jones 指出该错误出现在 2.00 CVS 版本中:

嗨,Matthew,这不是答案,只是一条供参考的信息,内容太大,无法在评论框中显示。我通过 pgf v2.00 编译了您的代码,得到了您在 v2.10 中看到的结果,如上所示:替代文本

即,您观察到的差异似乎早于 v2.10。

有一种解决方法是插入括号。但由于我有很多旧的讲座文件,我宁愿找到一个不涉及重写 TikZ 代码的解决方案。而且,即使 CVS 的前沿代码已经修复,我也不愿意使用它,因为我不想引入其他问题。理想情况下,我想要一个简单的补丁,可以放在序言中,或者只修复 PGF 发行版中的一个文件。

答案1

错误单已2013-07-12 被拒绝,Till Tantau 的评论如下:

这不是一个错误。TeX 执行的是纯文本替换,因此being被 替换为{\x^2}, 其正确计算结果为 , 因为幂运算符确实优先于一元否定(理应如此)。\x-2{-2^2}-4

您正在寻找的是{(\x)^2},它可以按预期工作。

答案2

好的,这里有一个针对该错误的新的改进补丁(现在已在更多情况下进行了测试):

\documentclass{minimal}
\usepackage{tikz}
\makeatletter
\def\tikz@scan@no@calculator#1(#2){%
    \patch@tikz(#2)%
    \expandafter\tikz@@scan@@no@calculator\expandafter#1\tikz@temp
    }
\def\patch@tikz(#1,#2){%
    {\expandafter\let\expandafter\save@tikz@plot@var\tikz@plot@var
     \expandafter\def\tikz@plot@var{(\save@tikz@plot@var)}%
     \xdef\tikz@temp@i{#1}%
     \xdef\tikz@temp@ii{#2}%
     }%
    \edef\tikz@temp{({\tikz@temp@i},{\tikz@temp@ii})}%
    }
\makeatother
\begin{document}
\pgfversion\par
\begin{tikzpicture}
\draw[blue,variable=\t] plot[domain=-1:1] (\t,{\t^2 + \t^3});
\draw[xshift=4cm,blue] plot[domain=-1:1] (\x,{(\x)^2 + (\x)^3});
\draw[xshift=8cm,scale=0.5,domain=-3.141:3.141,smooth,variable=\t]
plot ({\t*sin(\t r)},{\t*cos(\t r)});
\end{tikzpicture}
\end{document}

在 中,将(或,无论绘图变量是什么)\patch@tikz放在括号内。\x\t

以下是我最初回答的部分内容:

下面的简短代码揭示了这个问题。

\documentclass{minimal}
\usepackage{pgf}
\begin{document}
\pgfversion\par
\pgfmathparse{-1^2}\pgfmathresult
\end{document}

v 2.00结果是1.0(这产生了正确的图表!),在v 2.10它是-1.0(这在数学上是正确的,但显然与其他 pgf/TikZ 组件不兼容)。事实上,在pgf 用户列表我链接到了这个问题的评论中,我发现

该问题出现在早期版本中,因为前缀否定的优先级不正确。

因此,数学错误-1.0^2 = 1.0得到了纠正,但纠正(自然)导致了另一个错误。

谨防!上述链接中的帖子中有些内容具有误导性。例如,

CVS 版本对 -0.2^3 和 (-0.2)^3 都给出 -0.008

出色地,当然确实如此。问题只出现在甚至权力。

(又一个)编辑:

PGF 2.00 中的数学错误也会对绘制图形产生影响:如果您想要-\x^2,那么这并不那么容易。

\draw plot[domain=-1:1] (\x,-\x^2);

\draw plot[domain=-1:1] (\x,{-(\x)^2});

两个都得到图表y=x^2(对于第二个版本,这对我来说仍然是一个奇迹),并且

\draw plot[domain=-1:1] (\x,{-\x^2});

抛出错误(我也不明白)。解决方法是使用

\draw plot[domain=-1:1] (\x,0-\x^2);

(在 PGF 2.10 中,所有 4 个版本都可以编译,但只有第二版本产生了正确的结果;使用我的补丁,所有 4 个版本都可以。)

答案3

解决方案 1 中建议的补丁对我不起作用。问题似乎已在 CVS 中修复。替代补丁https://tex.stackexchange.com/a/31791/14564对我有用,我建议用它作为解决方案 1 中的补丁的替代方案。

相关内容