使用额外的 y 刻度时出错,尝试对其进行评估:包 PGF 数学错误

使用额外的 y 刻度时出错,尝试对其进行评估:包 PGF 数学错误

你好,这里有一个最小的代码:

    \documentclass[border=2pt]{standalone}
    \usepackage[utf8]{inputenc}

    \usepackage{graphics}
    \usepackage{tikz,pgfplots}

    \begin{document}
    \begin{tikzpicture}

    \def\Kg{2}
    \def\w{(3.14159*2)}
    \def\Ttrace{3}

    \begin{axis}[axis x line=bottom, axis y line = left ,
    width=13cm, height=\axisdefaultheight,
    ymax=1.55*\Kg, ymin = 1,
    ytick=\empty,extra y ticks={1.9,\Kg,2.1}, extra y tick labels={$0.95K$,$K$,$1.05K$},extra y tick style={grid=none},
        name=aa,
    xtick=\empty,
    ]

    \addplot[samples=2,domain=0:(\Ttrace+0.1),thick=1pt] { \Kg };
    \addplot[samples=2,domain=0:(\Ttrace+0.1),dashed,thin] { 0.95*\Kg };
    \addplot[samples=2,domain=0:(\Ttrace+0.1),dashed,thin] { 1.05*\Kg };

    \end{axis}
    \end{tikzpicture}
    \end{document}

它生产: 在此处输入图片描述

但我想做的是使用类似

    extra y ticks={0.95*\Kg,\Kg,1.05*\Kg}, 

尝试评估该地块的价值。

但如果我这样做就会收到错误:

     Package PGF Math Error: Could not parse input '0.95*2' as a floating point number, sorry. The unreadable part was near '*2'..

即使我尝试混乱

    extra y ticks={{\pgfmathparse{0.95*\Kg}\pgfmathresult},\Kg,{\pgfmathparse{1.05*\Kg}\pgfmathresult}}, 

我得到:

   ! Incomplete \iffalse; all text was ignored after line 27.

答案1

根据您的第一条错误消息,extra y ticks似乎对诸如这样的表达式不满意0.95*2。我不知道这是预期的还是一个错误,但您使用\pgfmathparse来提供extra y ticks已计算的值的想法很好;您在尝试实现它时只是错过了一个重要的点。

计算本身( \pgfmathparse) 依赖于 TeX 操作(例如赋值),这些操作在仅扩展上下文中不起作用;人们经常说它“不可扩展”(相反,\pgfmathresult在仅扩展上下文中有效)。因此,您只需要在可以执行这些操作的地方执行计算(\pgfmathparse或类似操作\pgfmathsetmacro),例如在 中tikzpicture,就在 之前\begin{axis}— 它还可以在许多其他地方工作,甚至在 之前tikzpicture

由于有两个值需要计算,并且\pgfmathresult在给定时间只能存储一个结果,我们将使用\pgfmathsetmacro而不是\pgfmathparse,以便定义两个存储两个结果的宏,如下所示:

\pgfmathsetmacro{\myextraticki}{0.95*\Kg}
\pgfmathsetmacro{\myextratickii}{1.05*\Kg}

请注意,即使只有一个值需要计算,在它的一个参数中使用\pgfmathparse之前执行操作也会非常危险,因为代码可能会在使用之前很好地覆盖你的结果- 参见\begin{axis}\pgfmathresult\begin{axis}\pgfmathresult这里有关此错误的示例。

不过,也可以先进行第一次计算,然后\let\firstresult\pgfmathresult,再进行第二次计算,然后\let\secondresult\pgfmathresult,但这样不太优雅。换句话说,您可以采用下面的示例,将上面给出的两行替换为以下内容:

\pgfmathparse{0.95*\Kg}
\let\myextraticki\pgfmathresult
\pgfmathparse{1.05*\Kg}
\let\myextratickii\pgfmathresult

两个文件的输出完全相同。因此,让我们给出完整的解决方案\pgfmathsetmacro(更优雅的方法):

\documentclass[border=2pt]{standalone}
\usepackage{tikz}
\usepackage{pgfplots}

\begin{document}
\begin{tikzpicture}

\def\Kg{2}
\def\w{(3.14159*2)}
\def\Ttrace{3}

\pgfmathsetmacro{\myextraticki}{0.95*\Kg}
\pgfmathsetmacro{\myextratickii}{1.05*\Kg}

\begin{axis}[axis x line=bottom, axis y line = left,
             width=13cm, height=\axisdefaultheight, ymax=1.55*\Kg, ymin = 1,
             ytick=\empty, extra y ticks={\myextraticki,\Kg,\myextratickii},
             extra y tick labels={$0.95K$,$K$,$1.05K$},
             extra y tick style={grid=none}, name=aa, xtick=\empty]

\addplot[samples=2,domain=0:(\Ttrace+0.1),thick=1pt] { \Kg };
\addplot[samples=2,domain=0:(\Ttrace+0.1),dashed,thin] { 0.95*\Kg };
\addplot[samples=2,domain=0:(\Ttrace+0.1),dashed,thin] { 1.05*\Kg };

\end{axis}

\end{tikzpicture}
\end{document}

截屏

相关内容