如何避免複製和貼上此程式碼(使用不同函數的類似新命令定義):

如何避免複製和貼上此程式碼(使用不同函數的類似新命令定義):

感謝你們,我一直在改進我的程式碼,但這看起來仍然可以改進,因為它看起來像一個醜陋的複製/貼上:

\newcommand*{\LegendFlecheInf}[5]{ 
    \coordinate (C2) at (axis cs:#2, { \FInfAUn(#1,#2) }) ;
    \draw node[anchor=#3] (#4) at #5 {$z =#1$};
    \draw[fleche] (C2) -- (#4.west) ;
}
\newcommand*{\LegendFlecheEga}[5]{ 
    \coordinate (C2) at (axis cs:#2, { \FEgaAUn(#2) }) ;
    \draw node[anchor=#3] (#4) at #5 {$z =#1$};
    \draw[fleche] (C2) -- (#4.west) ;
}
\newcommand*{\LegendFlecheSup}[5]{ 
    \coordinate (C2) at (axis cs:#2, { \FSupAUn(#1,#2) }) ;
    \draw node[anchor=#3] (#4) at #5 {$z =#1$};
    \draw[fleche] (C2) -- (#4.west) ;
}

此處定義的 3 個命令之間的唯一差異在於將呼叫哪個函數來計算箭頭末端的 y 座標。

我為 MWE 刪除了很多內容,但它仍然很大:

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

\usepackage{graphics}
\usepackage{tikz,pgfplots}
\usetikzlibrary{math} % Pour evaluate
\usetikzlibrary{calc} % Pour postionnement relatif

\def\FInfAUn(#1,#2){( 1 - ( (exp(-W*#1*#2)/sqrt(1-#1*#1)) *cos((W*#2*sqrt(1-#1*#1) 
                    - (atan(#1/sqrt(1-#1*#1))*pi/180) ) *180/pi) )  ) *\Kg }

\def\FTUn(#1){( 1/( W*(#1-sqrt((#1*#1) -1))) )}
\def\FTDeux(#1){( 1/(W *(#1+sqrt((#1*#1) -1))) )}
\def\FInterSupAUn(#1,#2,#3){(  \Kg * (1 - ( 1/( #1 - #2 ) )*( #1 *exp(-#3/ #1 ) - #2 *exp(-#3/ #2 ) ))   )}
\def\FSupAUn(#1,#2){ \FInterSupAUn({\FTUn(#1)},{\FTDeux(#1)},#2)   }
\def\FEgaAUn(#1){ \Kg * (1 - ( 1+ #1/(1/W) )*exp(-#1/(1/W)) )  }

    \newcommand*{\LegendFlecheInf}[5]{ 
        \coordinate (C2) at (axis cs:#2, { \FInfAUn(#1,#2) }) ;
        \draw node[anchor=#3] (#4) at #5 {$z =#1$};
        \draw[fleche] (C2) -- (#4.west) ;
    }
    \newcommand*{\LegendFlecheEga}[5]{ 
        \coordinate (C2) at (axis cs:#2, { \FEgaAUn(#2) }) ;
        \draw node[anchor=#3] (#4) at #5 {$z =#1$};
        \draw[fleche] (C2) -- (#4.west) ;
    }
    \newcommand*{\LegendFlecheSup}[5]{ 
        \coordinate (C2) at (axis cs:#2, { \FSupAUn(#1,#2) }) ;
        \draw node[anchor=#3] (#4) at #5 {$z =#1$};
        \draw[fleche] (C2) -- (#4.west) ;
    }

\tikzset{ fleche/.style={<-,>=latex,line width=0.2mm,shorten <=-0.02cm} }

\begin{document}
\begin{tikzpicture}[
  declare function={
    W=pi*2;
  }]
\def\Kg{2}
\def\Ezero{1} 
\def\Ttrace{3}

\begin{axis}[ymax=1.55*\Kg]
    \addplot[blue,loosely dashed,thick=3pt,ultra thick,domain=0:3] {  \FEgaAUn(x)  };  \label{d}

    %\LegendFleche{z}{t}{Anchor of new node}{New node name}{previous node anchor coinsiding with this anchor}
    \LegendFlecheInf{0.2}{0.6}{west}{C3}{($(C2)+(axis cs:0.5,0.05)$)}
    \LegendFlecheSup{4}{0.6}{west}{C3}{($(C2)+(axis cs:1,-0.5)$)}
    \LegendFlecheSup{2}{0.6}{south}{C4}{(C3.north)}
    \LegendFlecheEga{1}{0.6}{south}{C5}{(C4.north)}

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

答案1

你可以替換

\newcommand*{\LegendFlecheInf}[5]{ 
    \coordinate (C2) at (axis cs:#2, { \FInfAUn(#1,#2) }) ;
    \draw node[anchor=#3] (#4) at #5 {$z =#1$};
    \draw[fleche] (C2) -- (#4.west) ;
}
\newcommand*{\LegendFlecheEga}[5]{ 
    \coordinate (C2) at (axis cs:#2, { \FEgaAUn(#2) }) ;
    \draw node[anchor=#3] (#4) at #5 {$z =#1$};
    \draw[fleche] (C2) -- (#4.west) ;
}
\newcommand*{\LegendFlecheSup}[5]{ 
    \coordinate (C2) at (axis cs:#2, { \FSupAUn(#1,#2) }) ;
    \draw node[anchor=#3] (#4) at #5 {$z =#1$};
    \draw[fleche] (C2) -- (#4.west) ;
}

經過

\newcommand*{\Legendx}[6]{ 
    \coordinate (C2) at (axis cs:#2, { #6(#1,#2) }) ;
    \draw node[anchor=#3] (#4) at #5 {$z =#1$};
    \draw[fleche] (C2) -- (#4.west) ;
}

然後替換例如

\LegendFlecheEga{1}{0.6}{south}{C5}{(C4.north)}

經過

\Legendx{1}{0.6}{south}{C5}{(C4.north)}\FEgaAUn

答案2

使用該ifthen包,您可以用新命令替換這三個命令:

\newcommand{\LegendComplex}[6]{  
     \ifthenelse{\equal{#6}{inf}}{\coordinate (C2) at (axis cs:#2, {\FInfAUn(#1,#2)});}{}
     \ifthenelse{\equal{#6}{sup}}{\coordinate (C2) at (axis cs:#2, {\FSupAUn(#1,#2)});}{}
     \ifthenelse{\equal{#6}{ega}}{\coordinate (C2) at (axis cs:#2, {\FEgaAUn(#2)});}{}      
    \draw node[anchor=#3] (#4) at #5 {$z =#1$};
    \draw[fleche] (C2) -- (#4.west) ;
}

您必須提供一個新參數(sup、inf 或 ega)來指定您要呼叫的函數。

相關內容