chaips
C CHAIPS SOURCE GOUNAND 23/01/16 21:15:03 11556 C *============================================================= * * MANIP POUR L INTERPRETATION DES CHAINES (TITRE LABEL LEGENDES ...) * LORS DE L ECRITURE D UN FICHIER POSTSCRIPT * *============================================================= IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Y) -INC PPARAM -INC CCOPTIO -INC CCTRACE CHARACTER*(*) TITRE cbp: on definit l angle du texte : ANGLE c + une position centrée (ou pas) : IALIGN=2 (ou 0 ou 1) *============================================================= * ROTATION DE LA CHAINE PAR RAPPORT AU POINT X *============================================================= c rotation si demandée ANGLE=dble(INFOTR(1)) if(ANGLE.ne.0.d0)then endif *============================================================= * CENTREMENT DE LA CHAINE PAR RAPPORT AU POINT X *============================================================= c seulement si centrement demandé, sinon inutile IALIGN=INFOTR(2) IF(IALIGN.GE.2) THEN c on commence par predimensionner la chaine qui va etre ecrite iposch=1 i=0 c---> Boucle sur les caracteres i=i+1 c -si on NE lit PAS un caractere définissant un contexte particulier if((titre(i:i+1).eq.'_{').or.(titre(i:i+1).eq.'^{')) then i=i+1 elseif((titre(i:i).ne.char(92)) # .and.(titre(i:i).ne.'{').and.(titre(i:i).ne.'}') # .and.(titre(i:i).ne.'(').and.(titre(i:i).ne.')')) then c alors on l'ajoute a la chaine iposch=iposch+1 endif 7 continue 8 continue c Centrement ENDIF *============================================================= * INITIALISATIONS *============================================================= c info sur la police utilisee iposiz = (IOPOTR+3)/4 ipopol = IOPOTR - (4*(iposiz-1)) iposiz = (iposiz*2) + 10 * write(ioimp,*) 'ipopol,iposiz=',ipopol,iposiz isymb = 0 c precedente police utilise (standard par defaut) iprec = 10 c eventuel decalage (ydec1=a apporter ; ydec=cumul=position) xdec = 0. ydec = 0. ydec1= 0. idec = 0 c indice de positionnement dans les chaine de caracteres iplac =1 iposch=1 c ecriture ? iecrit=0 *============================================================= * TRAVAIL CARACTERE PAR CARACTERE *============================================================= i=0 c---> Boucle sur les caracteres c --- Lecture du i^eme caractere (s il est defini) --- i=i+1 c -si on lit un caractere définissant un contexte particulier if((titre(i:i+1).eq.'_{').or.(titre(i:i+1).eq.'^{') # .or.(titre(i:i).eq.'}').or.(titre(i:i).eq.char(92))) then iecrit=1 c -sinon on le met dans CHAINE else c on met des \ avant des eventuelles parentheses ... if(titre(i:i).eq.'('.or.titre(i:i).eq.')') then iposch=iposch+2 c ... ATTENTION !!! Sur IBM (AIX) il considère le \ comme un "escape", c on est donc obligé d'en mettre deux, il faut espérer que ça ne va c pas foirer sur d'autres machines. J'aurais pu mettre char(92) au c lieu de ça, mais ça ne marcherait qu'en ASCII (il y a peut etre c encore des gens qui bossent sur des mainframes) (M'Bulik) ... * CHAINE(iposch-1:iposch-1)='\\' else iposch=iposch+1 endif c tant qu'on est pas arrivé au bout, on enregistre sans écrire c if(i.lt.LTITRE) then c iecrit=0 c else c iecrit=1 c endif endif c write(6,*)'CHAINE=',CHAINE(2:iposch),' ipo,ecri',iposch,iecrit c --- Ecriture de la CHAINE dans le postscript --- c rem: si le 1er caractere est spécial (_{} par ex), alors on c peut ecrire une chaine vide (iposch=1) if(iecrit.eq.1.and.iposch.ge.1) then c -Ecriture de la police if(isymb.eq.0) then if(ydec.eq.0) then if(iprec.ne.10) then endif iprec = 10 else if(iprec.ne.7) then endif iprec = 7 endif endif c -Positionnement if(iplac.gt.1) then xdec = 0. ydec1 = 0. c mise a 0 de idec si on écrit sur l'axe d'origine if(ydec.eq.0..and.iposch.gt.1) idec=0 endif c -Ecriture de la chaine ( TITRE(1:iposch) ) SX iplac=iplac+1 955 format (a) c -On recommence le remplissage de CHAINE avec les caracteres suivants iecrit=0 iposch=1 isymb =0 endif c --- Traitement des caracteres définissant un contexte particulier --- c --- Traitement des caracteres définissant une police (Symbole) --- c -un \ fourni par l utilisateur indique qu il veut un symbole grec c il faut changer la font + imposer d'écrire le caractere i+1 c write(6,*) 'on a trouvé un antislash \ ' isymb =1 iecrit=1 if(ydec.eq.0) then iprec = -10 else iprec = -7 endif endif c --- Traitement des caracteres définissant une position --- c -un _{ } fourni par l utilisateur indique qu'il veut un indice c if((titre(i:i+1).eq.'_{').and.(i+3.le.LTITRE)) then if((titre(i:i+1).eq.'_{')) then c write(6,*) 'on a trouvé un underscore _{' c on recupere la position courante car on en a peut etre besoin if(idec.eq.0) then idec=-1 c pour se replacer en ce point elseif(idec.eq.1) then idec=0 endif c on calcule le decalage vertical -2.5 ydec1 = ydec1 - (2.5*real(iposiz)) ydec = ydec + ydec1 c write(6,*) 'on va decaler de ',ydec1,' -> y=',ydec i=i+1 c -un ^{ } fourni par l utilisateur indique qu'il veut un exposant c elseif((titre(i:i+1).eq.'^{').and.(i+3.le.LTITRE)) then elseif((titre(i:i+1).eq.'^{')) then c write(6,*) 'on a trouvé un exposant ^{' c on recupere la position courante car on en a peut etre besoin if(idec.eq.0) then idec=1 c pour se replacer en ce point elseif(idec.eq.-1) then idec=0 endif c on calcule le decalage vertical +5 ydec1 = ydec1 + (5.*real(iposiz)) ydec = ydec + ydec1 c write(6,*) 'on va decaler de ',ydec1,' -> y=',ydec i=i+1 c -fin de la zone indice ou exposant elseif(titre(i:i).eq.'}') then c write(6,*) 'on a trouvé la fin de cette zone }' c il faut préparer le retour a l'alignement original (ydec=0) ydec1 = -1.*ydec ydec = ydec+ydec1 c write(6,*) 'on va decaler de ',ydec1,' retour en y=0=',ydec endif c i peut etre incrémenté en plus pour sauter l'accolade { 77777 continue *============================================================= * FORMATS UTILES *============================================================= *pour faire des "(chaine) center" (commande définie dans strini): 907 format (A,1X,'center') *pour faire des "(chaine) right" (commande définie dans strini): 908 format (A,1X,'right') *pour faire des "rmoveto H1" : 977 format (1X,F10.3,1X,F10.3,1X,A) *pour revenir a la police initiale : *police Symbol : c 1850 format('/Symbol-ISOLatin1 findfont ',I2,' scalefont setfont') *police exposant et indice (=0.75*taille de la font par ex.) 2846 format('/Courier-ISOLatin1 findfont ',F4.1,' scalefont setfont') 2847 format('/CourierBold-ISOLatin1 findfont ',F4.1, $ ' scalefont setfont') 2848 format('/Helvetica-ISOLatin1 findfont ',F4.1,' scalefont setfont') 2849 format('/Times-ISOLatin1 findfont ',F4.1,' scalefont setfont') *police Symbol exposant et indice : c 2850 format('/Symbol-ISOLatin1 findfont ',F4.1,' scalefont setfont') 2850 format('/Symbol findfont ',F4.1,' scalefont setfont') *stockage du point courant dans le stack et repositionnement en ce point 1111 format('currentpoint') 1112 format('moveto') *============================================================= * AVANT DE QUITTER, ON REMET TOUT PAR DEFAUT *============================================================= c on remet la police d origine if(iprec.ne.10) then endif c rotation inverse : on revient dans le bon sens if(ANGLE.ne.0.d0)then endif RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales