Ir al Hogar Ver Índice Buscar Enlaces Acerca de nosotros
[LinuxFocus Image]
[Navegation Bar]
  Noticias   Archivos   Compa��as   Consejos 

El Lenguaje PostScript

por Emre Demiralp


Gu�rdate las burlas, llegar� el d�a en que las uses.
-Proverbio turco-.

Introducci�n

Dibujos

Texto

Colores

M�s informaci�n

Introducci�n

�ste es el primero de una serie de art�culos sobre PostScript. La idea principal no es ense�ar todos y cada uno de los detalles de este software, sino dar suficiente material para las personas que encuentran en el PostScript un lenguaje de programaci�n para la preparaci�n de documentos interesante y divertido. A pesar de que no pretendemos escribir un documento t�cnico ni un libro de texto ni una biblia sobre este tema, intentaremos presentar la informaci�n necesaria y suficiente sobre PostScript.

Las ideas principales sobre las que est� hecho el PostScript fueron creadas hace veinte a�os por John Gaffney en la Evans & Sutherland Computer Corporation. Al principio se llamaba "Design System" pero m�s tarde fue desarrollado bajo el nombre de PostScript por Adobe Systems Incorporated como una herramienta independiente de la plataforma y del dispositivo para la descripci�n de p�ginas. Adobe Systems Incorporated fue formado por Chuck Geschke and John Warnock en 1982. C. Geschke y J. Warnock emprendieron un nuevo dise�o e implementaci�n del lenguaje, al que Doug Brotz, Billi Paxton, y Ed Taft hicieron grandes contribuciones. Actualmente es una de las herramientas de preparaci�n de documentos m�s importantes, aunque no es utilizada directamente por la mayor�a de usuarios. Sus capacidades est�n completamente a alto nivel, sin embargo muchos usuarios que no quieren entrar en los detalles de este potente lenguaje prefieren usar las otras herramientas de usuario final, que est�n basadas principalmente en la filosof�a "What You See Is What You Get". Para decir la verdad, muchas herramientas WYSIWYG usan formatos de fichero PostScript para mantener la documentaci�n de los productos o para usarlos como interface con otros trabajos como la impresi�n. Por ello, podemos decir que a�n sobrevive como un viejo amigo que sirve como una potente asistencia para muchos trabajos del ordenador relativos a dibujar, colorear, procesar im�genes, separaci�n de colores, simulaci�n y animaci�n incluso si no se nos muestra expl�citamente durante el proceso. Por otro lado, si quieres aprender su estructura para programarlo, encontrar�s que no es muy dif�cil.

Los comandos de PostScript se ejecutan a trav�s de alg�n int�rprete. Entre los que existen, un software muy conocido est� disponible gratuitamente en el dominio p�blico de Internet. Se llama "ghostscript" por Aladdin Enterprise. Existe tambi�n un �til interfase gr�fico, "ghostview", distribuido por la misma organizaci�n. El proyecto GNU tiene tambi�n sus propias versiones de ghostscript. Estas est�n disponibles en todas las plataformas Linux y todas las distribuciones principales las contienen en su instalaci�n est�ndar. Aqu� usaremos ghostscript y ciertas de sus estructuras y propiedades espec�ficas, aunque los programas de ejemplo se pueden ejecutar a trav�s de otros int�rpretes. Asumimos que tenemos activado el servidor de X Window y abierta una ventana xterm. Si queremos usar ghostscript entonces cada comando y grupo de comandos se dar� en el prompt de comandos que aparece despu�s de lanzar el comando

Initializing... done. Ghostscript 2.6.2 (4/19/95) Copyright (C) 1990-1995 Aladdin Enterprises, Menlo Park, CA. All rights reserved. Ghostscript comes with NO WARRANTY: see the file COPYING for details.
GS>_


Una ventana blanca propia se abrir� al mismo tiempo que aparece este prompt. Si queremos cerrar la sesi�n ghostscript, lo �nico que tenemos que hacer es ejecutar el comando quit en el prompt GS>. Tambi�n podemos salir con EOF (Ctrl-D).

Ghostscipt tambi�n puede ejecutar los comandos obteni�ndolos de un fichero. En este caso abrimos un fichero llamado, por ejemplo, sample.ps . Todos los comandos que queremos que ghostscript ejecute est�n escritos en este fichero. Entonces podemos llamar al contenido de este fichero un programa PostScript. El contenido completo de este programa o sus comandos individuales ser� consecutivamente ejecutado por ghostscript si ejecutamos el siguiente comando en el prompt de la shell de la ventana de xterm de linux

gs sample.ps

y el display (si el programa pide la creaci�n de un display, claro. De hecho, PostScript se puede usar para otras cosas, como c�lculos matem�ticos, operaciones de pilas, etc. Las mencionaremos en futuros art�culos de esta serie) aparecer� en la ventana de ghostscript. Si el programa produce m�s de una p�gina entonces la ventana de ghostscript muestra la primera y el prompt showpage aparece en la l�nea de comandos de ghostscript solicitando enter key pressing para ver la siguiente p�gina.

PostScript usa Reverse Polish Notation (RPN - como las calculadoras de bolsillo de HP). En otras palabras, los par�metros de un comando se dan antes que el comando. Los comandos se separan con espacios en blanco. Usa operaciones de pila para procesar datos y ejecutar comandos. Hay cuatro pilas disponibles en PostScript: la pila de operandos, la de diccionario, la de ejecuci�n y la de estado gr�fico. La pila de operandos contiene objetos PostScript arbitrarios que son los operandos y resultados de los operadores PostScript que se est�n ejecutando. Podemos dar algunos ejemplos de operaciones aritm�ticas. Por ejemplo,

20 30 add 10 sub 

produce 40, ya que 20 30 add crea 50 y sub produce 40 al usar 50 junto con 10. mul (multiplicaci�n) y div (divisi�n) funcionan de la misma manera. El nombre '=' esta asociado con un procedimiento que saca un objeto de la pila de operadores y escribe una representaci�n textual de su valor al fichero est�ndar de salida, seguido de una nueva l�nea. == tiene un efecto similar, pero escribe una representaci�n sint�ctica de su operando el fichero est�ndar de salida. El comando pop extrae el elemento superior de la pila de operandos y lo elimina. Hablaremos de las pilas m�s detalladamente en posteriores art�culos de esta serie.

¿C�mo se usa PostScript para dibujar figuras?

Podemos empezar dibujando figuras con PostScript considerando la estructura geom�trica de la p�gina que ser� dise�ada. Las posiciones de los puntos de una p�gina se denotan mediante pixels, que son 1/72 de pulgada en el lenguaje PostScript. La esquina inferior derecha de la p�gina es el punto con coordenadas (0,0) y el tama�o horizontal y vertical de la p�gina son de 612 y 792 respectivamente. Estos tama�os son para la hoja tipo letter. Hay otras posibilidades de tama�os para otros tipos de papel, como

note con 540 y 720 o
legal con 612 y 1008 o
a4 con 595 y 842 .

Estos son comandos normales de gs. El comando 'a4' modificar� el tama�o de tu hoja de dibujo al tama�o adecuado.

La definici�n del tama�o del papel se puede encontrar en el fichero de inicializaci�n cuyo nombre es gs_statd.ps. Se puede encontrar en /usr/lib/ghostscript para Slackware. Puedes definir cualquier tama�o de papel no est�ndar haciendo los a�adidos y modificaciones convenientes en este fichero como mencionaremos m�s adelante en esta serie de art�culos. Aqu� asumimos que usamos el tama�o de papel por defecto letter en esta presentaci�n.

El segundo paso despu�s de poner el papel al tama�o deseado al dibujar una figura es situar el cursor el principio del dibujo. Esto se puede conseguir con el comando

x y moveto

donde x e y denotan respectivamente las coordenadas horizontal y vertical del punto donde se situar� el cursor. x e y son n�meros puros y considerados en unidades de p�xel. Como puedes ver, la estructura funcional de PostScript es ligeramente diferente de otros lenguajes de programaci�n como C, Fortran. moveto es el comando que realiza la acci�n, en otras palabras, es el que mueve el cursor al sitio cuyas coordenadas vienen dadas por x e y. Como PostScript usa una pila, primero se meten los par�metros consecutivamente en la pila. Entonces se da el comando. Cuando entra en la pila, acepta los dos objetos anteriores como sus par�metros. La sintaxis es diferente para el usuario que est� familiarizado con otros lenguajes como C, Fortran. Por eso hemos insistido en este tema aqu�. Como conclusi�n diremos que todo comando que necesite par�metros se dar� despu�s de sus par�metros.

Ahora estamos preparados para empezar a dibujar la figura. Empecemos con una figura sencilla, un segmento recto. Para dibujarlo, lo �nico que tenemos que hacer es ejecutar el comando

xx yy lineto

donde xx e yy denotan la situaci�n del punto final del segmento. Su punto inicial es la posici�n actual del cursor, x e y . As� pues, este comando construye un segmento recto entre x y y xx yy . El dibujo necesita los comandos de definici�n de camino newpath y stroke. Escribamos un programa PostScript para dibujar un rect�ngulo. Se puede hacer usando la informaci�n anterior. El programa que suponemos que se grabar� en el fichero sample1.ps puede ser as�

newpath
100 100 moveto
300 100 lineto
300 250 lineto
100 250 lineto
100 100 lineto
stroke

A pesar de que hemos dado cada comando en una l�nea separada, esto no es realmente necesario. Los podr�amos dar todos en la misma l�nea insertando un espacio en blanco entre comandos consecutivos, como ya dijimos antes.

PostScript permite la introducci�n de comentarios, como otros lenguajes de programaci�n. Todo lo que sigue a un signo de porcentaje hasta el final de la l�nea se interpreta como un comentario.

newpath
% Inicializaci�n del cursor
100 100 moveto
% Dibujo del rect�ngulo
300 100 lineto
300 250 lineto
100 250 lineto
100 100 lineto
stroke

Si ejecutamos el comando gs sample1.ps en el prompt de una ventana de xterm, entonces aparece la conocida ventana de ghostscript conteniendo el dibujo del rect�ngulo. No necesitamos invocar el int�rprete cada vez. De hecho, el comando
(sample1.ps) run
hace lo mismo desde el prompt GS>.

El comando stroke le dice al int�rprete que dibuje la figura. En el programa anterior la ventana de ghostscript muestra el rect�ngulo con lados de 200 y 150 puntos en las direcciones horizontal y vertical.

Las l�neas rectas no necesitan ser verticales o horizontales. Se pueden construir en cualquier direcci�n.

Como podr�s ver cuando mostremos el resultado mediante ghostscript, este programa crea un tri�ngulo. Puedes crear cualquier clase de figura que est� compuesta de segmentos usando los comandos moveto y lineto.

Hay dos comandos m�s que se pueden usar en las construcciones anteriores. Son los comandos rmoveto y rlineto . Necesitan dos par�metros y se usan as�

x y rmoveto
x y rlineto

donde x e y son las distancias horizontal y vertical entre el punto inicial y final de cada acci�n. 'r' en rmove y rlineto significa 'relativo'. En otras palabras, el primer comando mueve el cursor x unidades horizontalmente a la derecha e y unidades hacia arriba desde su posici�n actual. El segundo comando act�a de manera similar, pero dibuja una l�nea y mueve el cursor al punto final en lugar de solo mover el cursor. Estos son comandos de referencia y los par�metros se dan tomando la posici�n inicial como el punto de referencia.

Todos los ejemplos anteriores usan una anchura de l�nea por defecto para dibujar. Este valor es de 1 p�xel. Sin embargo, el usuario puede definir el ancho de l�nea del dibujo en cualquier punto del programa. Esto se puede hacer con el comando

x setlinewidth

donde x denota el anchura de la l�nea en p�xels. El efecto de este comando contin�a hasta que se modifique de nuevo la anchura de la l�nea en el programa. No hay limitaci�n para el n�mero de anchos de l�nea en un programa.

Naturalmente, dibujar en PostScript no est� limitado a l�neas rectas. Se pueden dibujar tambi�n arcos circulares. Para ello podemos usar el siguiente comando

x y r a b arc

donde x, y, r, a y b son las coordenadas horizontal y vertical del centro del arco circular, el radio del arco y el �ngulo entre la parte positiva del eje horizontal y los rayos centrales que pasan a trav�s del punto inicial y final del arco. Los �ngulos se miden en sentido contrario a las agujas del reloj. Si el punto inicial del arco no es la posici�n actual del cursor, entonces se dibuja tambi�n una l�nea recta entre la posici�n actual del cursor y el inicio del arco. Para entender todo esto, puedes echarle un vistazo el siguiente programa PostScript.


3 setlinewidth
200 200 moveto
100 200 100 0 75 arc
stroke
300 300 moveto
400 500 200 20 50 arc
stroke

As� pues, debemos tener cuidado y poner el cursor al principio del arco si no queremos la l�nea extra mencionada m�s arriba. Sin embargo, hay otra manera de solucionar el problema. De hecho, al punto actual se le puede dar un valor vac�o. En otras palabras, al principio del camino no hay ning�n valor para los par�metros. No hay ninguna asignaci�n para la posici�n del cursor. Una vez se inicia el dibujo, el punto final del camino se convierte en el punto actual. Si ejecutamos el comando newpath entonces PostScript borra la asignaci�n para el punto del cursor y act�a como si el dibujo comenzara desde el principio. As� pues, el programa anterior se puede modificar sustituyendo la quinta l�nea con una l�nea que contenga solo el comando newpath. Si lo hacemos y lo ejecutamos veremos que obtenemos el mismo dibujo, excepto la l�nea recta extra.

Un camino se inicia ejecutando el operador newpath. Esto inicializa el camino actual al camino vac�a. El camino se construye entonces ejecutando comandos que a�adan segmentos al camino actual.

El comando arc se puede usar para dibujar un c�rculo completo. Es suficiente dar como �ngulo inicial y final 0 y 360 respectivamente. Si se hace bajo un newpath se obtiene un c�rculo completo. El comando arc tambi�n se puede usar para producir elipses. Usaremos para ello las propiedades de escalado de PostScript. El usuario puede reescalar las unidades horizontales y verticales de manera separada mediante el siguiente comando

x y scale

donde x e y denotan respectivamente los factores de escalado horizontal y vertical. Esto significa que cuando estos factores son igual a 1 no afecta en nada al dibujo. El efecto de escalado se mantiene hasta que se ejecuta el siguiente comando de escalado. El siguiente comando de escalado que se ejecuta no anula el efecto del anterior, sino que combina su propio efecto con el anterior. Supongamos que los par�metros del comando de escalado anterior fueron x1, y1 y los par�metros del siguiente comando son x2, y2 , entonces el efecto combinado de ambos tiene los factores de escalado x1*x2, y1*y2 . Este efecto se debe tener presente para evitar efectos indeseados en el display, como que algunos caminos se salgan de la superficie del papel. PostScript asume la no existencia de escalado por defecto. El siguiente programa PostScript, que suponemos que est� grabado en el fichero sample4.ps , es un ejemplo para explicar el escalado.

3 setlinewidth
200 200 100 0 360 arc
stroke
newpath
2 1 scale
200 300 50 0 360 arc
stroke
newpath
1 4 scale
100 150 40 0 360 arc
stroke

Como se puede ver, la escala afecta a todos los tama�os, incluyendo el ancho de l�nea. El ancho de l�nea de las elipses y el c�rculo creado por el programa anterior son diferentes debido a esta raz�n.

PostScript tiene dos comandos m�s para dibujar arcos. Uno de ellos, arcn , es casi lo mismo que arc excepto en la direcci�n de dibujo. arcn dibuja el arco en el sentido de las agujas del reloj. El tercer comando de dibujo de arcos dibuja un arco circular que es tangente a dos l�neas dadas en sus puntos finales. Se puede ejecutar as�

x1 y1 x2 y2 r arcto xt1 yt1 xt2 yt2

donde xt1, yt1, xt2, yt2 denotan los coordenadas horizontales y verticales del arco, mientras que los puntos finales de las l�neas tangentes tienen los valores x0, y0, x1, y1 y x1, y1, x2, y2 respectivamente y r es el radio del arco. Si el camino no es nuevo o el punto actual no coincide con el inicio del arco entonces se a�ade al camino una l�nea que une el punto actual con el inicio del arco. Al final del dibujo el punto actual es xt2, yt2 .

PostScript tiene tambi�n un comando basado en el algoritmo de Bezier que se puede usar de manera efectiva en la interpolaci�n o extrapolaci�n de unos datos dados para dibujar. Esto comando se llama curveto y se puede usar para formar el dibujo basado en la interpolaci�n o extrapolaci�n de un conjunto de datos dado. El comando se usa as�

x1 y1 x2 y2 x3 y3 curveto

donde la curva empieza en el punto actual, cuyas coordenadas son x0, y0 . Es tangente a la l�nea entre los puntos x0, y0 y x1, y1 en el punto inicial. La curva acaba en el punto x3, y3 y es tangente a la l�nea entre x2, y2 y x3, y3 . Por defecto estos cuatro puntos se supone que son diferentes y determinan la forma de la figura.

Herramientas de escritura en PostScript

PostScript tiene varias fuentes que se usan como fuentes est�ndares para autoedici�n. Tiene tambi�n herramientas de creaci�n de fuentes a las que se puede acceder definiendo pilas de diccionario donde las fuentes est�n disponibles. El siguiente programa en PostScript puede ser un ejemplo.

/Times-Roman findfont
15 scalefont
setfont
100 500 moveto
(I love PostScript!) show
/Times-Italic findfont
20 scalefont
setfont
100 450 moveto
(I love PostScript!) show
/Times-Bold findfont
25 scalefont
setfont
100 400 moveto
(I love PostScript!) show
/Helvetica findfont
30 scalefont
setfont
100 350 moveto
(I love PostScript!) show
/Courier findfont
35 scalefont
setfont
100 300 moveto
(I love PostScript!) show
/Helvetica-Bold findfont
40 scalefont
setfont
100 250 moveto
(I love PostScript!) show
showpage

Como se puede deducir del programa, el comando findfont se usa para obtener un acceso a la estructura de la fuente deseada. El nombre de la fuente comienza por / y se le da al comando como un par�metro (donde / le dice al int�rprete que meta este valor en la pila tal como est�. Cuando entremos m�s tarde en detalle en las operaciones de pila este punto quedar� m�s claro). Despu�s de la selecci�n del comando, la escala se define mediante el comando scalefont . El factor de escala se da como un n�mero precediendo al comando. Despu�s del escalado de la fuente, el comando setfont deja la fuente disponible para usarla en el programa. Despu�s de situar el cursor con el comando moveto con los par�metros adecuados, el texto entre par�ntesis se pasa como par�metro al comando show . El comando showpage finaliza el display del material escrito. El programa anterior utiliza diferentes tipos y tama�os de fuentes con el mismo texto en diferentes posiciones. El n�mero de fuentes disponibles para PostScript se puede encontrar buscando las situaciones de las fuentes en la estructura de directorios del sistema linux que utilices. El texto se puede ajustar con l�neas, curvas y otras herramientas. As� pues cualquier tipo de escritura, en principio, es posible. Es solo una cuesti�n de dise�o.

C�mo pintamos y usamos los colores en PostScript

El lenguaje PostScript est� equipado con muchas facilidades para pintar figuras o crear dibujos con colores. Empezaremos primero mencionando los comandos de color. PostScript usa el negro como color por defecto, a no ser que se ejecute un comando de especificaci�n de color. Por ello la salida de todos los programas anteriores eran dibujos en blanco y negro. Para usar colores en la salida de PostScript podemos usar tres comandos de coloreado diferentes. El primero se basa en el formato de color rgb . En este formato, cada color se supone compuesto de tres colores principales: rojo, verde y azul. A las componentes del color se les pueden dar par�metros de intensidad individuales, que pueden tomar valores entre 0 y 256. Los par�metros de intensidad pueden aceptar valores decimales de hasta tres d�gitos de precisi�n, como 111.223. El comando esperado por PostScript debe ser dado de la siguiente manera.

x y z setrgbcolor

donde x,y,z son los par�metros de intensidad para las componentes rojo, verde y azul y setrgbcolor es el comando. En esta convenci�n, 1 0 0 setrgbcolor crea el color rojo, mientras que 0 1 0 setrgbcolorcrea el verde. El negro corresponde al caso donde todos los par�metros de intensidad valen 1. Los comandos de color contin�an afectando a todos los dibujos hasta que se ejecute el siguiente comando de color. Cuando esto pasa, el efecto del comando anterior se anula totalmente, y el nuevo valor vale para todo. El n�mero de veces que se puede utilizar es ilimitado. Usando adecuadamente los valores del color puedes crear tus dibujos como quieras. Es una cuesti�n de arte y depende de ti.

La segunda utilidad de control del color se basa en un formato de cuatro componentes del color. Se llama el formato de color cmyk . Las cuatro componentes b�sicas del color son cyan, magenta, amarillo y negro respectivamente. Cada componente de color contribuye al color final seg�n una intensidad que puede variar entre 0 y 1. El comando de PostScript correspondiente es

w x y z setcmykcolor

donde w, x, y, z son los par�metros de intensidad para las componentes de color cyan, magenta, amarillo y negro, respectivamente. Los valores fraccionarios decimales se pueden usar tambi�n para los valores de intensidad. Este comando contin�a su efecto sobre todo hasta que el siguiente comando se ejecuta. Cuando esto ocurre, los nuevos valores dominan sobre los anteriores. No hay limitaci�n sobre el n�mero de veces que se puede usar en un programa.

El tercer comando es el siguiente

x y z sethsbcolor

donde x, y, z son los valores de los par�metros de intensidad de tres diferentes propiedades del color. El primero corresponde a color (hue), que determina la localizaci�n del color en el espectro de la luz. El segundo, saturaci�n y el tercero brillo corresponden a la saturaci�n y brillo del color. Este formato se prefiere cuando las propiedades a controlar son la localizaci�n del color en el espectro mediante un bucle, o el brillo y/o la saturaci�n. El lector que no est� familiarizado con hsbcolor puede comprobar el uso de xfig bajo linux.

El comando m�s importante de PostScript para pintar es fill y closepath . El siguiente programa de ejemplo, que se supone grabado en el fichero sample6.ps , clarifica importantes aspectos al pintar y colorear con PostScript.

1 1 0 0 setcmykcolor
100 100 moveto
300 100 lineto
300 250 lineto
100 250 lineto
100 100 lineto
stroke
1 0.5 0.8 0 setcmykcolor
5 setlinewidth
200 200 moveto
400 300 lineto
300 300 lineto
closepath fill
stroke
1 0 0 setrgbcolor
3 setlinewidth
200 200 moveto
100 200 100 0 75 arc
stroke
newpath
400 500 200 20 50 arc
stroke
0 0 1 0.2 setcmykcolor
3 setlinewidth
200 200 100 0 360 arc
stroke
1 0 0 setrgbcolor
newpath
2 1 scale
200 300 50 0 360 arc
gsave fill grestore stroke
stroke
0 1 0 setrgbcolor
newpath
1 4 scale
100 150 40 0 360 arc
gsave fill grestore stroke

donde el comando closepath cierra un camino abierto uniendo dos puntos finales con una l�nea recta, mientras que fill sirve para llenar el interior del camino cerrado con el color actual.

PostScript puede tambi�n crear tonos de gris. Esto se puede hacer con el siguiente comando

x setgray

donde x es la intensidad del color gris y su valor puede variar desde 0, que corresponde a negro, hasta 1, que corresponde a blanco. El siguiente programa grabado bajo el nombre de sample7.ps est� hecho de manera que se explique a s� mismo.

0.2 setgray
10 setlinewidth
100 700 moveto
200 0 rlineto
stroke
newpath
0.3 setgray
100 600 moveto
200 0 rlineto
stroke
newpath
0.4 setgray
100 500 moveto
200 0 rlineto
stroke
newpath
0.5 setgray
100 400 moveto
200 0 rlineto
stroke
newpath
0.6 setgray
100 300 moveto
200 0 rlineto
stroke
newpath
0.7 setgray
100 200 moveto
200 0 rlineto
stroke
newpath
0.8 setgray
100 100 moveto
200 0 rlineto
stroke

Antes de finalizar esta presentaci�n, podemos recomendar escribir programas m�s complicados para los usuarios que encuentran en PostScript una interesante herramienta. En los siguientes art�culos de esta serie daremos m�s detalles sobre el lenguaje PostScript. Todas las preguntas y recomendaciones ser�n bienvenidas.

El autor agradece a Oliver Thilmann por sus �tiles comentarios sobre la organizaci�n y presentaci�n de este art�culo.


Traducido por Hugo Lastras Membrive y C�sar Ordi�ana

M�s informaci�n:
  • Consulta los libros de Adobe Systems Inc. publicados por Addison-Wesley: PostScript Language
    (Tres volumenes: Tutorial and Cookbook, Language Reference, Program Design)


© 1998 Emre Demiralp
P�ginas Web mantenidas por Miguel A Sep�lveda.