这是一个有效的代码(我将在之后描述它):
\documentclass[border=2pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{graphics}
\usepackage{tikz,pgfplots}
\usetikzlibrary{math} % Pour evaluate
\usetikzlibrary{calc} % Pour postionnement relatif
\newcommand*{\addploZ}[2]{
\addplot[#2,samples=60,domain=0:\Ttrace,thick=3pt,ultra thick,
evaluate={ \Tun = (1 / ( 6 *(#1-sqrt(#1^2 -1)) ));
\Tdeux = (1 / ( 6 *(#1+sqrt(#1^2 -1)) )); }
] { \K * (1 - ( 1/( \Tun - \Tdeux ) )*( \Tun *exp(-x/ \Tun ) - \Tdeux *exp(-x/ \Tdeux ) )) };
}
\newcommand*{\LegendArrows}[5]{
\pgfmathparse{(1 / ( 6 *(#1-sqrt(#1^2 -1)) ))} \pgfmathresult \let\Tun\pgfmathresult
\pgfmathparse{(1 / ( 6 *(#1+sqrt(#1^2 -1)) ))} \pgfmathresult \let\Tdeux\pgfmathresult
\coordinate (C2) at (axis cs:#2, { \K * (1 - ( 1/( \Tun - \Tdeux ) )*( \Tun *exp(-#2/ \Tun )
- \Tdeux *exp(-#2/ \Tdeux ) )) }) ;
\draw node[anchor=#3] (#4) at #5 {$z =#2$};
\draw[fleche] (C2) -- (#4.west) ;
}
\tikzset{ fleche/.style={<-,>=latex,line width=0.2mm,shorten <=-0.02cm} }
\begin{document}
\begin{tikzpicture}
\def\K{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*\K,
ytick=\empty,extra y ticks={\K}, extra y tick labels={},extra y tick style={grid=major}
]
\addplot[samples=2,domain=0:(\Ttrace+0.1),thick=1pt] { \K };
\addploZ{2}{blue}
\addploZ{4}{red}
\LegendArrows{4}{0.6}{west}{C3}{($(C2)+(axis cs:1,-0.5)$)}
\LegendArrows{2}{0.6}{south}{C4}{(C3.north)}
\end{axis}
\end{tikzpicture}
\end{document}
编译后您将得到以下杰作: 但你可以看到问题,箭头指向同一个点。
看看正文,让我们分解一下:
\begin{document}
\begin{tikzpicture}
我的功能的一些变量:
\def\K{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*\K,
ytick=\empty,extra y ticks={\K}, extra y tick labels={},extra y tick style={grid=major}
]
水平渐近线
\addplot[samples=2,domain=0:(\Ttrace+0.1),thick=1pt] { \K };
现在调用上面创建的函数:
\addploZ{2}{blue}
\addploZ{4}{red}
它调用的是这个:
\newcommand*{\addploZ}[2]{
\addplot[#2,samples=60,domain=0:\Ttrace,thick=3pt,ultra thick,
evaluate={ \Tun = (1 / ( 6 *(#1-sqrt(#1^2 -1)) ));
\Tdeux = (1 / ( 6 *(#1+sqrt(#1^2 -1)) )); }
] { \K * (1 - ( 1/( \Tun - \Tdeux ) )*( \Tun *exp(-x/ \Tun ) - \Tdeux *exp(-x/ \Tdeux ) )) };
}
您可以看到,我使用 etevaluate
来查找两个参数的值,\Tun
该值\Tdeux
基于发送给 newcommand 的第一个参数(如果您想知道,我将其称为 z)。因此,在第一个调用中 z=2,在第二个调用中 z=4。
而且由于您可以看到这两条曲线,evaluate
所以它起作用了并且我得到了我想要的。
麻烦随之而来:
使用箭头指向曲线:
\LegendArrows{4}{0.6}{west}{C3}{($(C2)+(axis cs:1,-0.5)$)}
\LegendArrows{2}{0.6}{south}{C4}{(C3.north)}
调用函数:
\newcommand*{\LegendArrows}[5]{
\pgfmathparse{(1 / ( 6 *(#1-sqrt(#1^2 -1)) ))} \pgfmathresult \let\Tun\pgfmathresult
\pgfmathparse{(1 / ( 6 *(#1+sqrt(#1^2 -1)) ))} \pgfmathresult \let\Tdeux\pgfmathresult
\coordinate (C2) at (axis cs:#2, { \K * (1 - ( 1/( \Tun - \Tdeux ) )*( \Tun *exp(-#2/ \Tun )
- \Tdeux *exp(-#2/ \Tdeux ) )) }) ;
\draw node[anchor=#3] (#4) at #5 {$z =#2$};
\draw[fleche] (C2) -- (#4.west) ;
}
由于对 进行求值\Tun
并\Tdeux
放置我所调用的节点,这导致箭头发生碰撞C2
。我假设\pgfmathparse
对函数的两个调用使用的两次求值是在绘制箭头之前完成的,因此C2
将两个箭头的 放置在同一个位置(最后一次求值的位置)。
如果我错了你可以纠正我。
无论如何,我尝试了其他解决方案,我的第一次尝试是复制我用来绘制函数的代码,因为我需要评估相同的数量,如下所示:
\newcommand*{\LegendArrows}[5]{
\coordinate[evaluate={ \Tun = (1 / ( 6 *(#1-sqrt(#1^2 -1)) ));
\Tdeux = (1 / ( 6 *(#1+sqrt(#1^2 -1)) )); }
] (C2) at (axis cs:#2, { \K * (1 - ( 1/( \Tun - \Tdeux ) )*( \Tun *exp(-#2/ \Tun ) - \Tdeux *exp(-#2/ \Tdeux ) )) }) ;
\draw node[anchor=#3] (#4) at #5 {$z =#2$};
\draw[fleche] (C2) -- (#4.west) ;
}
但是由于我得到了一个编译错误,我猜想evaluate
是 的一个选项\addplot
,但不是\coordinate
。然而,它是一个选项,\node
所以我可以尝试:
\newcommand*{\LegendArrows}[5]{
\node[evaluate={ \Tun = (1 / ( 6 *(#1-sqrt(#1^2 -1)) ));
\Tdeux = (1 / ( 6 *(#1+sqrt(#1^2 -1)) )); }
] (C2) at (axis cs:#2, { \K * (1 - ( 1/( \Tun - \Tdeux ) )*( \Tun *exp(-#2/ \Tun ) - \Tdeux *exp(-#2/ \Tdeux ) )) }) {} ;
\draw node[anchor=#3] (#4) at #5 {$z =#2$};
\draw[fleche] (C2) -- (#4.west) ;
}
您可以看到这里的箭头如我想要的那样分开,但使用会node
在箭头和曲线之间产生间隙,这就是我\coordinate
首先尝试使用的原因
彻底地讲,下面是正文的结尾:
\end{axis}
\end{tikzpicture}
\end{document}
总结一下我的请求,我请求您提供以下帮助:
- 帮助我正确评估使用
\coordinate
\node
来纠正每当我使用空作为锚点时产生的间隙。- 像这个社区经常做的那样,想出改进和巧妙的办法
先感谢您