Télécharger chaips.eso

Retour à la liste

Numérotation des lignes :

chaips
  1. C CHAIPS SOURCE GOUNAND 23/01/16 21:15:03 11556
  2. C
  3. SUBROUTINE CHAIPS (TITRE,LTITRE)
  4. *=============================================================
  5. *
  6. * MANIP POUR L INTERPRETATION DES CHAINES (TITRE LABEL LEGENDES ...)
  7. * LORS DE L ECRITURE D UN FICHIER POSTSCRIPT
  8. *
  9. *=============================================================
  10. IMPLICIT INTEGER(I-N)
  11. IMPLICIT REAL*8 (A-H,O-Y)
  12.  
  13.  
  14. -INC PPARAM
  15. -INC CCOPTIO
  16. -INC CCTRACE
  17.  
  18. CHARACTER*(*) TITRE
  19. CHARACTER*128 CHAINE
  20. PARAMETER(IUPS=24)
  21.  
  22. cbp: on definit l angle du texte : ANGLE
  23. c + une position centrée (ou pas) : IALIGN=2 (ou 0 ou 1)
  24.  
  25. *=============================================================
  26. * ROTATION DE LA CHAINE PAR RAPPORT AU POINT X
  27. *=============================================================
  28. c rotation si demandée
  29. ANGLE=dble(INFOTR(1))
  30. if(ANGLE.ne.0.d0)then
  31. write (IUPS,fmt='(F4.1,'' rotate '')') ANGLE
  32. endif
  33.  
  34. *=============================================================
  35. * CENTREMENT DE LA CHAINE PAR RAPPORT AU POINT X
  36. *=============================================================
  37. c seulement si centrement demandé, sinon inutile
  38. IALIGN=INFOTR(2)
  39. IF(IALIGN.GE.2) THEN
  40. c on commence par predimensionner la chaine qui va etre ecrite
  41. iposch=1
  42. i=0
  43. c---> Boucle sur les caracteres
  44. do 7 i7=1,LTITRE
  45. i=i+1
  46. if(i.gt.LTITRE) goto 8
  47. c -si on NE lit PAS un caractere définissant un contexte particulier
  48. if((titre(i:i+1).eq.'_{').or.(titre(i:i+1).eq.'^{')) then
  49. i=i+1
  50. elseif((titre(i:i).ne.char(92))
  51. # .and.(titre(i:i).ne.'{').and.(titre(i:i).ne.'}')
  52. # .and.(titre(i:i).ne.'(').and.(titre(i:i).ne.')')) then
  53. c alors on l'ajoute a la chaine
  54. iposch=iposch+1
  55. CHAINE(iposch:iposch)=titre(i:i)
  56. endif
  57. 7 continue
  58. 8 continue
  59. c Centrement
  60. CHAINE(1:1)='('
  61. CHAINE(iposch+1:iposch+1)=')'
  62. IF(IALIGN.EQ.2) write(IUPS,907) CHAINE(1:iposch+1)
  63. IF(IALIGN.EQ.3) write(IUPS,908) CHAINE(1:iposch+1)
  64. ENDIF
  65.  
  66. *=============================================================
  67. * INITIALISATIONS
  68. *=============================================================
  69. c info sur la police utilisee
  70. iposiz = (IOPOTR+3)/4
  71. ipopol = IOPOTR - (4*(iposiz-1))
  72. iposiz = (iposiz*2) + 10
  73. * write(ioimp,*) 'ipopol,iposiz=',ipopol,iposiz
  74. isymb = 0
  75. c precedente police utilise (standard par defaut)
  76. iprec = 10
  77. c eventuel decalage (ydec1=a apporter ; ydec=cumul=position)
  78. xdec = 0.
  79. ydec = 0.
  80. ydec1= 0.
  81. idec = 0
  82. c indice de positionnement dans les chaine de caracteres
  83. iplac =1
  84. iposch=1
  85. c ecriture ?
  86. iecrit=0
  87.  
  88. *=============================================================
  89. * TRAVAIL CARACTERE PAR CARACTERE
  90. *=============================================================
  91. i=0
  92. c---> Boucle sur les caracteres
  93. do 77777 i777=1,LTITRE
  94.  
  95. c --- Lecture du i^eme caractere (s il est defini) ---
  96. i=i+1
  97. if(i.gt.LTITRE) goto 77777
  98.  
  99. c -si on lit un caractere définissant un contexte particulier
  100. if((titre(i:i+1).eq.'_{').or.(titre(i:i+1).eq.'^{')
  101. # .or.(titre(i:i).eq.'}').or.(titre(i:i).eq.char(92))) then
  102. iecrit=1
  103. c -sinon on le met dans CHAINE
  104. else
  105. c on met des \ avant des eventuelles parentheses ...
  106. if(titre(i:i).eq.'('.or.titre(i:i).eq.')') then
  107. iposch=iposch+2
  108. c ... ATTENTION !!! Sur IBM (AIX) il considère le \ comme un "escape",
  109. c on est donc obligé d'en mettre deux, il faut espérer que ça ne va
  110. c pas foirer sur d'autres machines. J'aurais pu mettre char(92) au
  111. c lieu de ça, mais ça ne marcherait qu'en ASCII (il y a peut etre
  112. c encore des gens qui bossent sur des mainframes) (M'Bulik) ...
  113. * CHAINE(iposch-1:iposch-1)='\\'
  114. CHAINE(iposch-1:iposch-1)=char(92)
  115. CHAINE(iposch :iposch )=TITRE(i:i)
  116. else
  117. iposch=iposch+1
  118. CHAINE(iposch:iposch)=TITRE(i:i)
  119. endif
  120. c tant qu'on est pas arrivé au bout, on enregistre sans écrire
  121. c if(i.lt.LTITRE) then
  122. c iecrit=0
  123. c else
  124. c iecrit=1
  125. c endif
  126. if(i.eq.LTITRE) iecrit=1
  127. endif
  128. c write(6,*)'CHAINE=',CHAINE(2:iposch),' ipo,ecri',iposch,iecrit
  129.  
  130. c --- Ecriture de la CHAINE dans le postscript ---
  131. c rem: si le 1er caractere est spécial (_{} par ex), alors on
  132. c peut ecrire une chaine vide (iposch=1)
  133. if(iecrit.eq.1.and.iposch.ge.1) then
  134. c -Ecriture de la police
  135. if(isymb.eq.0) then
  136. if(ydec.eq.0) then
  137. if(iprec.ne.10) then
  138. if(ipopol.eq.1) write(IUPS,1846) iposiz
  139. if(ipopol.eq.2) write(IUPS,1847) iposiz
  140. if(ipopol.eq.3) write(IUPS,1848) iposiz
  141. if(ipopol.eq.4) write(IUPS,1849) iposiz
  142. endif
  143. iprec = 10
  144. else
  145. if(iprec.ne.7) then
  146. if(ipopol.eq.1) write(IUPS,2846) (0.71*iposiz)
  147. if(ipopol.eq.2) write(IUPS,2847) (0.71*iposiz)
  148. if(ipopol.eq.3) write(IUPS,2848) (0.71*iposiz)
  149. if(ipopol.eq.4) write(IUPS,2849) (0.71*iposiz)
  150. endif
  151. iprec = 7
  152. endif
  153. endif
  154. c -Positionnement
  155. if(iplac.gt.1) then
  156. write(IUPS,977) xdec,ydec1,'rmoveto H1'
  157. xdec = 0.
  158. ydec1 = 0.
  159. c mise a 0 de idec si on écrit sur l'axe d'origine
  160. if(ydec.eq.0..and.iposch.gt.1) idec=0
  161. endif
  162. c -Ecriture de la chaine ( TITRE(1:iposch) ) SX
  163. iplac=iplac+1
  164. CHAINE(1:1)='('
  165. CHAINE(iposch+1:iposch+4)=') SX'
  166. CHAINE(iposch+5:len(CHAINE))=' '
  167. write (iups,955) CHAINE(1:iposch+4)
  168. 955 format (a)
  169. c -On recommence le remplissage de CHAINE avec les caracteres suivants
  170. iecrit=0
  171. iposch=1
  172. isymb =0
  173. endif
  174.  
  175. c --- Traitement des caracteres définissant un contexte particulier ---
  176.  
  177. c --- Traitement des caracteres définissant une police (Symbole) ---
  178. c -un \ fourni par l utilisateur indique qu il veut un symbole grec
  179. if((titre(i:i).eq.char(92)).and.(i+1.le.LTITRE)) then
  180. c il faut changer la font + imposer d'écrire le caractere i+1
  181. c write(6,*) 'on a trouvé un antislash \ '
  182. isymb =1
  183. iecrit=1
  184. if(ydec.eq.0) then
  185. write(IUPS,1850) iposiz
  186. iprec = -10
  187. else
  188. write(IUPS,2850) (0.71*iposiz)
  189. iprec = -7
  190. endif
  191. endif
  192.  
  193. c --- Traitement des caracteres définissant une position ---
  194. c -un _{ } fourni par l utilisateur indique qu'il veut un indice
  195. c if((titre(i:i+1).eq.'_{').and.(i+3.le.LTITRE)) then
  196. if((titre(i:i+1).eq.'_{')) then
  197. c write(6,*) 'on a trouvé un underscore _{'
  198. c on recupere la position courante car on en a peut etre besoin
  199. if(idec.eq.0) then
  200. write(IUPS,1111)
  201. idec=-1
  202. c pour se replacer en ce point
  203. elseif(idec.eq.1) then
  204. write(IUPS,1112)
  205. idec=0
  206. endif
  207. c on calcule le decalage vertical -2.5
  208. ydec1 = ydec1 - (2.5*real(iposiz))
  209. ydec = ydec + ydec1
  210. c write(6,*) 'on va decaler de ',ydec1,' -> y=',ydec
  211. i=i+1
  212. c -un ^{ } fourni par l utilisateur indique qu'il veut un exposant
  213. c elseif((titre(i:i+1).eq.'^{').and.(i+3.le.LTITRE)) then
  214. elseif((titre(i:i+1).eq.'^{')) then
  215. c write(6,*) 'on a trouvé un exposant ^{'
  216. c on recupere la position courante car on en a peut etre besoin
  217. if(idec.eq.0) then
  218. write(IUPS,1111)
  219. idec=1
  220. c pour se replacer en ce point
  221. elseif(idec.eq.-1) then
  222. write(IUPS,1112)
  223. idec=0
  224. endif
  225. c on calcule le decalage vertical +5
  226. ydec1 = ydec1 + (5.*real(iposiz))
  227. ydec = ydec + ydec1
  228. c write(6,*) 'on va decaler de ',ydec1,' -> y=',ydec
  229. i=i+1
  230. c -fin de la zone indice ou exposant
  231. elseif(titre(i:i).eq.'}') then
  232. c write(6,*) 'on a trouvé la fin de cette zone }'
  233. c il faut préparer le retour a l'alignement original (ydec=0)
  234. ydec1 = -1.*ydec
  235. ydec = ydec+ydec1
  236. c write(6,*) 'on va decaler de ',ydec1,' retour en y=0=',ydec
  237. endif
  238. c i peut etre incrémenté en plus pour sauter l'accolade {
  239.  
  240. 77777 continue
  241.  
  242. *=============================================================
  243. * FORMATS UTILES
  244. *=============================================================
  245.  
  246. *pour faire des "(chaine) center" (commande définie dans strini):
  247. 907 format (A,1X,'center')
  248. *pour faire des "(chaine) right" (commande définie dans strini):
  249. 908 format (A,1X,'right')
  250. *pour faire des "rmoveto H1" :
  251. 977 format (1X,F10.3,1X,F10.3,1X,A)
  252.  
  253. *pour revenir a la police initiale :
  254. 1846 format('/Courier-ISOLatin1 findfont ',I2,' scalefont setfont')
  255. 1847 format('/CourierBold-ISOLatin1 findfont ',I2,' scalefont setfont')
  256. 1848 format('/Helvetica-ISOLatin1 findfont ',I2,' scalefont setfont')
  257. 1849 format('/Times-ISOLatin1 findfont ',I2,' scalefont setfont')
  258. *police Symbol :
  259. c 1850 format('/Symbol-ISOLatin1 findfont ',I2,' scalefont setfont')
  260. 1850 format('/Symbol findfont ',I2,' scalefont setfont')
  261. *police exposant et indice (=0.75*taille de la font par ex.)
  262. 2846 format('/Courier-ISOLatin1 findfont ',F4.1,' scalefont setfont')
  263. 2847 format('/CourierBold-ISOLatin1 findfont ',F4.1,
  264. $ ' scalefont setfont')
  265. 2848 format('/Helvetica-ISOLatin1 findfont ',F4.1,' scalefont setfont')
  266. 2849 format('/Times-ISOLatin1 findfont ',F4.1,' scalefont setfont')
  267. *police Symbol exposant et indice :
  268. c 2850 format('/Symbol-ISOLatin1 findfont ',F4.1,' scalefont setfont')
  269. 2850 format('/Symbol findfont ',F4.1,' scalefont setfont')
  270.  
  271. *stockage du point courant dans le stack et repositionnement en ce point
  272. 1111 format('currentpoint')
  273. 1112 format('moveto')
  274.  
  275. *=============================================================
  276. * AVANT DE QUITTER, ON REMET TOUT PAR DEFAUT
  277. *=============================================================
  278. c on remet la police d origine
  279. if(iprec.ne.10) then
  280. if(ipopol.eq.1) write(IUPS,1846) iposiz
  281. if(ipopol.eq.2) write(IUPS,1847) iposiz
  282. if(ipopol.eq.3) write(IUPS,1848) iposiz
  283. if(ipopol.eq.4) write(IUPS,1849) iposiz
  284. endif
  285.  
  286. c rotation inverse : on revient dans le bon sens
  287. if(ANGLE.ne.0.d0)then
  288. write (IUPS,fmt='(F4.1,'' neg rotate '')') ANGLE
  289. endif
  290.  
  291. RETURN
  292.  
  293. END
  294.  
  295.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales