*
;
 /*------------------------------------------------------------------*
  * THIS MACRO CREATES AN ANNOTATE DATASET FOR PLOTTING A LINE ON A  *
  * SURFACE GRAPH.  YOU WOULD TYPICALLY USE THIS TO SHOW ACCUMULATED *
  * VALUES SHOWN AS A SURFACE GRAPH LYING UNDERNEATH A CHANGING      *
  * VALUE LINE SUCH AS A TARGET OR MAXIMUM CAPACITY ETC.  IT ALLOWS  *
  * YOU TO MIX A SURFACE PLOT WITH A LINE PLOT JUST LIKE YOU CAN DO  *
  * WITH GDDM.  DO NOT FORGET TO SPECIFY THE ANNOTATE DATASETS YOU   *
  * CREATE TO GPLOT USING THE ANNO= PARAMETER.                       *
  *------------------------------------------------------------------*/

 /*-----------------------------------------------------------------*
  * DSN      - NAME OF INPUT DATASET.                               *
  * XVAR     - VARIABLE NAME OF X VARIABLE.                         *
  * YVAR     - VARIABLE NAME OF Y VARIABLE.                         *
  * BYVAR    - VARIABLE NAME OF BY VARIABLE.                        *
  * OUTDSN   - NAME OF OUTPUT ANNOTATE DATASET.                     *
  * COLOR    - COLOR FOR THE TEXT (NO QUOTES).  RECOMMEND BLANK.    *
  *-----------------------------------------------------------------*/

%MACRO MKLNANNO(DSN=,OUTDSN=ZZLNANNO,XVAR=,YVAR=,BYVAR=,COLOR=);

DATA &OUTDSN;
   RETAIN FUNCTION 'DRAW' WHEN 'A' XSYS '2' YSYS '2';
   LENGTH COLOR $ 1;
   SET &DSN(KEEP=&XVAR &YVAR &BYVAR);
   COLOR="&COLOR ";
   RENAME &XVAR=X &YVAR=Y ;

PROC SORT DATA=&OUTDSN;
   BY &BYVAR X;

DATA &OUTDSN(COMPRESS=NO);
   SET &OUTDSN(WHERE=(Y NE .));
   %IF %QUOTE(&BYVAR) NE %THEN %DO;
      BY &BYVAR X;
      IF FIRST.&BYVAR THEN FUNCTION='MOVE';
   %END;
   %ELSE %DO;
      IF _N_=1 THEN FUNCTION='MOVE';
   %END;
RUN;
%MEND MKLNANNO;


*Example;

 data one;
  do x=0 to 1 by atan(1)/4;
     y=cos((1-x)/(1+x));
     output;
  end;
run;

%MKLNANNO(DSN=one,OUTDSN=two,XVAR=x,YVAR=y,BYVAR=,COLOR=red);

symbol i=splinep;
proc gplot data=one;
  plot y*x/ areas=1 annotate=two;
run;

*
;