评估多次定位的变量

评估多次定位的变量

这是一个有效的代码(我将在之后描述它):

    \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来纠正每当我使用空作为锚点时产生的间隙。
  • 像这个社区经常做的那样,想出改进和巧妙的办法

先感谢您

相关内容