PS 为文本着色的简单方法

PS easy way to color text

我有一个后记文件,其中包含 njplot 输出的系统发育树。它基本上由行尾的行和标签组成。现在它是黑​​白的,但我想标记不同树之间的差异:

下面是我的一个文件的简短摘录,只有三个标签。

a) 我需要做什么来制作例如"B. ovis 25840"显示为红色?

b) 如何在 "B. suis 23445" 和 "B. Thomsen" 周围画一个框(比如标记他们在同一组?)

/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

使用当前颜色绘制文本(对于类型 3 以外的字体的文本)。因此,如果您在绘制文本之前更改当前颜色,那么它将以不同的颜色绘制。

PostScript 中有许多颜色运算符,最简单的是 setgray、setrgbcolor 和 setcmykcolor 运算符。 setgray 取一个介于 1(白色)和 0(黑色)之间的值,并将当前颜色设置为该灰色百分比。 setrgbcolor 为每个 R、G 和 B 取 3 个参数,介于 01 和 1 之间,setcmykcolor 做同样的事情,但使用 CMYK 组件。

所以回答问题 'a' 1 0 0 setrgbcolor 放置在带有文本的行之前,会导致文本被绘制成红色。

请注意,所有后续操作都会呈现为红色,因此我们现在应该考虑 gsave 和 grestore 运算符。 gsave 保存图形状态的副本,grestore(惊喜!)从最近保存的版本恢复图形状态。

您可以使用它来限制图形状态更改的影响。例如:

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

会将文本呈现为红色,但后续文本将采用 gsave 之前有效的颜色,大概是黑色。

注意页面上的当前点是gstate的一部分!所以:

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

会导致第二个 'show' 发生在与第一个相同的位置,覆盖它。

您没有 'draw a box',PostScript 没有这样的图形基元。你所做的是构建一条路径,然后对其进行描边(你可以填充它而不是填充矩形)。

例如:

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

将构建一个矩形路径,其左下角为 0,0,它将有 100 个单位的宽度和高度(因此是一个正方形)。 'stroke' 运算符然后使用当前线宽和当前颜色对路径进行描边。

如果您想更深入地了解 PostScript,那么您将需要一份 PostScript 语言参考手册,该手册以 PDF 格式在线提供,可从 Adob​​e 网站在线获取。

您可能还想看看 'Blue Book' 也可以作为 'PostScript language tutorial and cookbook'