2017-08-14 5 views
2

J'ai un fichier postscript qui contient un arbre phylogénétique produit par njplot. Il se compose essentiellement de lignes et d'étiquettes à la fin de la ligne. En ce moment, il est en noir et blanc, mais je voudrais marquer les différences entre les différents arbres:PS moyen facile de colorier le texte

Ci-dessous un court extrait d'un de mes fichiers avec seulement trois des étiquettes.

a) Que dois-je faire pour faire, par ex. "B. ovis 25840" s'affiche en rouge?

b) Comment puis-je faire une boîte autour « B. suis 23445 » et « B. Thomsen » (par exemple pour marquer qu'ils sont dans le même groupe?)

/setpacking where {true setpacking} if 
1 setlinecap 1 setlinejoin 1 setlinewidth 0 setgray 
/basefont /Times-Roman findfont 12 scalefont def 
/titlefont /Times-Roman findfont 12 scalefont def 
/setclip {40 40 moveto 560 40 lineto 560 810 lineto 40 810 lineto closepath clip newpath} def 
/title {titlefont setfont 
40 815 moveto (brucella_conc_se_ani.out_nj.outtree Mon Aug 14 14:52:28 2017 
) show ( Page) show show (of 1) show 
} def 
%%EndProlog 
%%Page: ? 1 
(1) title setclip 
0 0 translate 
basefont setfont 
50 50 translate 
0.7 setgray -10 -10 moveto 510 -10 lineto 510 760 lineto -10 760 lineto closepath stroke 0 setgray 
359 8 moveto 
(B. ovis 25840) show 
298 67 moveto 
(B. Thomsen) show 
294 127 moveto 
(B. suis 23445) show 
showpage 
+0

B, voir https://stackoverflow.com/questions/518837/ comment-pouvez-vous-obtenir-la-hauteur-métrique-d'un string-dans-postscript. – lhf

Répondre

3

texte est tiré (pour le texte dans les polices autres que le type 3) en utilisant la couleur actuelle. Donc, si vous modifiez la couleur actuelle avant de dessiner le texte, alors il sera dessiné dans une couleur différente.

Il existe un certain nombre d'opérateurs de couleur dans PostScript, les plus simples sont les opérateurs setgray, setrgbcolor et setcmykcolor. setgray prend une valeur entre 1 (blanc) et 0 (noir) et définit la couleur actuelle à ce pourcentage de gris. setrgbcolor prend 3 paramètres entre 01 et 1 pour chacun de R, G et B, et setcmykcolor fait de même mais avec des composants CMYK. Donc, pour répondre à la question 'a' 1 0 0 setrgbcolor placé avant la ligne avec le texte, le texte serait dessiné en rouge.

Notez que toutes les opérations suivantes et seront rendues en rouge, donc nous devrions considérer maintenant les opérateurs gsave et grestore. gsave enregistre une copie de l'état graphique, et grestore (surprise!) restaure l'état graphique de la dernière version enregistrée.

Vous pouvez utiliser ceci pour limiter l'effet d'un changement d'état graphique. Par exemple:

gsave 
1 0 0 setrgbcolor 
(B. ovis 25840) show 
grestore 

viderait le texte en rouge, mais le texte suivant serait la couleur en vigueur avant la gsave, vraisemblablement noir.

Notez que le point actuel sur la page fait partie du gstate! Alors:

gsave 
1 0 0 setrgbcolor 
359 8 moveto 
(B. ovis 25840) show 
298 67 moveto 
grestore 
(B. Thomsen) show 

causerait la deuxième « spectacle » aura lieu à la même position que le premier, le remplacer. Vous ne dessinez pas de boîte, PostScript n'a pas de primitives graphiques de ce type. Ce que vous faites est de construire un chemin, puis le caresser (vous pouvez le remplir à la place pour un rectangle rempli).

Par exemple:

0 0 moveto 
0 100 lineto 
100 100 lineto 
100 0 liento 
closepath 
stroke 

va construire une trajectoire rectangulaire avec son coin inférieur gauche à 0,0, il sera largeur et la hauteur de 100 unités (donc un carré). L'opérateur 'stroke' efface alors le chemin en utilisant la largeur de ligne courante et la couleur courante.

Si vous voulez approfondir PostScript, vous aurez besoin d'une copie du Manuel de référence du langage PostScript, qui est disponible en ligne au format PDF sur le site Web d'Adobe.

Vous aimerez aussi regarder le le « Blue Book », qui est également disponible là-bas comme le « tutoriel langage PostScript et livre de cuisine »

+0

Rectstroke n'est-il pas une primitive pour dessiner des boîtes? – lhf

+0

Oui, et le rectfill, mais j'essayais d'être général. – KenS

+0

Merci pour la réponse détaillée. Parfait pour mon but – FlyingTeller