你好,这里有一个最小的代码:
\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}