2017-08-14 7 views
2

Ich habe eine Postscript-Datei, die einen phylogenetischen Baum enthält, der von njplot ausgegeben wird. Es besteht im Wesentlichen aus Zeilen und Labels am Ende der Zeile. Im Moment ist es in Schwarz und Weiß, aber ich möchte Unterschiede zwischen verschiedenen Bäumen markieren:PS einfache Möglichkeit, Text zu färben

Unten ist ein kurzer Auszug aus einer meiner Dateien mit nur drei der Etiketten.

a) Was muss ich tun, um z.B. "B. ovis 25840" wird rot angezeigt?

b) Wie kann ich einen Kasten um "B. suis 23445" und "B. Thomsen" machen (wie zu kennzeichnen, dass sie in der gleichen Gruppe sind?)

/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

Für b verfügbar ist, finden https://stackoverflow.com/questions/518837/ how-can-you-get-the-height-metric-of-a-string-in-postscript. – lhf

Antwort

3

Text gezogen wird (für Text in anderen Schriftarten als Typ 3) mit der aktuellen Farbe. Wenn Sie also vor dem Zeichnen des Textes die aktuelle Farbe ändern, wird sie in einer anderen Farbe gezeichnet.

Es gibt eine Reihe von Farboperatoren in PostScript, die einfachsten sind die Operatoren setgray, setrgbcolor und setcmykcolor. setgray nimmt einen Wert zwischen 1 (weiß) und 0 (schwarz) und setzt die aktuelle Farbe auf diesen Prozentsatz von Grau. setrgbcolor nimmt 3 Parameter zwischen 01 und 1 für jeden von R, G und B, und setcmykcolor tut dasselbe, aber mit CMYK-Komponenten.

So die Frage 'a' 1 0 0 setrgbcolor vor der Zeile mit dem Text darauf zu beantworten, würde dazu führen, dass der Text in rot gezeichnet wird.

Beachten Sie, dass alle nachfolgenden Operationen auch in rot gerendert werden sollten, so dass wir jetzt die gsave und grestore Operatoren berücksichtigen sollten. gsave speichert eine Kopie des Grafikstatus, und grestore (Überraschung!) stellt den Grafikzustand aus der zuletzt gespeicherten Version wieder her.

Sie können dies verwenden, um den Effekt einer Änderung des Grafikstatus zu begrenzen. Zum Beispiel:

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

würde den Text in rot machen, aber der nachfolgenden Text in der Farbe, die vor dem gsave wäre, vermutlich schwarz.

Beachten Sie, dass der aktuelle Punkt auf der Seite Teil des gstate ist! Also:

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

würde die zweite ‚Show‘ führt Platz an der gleichen Position wie die ersten zu nehmen, sie zu überschreiben.

Sie zeichnen keine Box, PostScript hat keine Grafikgrundelemente wie diese. Sie erstellen einen Pfad und streichen ihn dann (Sie könnten ihn stattdessen für ein ausgefülltes Rechteck ausfüllen).

Zum Beispiel:

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

wird bei 0,0 mit einem rechteckigen Pfad mit seiner unteren linken Ecke Konstrukt wird es 100 Einheiten breit und hoch (so ein Quadrats) sein. Der "Strich" -Operator streicht dann den Pfad unter Verwendung der aktuellen Linienbreite und der aktuellen Farbe.

Wenn Sie tiefer in PostScript eintauchen möchten, benötigen Sie eine Kopie des PostScript Language Reference Manuals, das online im PDF-Format von der Adobe-Website zur Verfügung steht.

Sie könnten auch an der dem ‚Blue Book‘ schauen, wie die dort auch als ‚Postscript-Tutorial und Kochbuch‘

+0

Ist 'rectstroke' kein Grundelement zum Zeichnen von Boxen? – lhf

+0

Ja, und rectfill, aber ich habe versucht, allgemein zu sein. – KenS

+0

Vielen Dank für die ausführliche Antwort. Perfekt für meinen Zweck – FlyingTeller

Verwandte Themen