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.
|