%!
%# ventaQVdat_011.ps v 0.0.11 llegeix els fitxers de dades .DAT generats pel QuickVision
%# amb qualsevol nombre de contorns (path), per redibuixar-ne el resultat, inscrit en format A4
%# en unes condicions determinades i en base a una mesura mestre (fMd) que determinem cada vegada
%# en funció de les variables YBbox i Umodul. També pot explorar el % de cobertura del caràcter,
%# en funció de la seva caixa (Mòdul Tipogràfic), generant-ne una imatge de comprovació.
%# Escriu a disc el caràcter explorat, en un pseudoformat tipogràfic (.B42), que ens servirà
%# per compondre dinàmicament una línia de la Bíblia de 42 línies amb l'eina ginyB42.ps
%# Copyright (c) 2006-2011
%# Concepte: Luz Ma. Rangel Alanís <quadrati@luzrangel.com>
%# Codi: Marc Antoni Malagarriga i Picas <marcantoni.malagarriga.picas@ub.edu>
%# Projecte de Programari Lliure: http://sourceforge.net/projects/gutenberginy/
%# Repositori http://gutenberginy.svn.sourceforge.net/viewvc/gutenberginy/
%# Aquest programa és programari lliure: podeu redistribuir-lo i/o modificar-lo
%# sota els termes de la Llicència Pública General de GNU publicada per la Free
%# Software Foundation, ja sigui la versió 3 de la Llicència, o (a la seva elecció)
%# qualsevol versió posterior.
%#
%# Aquest programa es distribueix amb l'esperança que sigui útil, però SENSE CAP GARANTIA;
%# ni tan sols la garantia implícita MERCANTIL o d'APTITUD PER A UN OBJECTIU PARTICULAR.
%# Consulteu els detalls de la Llicència Pública General de GNU per a més informació.
%#
%# Haurieu de rebre una còpia de la Llicència Pública General de GNU junt amb aquest
%# programa. En cas contrari, consulteu <http://www.gnu.org/licenses/>
%# Multiplataforma: Linux | Unix | Windows | MacOSX
%# Per a intèrprets PS: Ghostscript 8/9 AdobeAcrobatDistiller 4 i +
%# execució amb GS per línia de comandes:
%# gs -q -dNOSAFER -o luz.pdf -sDEVICE=pdfwrite -c .setpdfwrite -f ventaQVdat_011.ps
%# %%%% O P C I O N S D E M E N U %%%%%%%%%%%%%%%%%%%%%%%%
%# 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%# DEDUÏM AUTOMÀTICAMENT EL FACTOR MULTIPLICADOR D'ESCALA fMd?
%# true = actua A i B
%# false = actua 2
false
%# 2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%# ENTREM MANUALMENT EL FACTOR MULTIPLICADOR D'ESCALA fMd
%# segons taula: fMd_final3.pdf
%% 4 glifs problemàtics d'orígen del caràcter següent (segons taula fMd_final.pdf)
%%0.145450 % letra_minuscula_sdescendente : 1-27-33-sdescen.DAT
%%0.136658 % minusculaligada_ff : 16-1-19-14-ff.DAT
%%0.142244 % letra_minuscula_slarga : 6-1-33-28-slarga.DAT
0.142244 %% minusculaligada_sslarga : 1-23-13-sslarga.DAT
%% 4 glifs problemàtics per l'amplada (segons taula fMd_final3.pdf)
%%0.133452 % letramayusculaM : 6-2-33-9-M.DAT
%%0.149429 % abreviaturappfloritura : 9-2-7-22-ppfloritura.DAT
%%0.136658 % letramayusculaU : 32-1-42-9-U.DAT
%%0.139856 % minusculaligada_va : 19-2-37-26-va.DAT
%%0.142244 % letraminusculaf : 2-15-25-f.dat
%% problema de centrat
%%0.1465 % 1-15-10-S.DAT
%# %%%%%%%%%%% VALORS DEL CARÀCTER MESTRE %%%%%%%%%%%%
%# A %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%# ADREÇA (path) I NOM DEL .DAT DEL QUICKVISION MESTRE
%%(DAT270106/A.DAT)
%%(C:/MaRCanToni/eraal'escriptori6/LuzRangel/b.DAT)
%%(Macintosh_HD:eraalescriptori:HagaseLaLuz:LuzRangel_Win:1-4-6-a.dat)
%%(1-4-6-a.dat)
%% 4 glifs problemàtics per l'amplada ...
%%(/eraalescriptori/HagaseLaLuz/DATs/problematics/6-2-33-9-M.DAT)
%%(/eraalescriptori/HagaseLaLuz/DATs/problematics/9-2-7-22-ppfloritura.DAT)
%%(/eraalescriptori/HagaseLaLuz/DATs/problematics/32-1-42-9-U.DAT)
%%(/eraalescriptori/HagaseLaLuz/DATs/problematics/19-2-37-26-va.DAT)
%% 4 glifs problemàtics d'orígen del caràcter següent
%%(/eraalescriptori/HagaseLaLuz/postATypI_doctoratFinal/1-27-33-sdescen.DAT)
%%(/eraalescriptori/HagaseLaLuz/postATypI_doctoratFinal/16-1-19-14-ff.DAT)
%%(/eraalescriptori/HagaseLaLuz/postATypI_doctoratFinal/6-1-33-28-slarga.DAT)
(/eraalescriptori/HagaseLaLuz/postATypI_doctoratFinal/1-23-13-sslarga.DAT)
%%(2-15-25-f.dat)
%% problemes de centrat
%%(1-15-10-S.DAT) % 1-15-10-S.DAT.B42
%# B %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%# NOMBRE D'UNITATS MATRIU PER ESTABLIR fMd
%# (un SubMòdul el formen 5 unitats matriu)
%% varia segons el signe?
25
%# %%%%%%%%%%% VALORS DEL CARÀCTER PER ANALITZAR %%%%%%%%%%%%
%# C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%# ADREÇA (path) I NOM DEL .DAT DEL QUICKVISION PER ANALITZAR
%% Win ...
%%(C:/Documents and Settings/L'amo/Escritorio/LuzRangel/delQuickVision/a.txt)
%% OSX pstopdf des del terminal Unix (l'adreça és relativa d'on executem pstopdf) ...
%%(LuzRangel_Win/delQuickVision/z.txt)
%%(trobada1205/fem_fum_pruebas/A.DAT)
%%(DAT270106/A.DAT)
%%(C:/MaRCanToni/eraal'escriptori6/LuzRangel/b.DAT)
%%(Macintosh_HD:eraalescriptori:HagaseLaLuz:LuzRangel_Win:1-4-6-a.dat)
%%(1-4-6-a.dat)
%% 4 glifs problemàtics per l'amplada ...
%%(/eraalescriptori/HagaseLaLuz/DATs/problematics/6-2-33-9-M.DAT)
%%(/eraalescriptori/HagaseLaLuz/DATs/problematics/9-2-7-22-ppfloritura.DAT)
%%(/eraalescriptori/HagaseLaLuz/DATs/problematics/32-1-42-9-U.DAT)
%%(/eraalescriptori/HagaseLaLuz/DATs/problematics/19-2-37-26-va.DAT)
%% 4 glifs problemàtics d'orígen del caràcter següent
%%(/eraalescriptori/HagaseLaLuz/postATypI_doctoratFinal/1-27-33-sdescen.DAT)
%%(/eraalescriptori/HagaseLaLuz/postATypI_doctoratFinal/16-1-19-14-ff.DAT)
%%(/eraalescriptori/HagaseLaLuz/postATypI_doctoratFinal/6-1-33-28-slarga.DAT)
(/eraalescriptori/HagaseLaLuz/postATypI_doctoratFinal/1-23-13-sslarga.DAT)
%%(2-15-25-f.dat)
%% OSX amb doble clic pel Preview (l'adreça és absoluta des de Users) ...
%%(Users/femfum/Desktop/HagaseLaLuz/LuzRangel_Win/DelQuickVision/z.txt)
%% problemes de centrat
%%(1-15-10-S.DAT) % 1-15-10-S.DAT.B42
%# D %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%# OMPLIM O TRACEM EL CARÀCTER ? (true=omplim false=tracem)
true
%# E %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%# INICI DEL CARÀCTER A PARTIR DE LA BASE DEL MÒDUL TIPOGRÀFIC (línia de base)
%# en unitats matriu, segons taula: fMd_final3.pdf
%% 4 glifs problemàtics per l'amplada (dades segons fMd_final3.pdf)
%%2 % 6-2-33-9-M.DAT
%%0 % 9-2-7-22-ppfloritura.DAT
%%5 % 32-1-42-9-U.DAT
%%8 % 19-2-37-26-va.DAT
%% 4 glifs problemàtics d'orígen del caràcter següent
%%14 % letra_minuscula_sdescendente : 1-27-33-sdescen.DAT
%%8 % minusculaligada_ff : 16-1-19-14-ff.DAT
%%8 % letra_minuscula_slarga : 6-1-33-28-slarga.DAT
8 %% minusculaligada_sslarga : 1-23-13-sslarga.DAT
%%8 % letraminusculaf 2-15-25-f.dat
%%6 % letramayusculaS
%# F %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%# PINTEM L'ARLEQUINAT MODULAR? (true=si false=no)
true
%# G %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%# PINTEM LA GRAELLA MODULAR? (true=si false=no)
true
%# H %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%# FEM L'ANÀLISI DE COBERTURA DEL CARÀCTER ? (true=si false=no)
false
%# I %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%# ESCRIVIM EL CARÀCTER A DISC (#.dat.B42)? (true=si false=no)
%# el .B42 s'escriu al mateix directori on hi hagi .DAT
true
%# J %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%# NOM DEL CARÀCTER (entre parèntesi i sense espais en blanc!)
%# segons taula: Tabla_completa_3_cImagenes.pdf
%% 4 glifs problemàtics d'inici del caràcter següent
%%(letra_minuscula_sdescendente) % 1-27-33-sdescen.DAT
%%(minusculaligada_ff) % 16-1-19-14-ff.DAT
%%(letra_minuscula_slarga) % 6-1-33-28-slarga.DAT
(minusculaligada_sslarga) % 1-23-13-sslarga.DAT
%% 4 glifs problemàtics per l'amplada ...
%%(letramayusculaM) % 6-2-33-9-M.DAT
%%(abreviaturappfloritura) % 9-2-7-22-ppfloritura.DAT
%%(letramayusculaU) % 32-1-42-9-U.DAT
%%(minusculaligada_va) % 19-2-37-26-va.DAT
%%(letraminusculaf) % 2-15-25-f.dat
%% problemes de centrat
%%(letramayusculaS) % 1-15-10-S.DAT.B42
%# K %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%# CODI OCTAL DEL CARÀCTER (les xifres van entre parèntesi i sense la contrabarra)
%# segons taula: Tabla_completa_3_cImagenes.pdf
%% 4 glifs problemàtics per l'amplada ...
%%(115) % 6-2-33-9-M.DAT
%%(073) % 9-2-7-22-ppfloritura.DAT
%%(125) % 32-1-42-9-U.DAT
%%(333) % 19-2-37-26-va.DAT
%% 4 glifs problemàtics d'inici del caràcter següent
%%(51) % letra_minuscula_sdescendente : 1-27-33-sdescen.DAT
%%(311) % minusculaligada_ff : 16-1-19-14-ff.DAT
%%(76) % letra_minuscula_slarga : 6-1-33-28-slarga.DAT
(322) % minusculaligada_ssalarga : 1-23-13-sslarga.DAT
%%(146) % letraminusculaf 2-15-25-f.dat
%% problemes de centrat
%%(123) % 1-15-10-S.DAT.B42
%# AQUEST PARÀMETRE DE CONTROL DE L'ORÍGEN ÉS INNECESSARI!
%% L %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% ORÍGEN DEL CARÀCTER (per on es compon)
%% true = el valor numèric no actua (coincideix amb l'orígen X de l'àrea del tipus)
%% false = el valor numèric són unitats X d'1/5 de SubMòdul des de l'orígen de l'àrea del tipus
%%true 1
%# M %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%# ORÍGEN DE COMPOSICIÓ DEL CARÀCTER SEGÜENT
%# true = el valor numèric no actua (coincideix amb el Mòdul Tpogràfic o ample del glif)
%# false = el valor numèric actua
%# el valor numèric són unitats matriu comptades des de l'orígen de l'àrea del tipus (X)
%%true 0 % normals
%% 4 glifs problemàtics d'inici del caràcter següent
%%false 8 % letra_minuscula_sdescendente : 1-27-33-sdescen.DAT (/OglifS [136.08])
%%false 18 % minusculaligada_ff : 16-1-19-14-ff.DAT (/OglifS [306.18])
%%false 9 % letra_minuscula_slarga : 6-1-33-28-slarga.DAT (/OglifS [153.09])
false 18 % minusculaligada_ssalarga : 1-23-13-sslarga.DAT (/OglifS [306.18])
%# %%%%%%%%% NO MODIFIQUEU RES SOTA AQUESTA LÍNIA %%%%%%%%%%%%
{ %% stopped
/OglifSeguent exch def %% M valor d'orígen X de composició del caràcter següent
/bOglifSeguent exch def %% M el valor numèric NO actua?
%% parametres innecessaris
%% /Oglif exch def % L valor de l'orígen X del caràcter (per on es compon)
%% /bOglif exch def % L el valor numèric NO actua?
/B8Lletra exch def %% K codi octal del caràcter segons taula Latin 1 (ISO/IEC 8859-1)
/nomLletra exch def %% J nom del caràcter
/escrivimB42 exch def %% I escrivim el caràcter #.dat.B42 a disc?
/femElTxCdC exch def %% H fem l'anàlisi de cobertura del caràcter?
/pQModul exch def %% G pintem la graella modular?
/pModul exch def %% F pintem l'arlequinat modular?
/oCar exch def %% E inici del caràcter a partir de la base del Mòdul Tipogràfic (línia de base)
/OmplimOtracem exch def %% D omplim o tracem el caràcter?
%% aquí afaitem el nom del DAT
%% estratègia per saber en quin OS treballem
%% interroga el separador que utilitza l'intèrpret
currentsystemparams /GenericResourcePathSep get /bUsca exch def
dup dup /pathDAT exch def
{ %% loop
bUsca search
{
pop pop
}
{
exit
}ifelse
}loop /nomDAT exch def
(r) file /llegeixQVdat exch def %% C path del .dat pel fitxer de lectura
/Umodul exch def %% B unitats matriu per establir l'escala mestre
(r) file /mestreQVdat exch def %% A path del .dat mestre pel fitxer de lectura
/fMdManual exch def %% 2 factor fMd en manual
/deduimfMd exch def %% 1 gatell de si treballem en manual o deduint d'A i B
}stopped {(\n\n >>>> Teniu un error al path d'un .DAT o al Menu de l'Applet !\n\n\n) print flush quit}if
%# %% aquí llegim el .DAT mestre ...
mestreQVdat 1024 string readline pop
(mm) search %% entrada detectora del format DAT
{
pop pop pop
}
{
pop
(\n\n ... format de fitxer DAT Mestre incompatible amb ventaQVdat\n\n\n) print flush quit
}ifelse
(\n >>> ventaQVdat analitza el DAT Mestre ...\n\n) print flush
1 dict /TRaMS exch def %% diccionari on desarem els trams que descrigui del DAT
0 /iTRaMS exch def %% índex per numerar les claus del diccionari dels trams
{ %% loop de lectura de dades segons el format DAT (mm) del QuickVisison
%% ara llegim el nombre de línies a tractar ...
mestreQVdat 6 string readline pop
cvx exec dup
dup array /xCOO exch def %% paquet on desarem totes les coordenades de l'X
array /yCOO exch def %% paquet on desarem totes les coordenades de l'Y
0 /iXY exch def %% índex per desar a l'array
{ %% repeat
mestreQVdat 256 string readline pop
(,) search %% cerquem la primera coma
{
xCOO exch
dup length 1 sub string /x1milio exch def %% fem una string de la mida exacte (sense el punt decimal)
x1milio /NullEncode filter /menjaDecimals exch def %% per menjar-nos segurament 6 decimals
{ %% forall
dup 46 eq
{
pop
}
{
menjaDecimals dup 3 -1 roll write flushfile
}ifelse
}forall %% reescrivim tota la xifra menys el punt decimal
iXY
x1milio cvx exec put pop %% desem com a valor la xifra sense decimal
yCOO exch
dup length 1 sub string /x1milio exch def %% fem una string de la mida exacte (sense el punt decimal)
x1milio /NullEncode filter /menjaDecimals exch def %% per menjar-nos segurament 6 decimals
{ %% forall
dup 46 eq
{
pop
}
{
menjaDecimals dup 3 -1 roll write flushfile
}ifelse
}forall %% reescrivim tota la xifra menys el punt decimal
iXY
x1milio cvx exec put
} %% desem la coordenada x,y per duplicat (literal/string)
{
(\n\n ... hi ha hagut un greu error de lectura\n\n\n) print flush quit
} %% no fos que hi hagués un error al fitxer DAT ...
ifelse
iXY 1 add /iXY exch def %% actualitzem l'índex
}repeat
TRaMS %% desem al diccionari els arrays amb les dades X,Y del tram
iTRaMS 2 string cvs cvn 2 dict
dup /yCOO yCOO put
dup /xCOO xCOO put
put
mestreQVdat 1024 string readline pop
(mm) search %% entrada detectora del format DAT
{
pop pop pop
iTRaMS 1 add /iTRaMS exch def %% numerador dels trams
}
{
pop
(\n ... trams del DAT Mestre explorats ... ) print flush
TRaMS length 2 string cvs print flush (\n\n) print flush
exit
}ifelse
}loop
/X+petita 1000000000 def %% hi desarem la X més petita (esperem que amb 1000 milions inicials n'hi hagi prou)
/X+gran 0 def %% hi desarem la X més gran
/Y+petita 1000000000 def %% hi desarem la Y més petita (esperem que amb 1000 milions inicials n'hi hagi prou)
/Y+gran 0 def %% hi desarem la Y més gran
TRaMS
{ %% forall per tot el diccionari dels TRaMS
exch pop %% eliminem la clau de l'índex
%% cerquem la X més petita i la més gran
dup /xCOO get
{ %% forall
dup X+petita lt
{
/X+petita exch def
} %% cacem la més petita
{
dup X+gran gt
{
/X+gran exch def
} %% cacem la més gran
{
pop
}ifelse
}ifelse
}forall
%% cerquem la Y més petita i la més gran
/yCOO get
{ %% forall
dup Y+petita lt
{
/Y+petita exch def
} %% cacem la més petita
{
dup Y+gran gt
{
/Y+gran exch def
} %% cacem la més gran
{
pop
}ifelse
}ifelse
}forall
}forall
%% el valor X ara no ens interessa ...
%% X+gran X+petita sub /XBbox exch def % valor X del Bbox del caràcter (encara sense escalar)
Y+gran Y+petita sub /YBbox exch def % valor Y del Bbox del caràcter (encara sense escalar)
%% fi de l'anàlisi del DAT mestre
%% aquí llegim el .DAT per analitzar ...
llegeixQVdat 1024 string readline pop
(mm) search %% entrada detectora del format DAT
{
pop pop pop
}
{
pop
(\n\n ... format de fitxer DAT d'analisi incompatible amb ventaQVdat\n\n\n) print flush quit
}ifelse
(\n >>> ventaQVdat treballa el DAT per analitzar ...\n\n) print flush
1 dict /TRaMS exch def %% diccionari on desarem els trams que descrigui el DAT
0 /iTRaMS exch def %% índex per numerar les claus del diccionari dels trams
{ %% loop de lectura de dades segons el format DAT (mm) del QuickVisison
%% ara llegim el nombre de línies a tractar ...
llegeixQVdat 6 string readline pop
cvx exec dup
dup array /xCOO exch def %% paquet on desarem totes les coordenades de l'X
array /yCOO exch def %% paquet on desarem totes les coordenades de l'Y
0 /iXY exch def %% índex per desar a l'array
{ %% repeat
llegeixQVdat 256 string readline pop
(,) search %% cerquem la primera coma
{
xCOO exch
dup length 1 sub string /x1milio exch def %% fem una string de la mida exacte (sense el punt decimal)
x1milio /NullEncode filter /menjaDecimals exch def %% per menjar-nos segurament 6 decimals
{ %% forall
dup 46 eq
{
pop
}
{
menjaDecimals dup 3 -1 roll write flushfile
}ifelse
}forall %% reescrivim tota la xifra menys el punt decimal
iXY
x1milio cvx exec put pop %% desem com a valor la xifra sense decimal
yCOO exch
dup length 1 sub string /x1milio exch def %% fem una string de la mida exacte (sense el punt decimal)
x1milio /NullEncode filter /menjaDecimals exch def %% per menjar-nos segurament 6 decimals
{ %% forall
dup 46 eq
{
pop
}
{
menjaDecimals dup 3 -1 roll write flushfile
}ifelse
}forall %% reescrivim tota la xifra menys el punt decimal
iXY
x1milio cvx exec put
} %% desem la coordenada X,Y per duplicat (literal/string)
{
(\n\n ... hi ha hagut un greu error de lectura\n\n\n) print flush quit
} %% no fos que hi hagués un error al fitxer DAT...
ifelse
iXY 1 add /iXY exch def %% actualitzem l'índex
}repeat
TRaMS %% desem al diccionari els arrays amb les dades X,Y del tram
iTRaMS 2 string cvs cvn 2 dict
dup /yCOO yCOO put
dup /xCOO xCOO put
put
llegeixQVdat 1024 string readline pop
(mm) search %% entrada detectora del format DAT
{
pop pop pop
iTRaMS 1 add /iTRaMS exch def %% numerador dels trams
}
{
pop
(\n ...trams del DAT d'analisi explorats... ) print flush
TRaMS length 2 string cvs print flush (\n\n) print flush
exit
}ifelse
}loop
/X+petita 1000000000 def %% hi desarem la X més petita (esperem que amb 1000 milions inicials n'hi hagi prou)
/X+gran 0 def %% hi desarem la X més gran
/Y+petita 1000000000 def %% hi desarem la Y més petita (esperem que amb 1000 milions inicials n'hi hagi prou)
/Y+gran 0 def %% hi desarem la Y més gran
TRaMS
{ %% forall per tot el diccionari dels TRaMS
exch pop %% eliminem la clau de l'índex
%% cerquem la X més petita i la més gran
dup /xCOO get
{ %% forall
dup X+petita lt
{
/X+petita exch def
} %% cacem la més petita
{
dup X+gran gt
{
/X+gran exch def
} %% cacem la més gran
{
pop
}ifelse
}ifelse
}forall
%% cerquem la Y més petita i la més gran
/yCOO get
{ %% forall
dup Y+petita lt
{
/Y+petita exch def
} %% cacem la més petita
{
dup Y+gran gt
{
/Y+gran exch def
} %% cacem la més gran
{
pop
}ifelse
}ifelse
}forall
}forall
X+gran X+petita sub /XBbox exch def %% valor X del Bbox del caràcter (encara sense escalar)
%% el valor Y el prenem del DAT mestre!
%% Y+gran Y+petita sub /YBbox exch def % valor Y del Bbox del caràcter (encara sense escalar)
%% fi de lectura del DAT per analitzar
%% conceptes d'amidament:
%% hem calculat inicialment el factor multiplicador d'escala (fMd) per mitjà dels caràcters de test
%% a e m i n o r s t u v ... doncs aquests sempre fan exactament (YBbox) 5 SubMòduls (altura x) o
%% sigui 25 unitats matriu (1 unitat matriu = 1/5 part d'un SubMòdul), llavors sabent que l'alçada
%% del Mòdul Tipogràfic (rectangle blau) sempre fa 40 unitats matriu (8 SubMòduls), i establint
%% definitivament al Mòdul Cal·ligràfic de referència (rectangle blanc), 9 SubMòduls verticals,
%% amb el valor de 720 punts de cícero = 270 mm = 80 quadratins del cos 18 (11 punts de cícero =?
%% 12 punts de pica), llavors cada unitat matriu valdria 17.01 punts de pica (6mm x 2.835pt),
%% i cada SubMòdul valdria 85.05 punts de pica (5 x 17.01pt), llavors agafem el valor YBbox
%% (alt del caràcter) de qualsevol d'aquests caràcters ... a e m i n o r s t u v ... i calculem el
%% factor que cal aplicar per adaptar-lo als constants 5 SubMòduls d'alt (425.25pt) que fan sempre
%% 5x5 SubMòduls = Mòdul m
%# %% principals mesures
/MoDuL 85.05 def %% valor del SubMòdul
/UnQuintUaSumar MoDuL 5 div def %% valor de la unitat matriu (1/5 de SubMòdul)
%# deduïm d'A i B, o el posem manualment?
deduimfMd
{
%% ara el factor multiplicador d'escala va en funció d'YBbox + Umodul del DAT mestre escollit
UnQuintUaSumar Umodul mul
YBbox div %% un num # que multiplicat pel valor d'Y del DAT mestre doni 5 SubMòduls (425.25pt)
%% treiem per la pantalleta el valor de fMd per comprovar si varia ...
(\n >>> El factor MESTRE multiplicador d'escala deduit d'A i B es ... ) print flush
dup 64 string cvs print flush (\n\n) print flush
}
{
fMdManual
%% treiem per la pantalleta el valor de fMd per comprovar si varia ...
(\n >>> El factor MESTRE multiplicador d'escala entrat manualment es ... ) print flush
dup 64 string cvs print flush (\n\n) print flush
}ifelse
%% el desem dins una cadena per que no s'arrodoneixin decimals quan desem al diccionari .B42
dup 64 string cvs /factorMultiplicadorDescala exch def
/fMd exch def %# factor multiplicador d'escala adaptat al caràcter que agafem com a mestre
%% treballem amb un A4 vertical, però flexibilitzem l'amplada
%% (per exemple per tenir en compte els 4 glifs d'ample excepcional)
%% de forma que sempre afegirem 1 SubMòdul de més a l'ample del caràcter XBbox (línia blava)
%% sempre que aquest valor d'ample es quedi per sobre dels 595 d'ample estàndard de l'A4
%% en cas contrari es quedarà al 595 del DINa4
%% el signe dins la pàgina sempre quedarà centrat d'ambdós marges horitzontals
XBbox fMd mul MoDuL add %%(:-D)pstack quit
dup 595 gt {}{pop 595}ifelse
/MaxX exch def %% ample i final del loop X
842 /MaxY exch def %% alt i final del loop Y
<<
/PageSize[MaxX MaxY]
/HWResolution [721 721] %% per treballar amb GS a la màxima resolució
>>setpagedevice
gsave
[
{0 .2 .2 0 setcmykcolor}
{.2 .2 0 0 setcmykcolor}
] /Arq exch def %% colors dels quadres en arlequí
[
{1 add}
{1 sub}
] /pestell exch def %% actua d'interruptor
/Fi 0 def %% valor del valor inicial de color del pintat de les files (X)
Fi /Fara exch def %% valor actual de color del pintat de les files (X)
%% on ha de començar el reticulador per que situant a 1 mòdul (X,Y) d'aquest inici el caràcter
%% tot el dibuix de la seva mètrica (arees blaves o blanques) quedi centrada dins la pàgina?
%% MoDuL 6 mul
%% XBbox fMd mul % aquest es el valor X de /Caixa (blava)
%% gt % l'X de l'àrea blanca (6x9) es més gran que l'X de /Caixa?
%% { % si
%% MoDuL 2 div
%% }
%% { % no
%%
%% }ifelse
MaxX UnQuintUaSumar div %% aquí ens diu quantes unitats matriu té la pàgina d'ample
5 div %% aquí ens diu els SubMòduls que té la pàgina d'ample
dup cvi sub %% aquí tindríem només els decimals del càlcul
MoDuL mul 2 div neg UnQuintUaSumar 2 mul sub %% enretirem cap a l'esquerra 2 unitats matriu
/Xara exch def %% valor inicial de la posició X per que la quadricula quedi centrada
MaxY UnQuintUaSumar div 5 div dup cvi sub 1 exch sub MoDuL mul 2 div neg
UnQuintUaSumar 2 mul sub %% enretirem cap avall 2 unitats matriu
/Yara exch def %% valor inicial de la posició Y per que la quadricula quedi centrada
%% punt d'inici del rectangle del Mòdul Tipogràfic
Xara MoDuL add /iATipusX exch def
Yara MoDuL add UnQuintUaSumar 2 mul add /iATipusY exch def
%# %% pintem l'arlequinat modular de salmó i gris?
pModul
{
{ %% loop Y
Yara MaxY gt {exit}if %% hem fet totes les files?
{ %% loop X
Xara MaxX gt {exit}if %% hem fet totes les columnes?
Arq Fara get cvx exec %% cridem el color que toca
Xara Yara MoDuL dup rectfill %% pintem el SubMòdul quadrat on toca
Fara pestell Fara get cvx exec /Fara exch def %% actualitzem l'índex per tibar el color del pintat de les files (X)
Xara MoDuL add /Xara exch def %% actualitzem el valor de la posició X (files)
}loop % de les files (X)
MaxX UnQuintUaSumar div 5 div dup cvi sub
%% 1 exch sub
MoDuL mul 2 div neg
UnQuintUaSumar 2 mul sub %% enretirem cap a l'esquerra 2 unitats matriu ...
/Xara exch def %% valor inicial de la posició X per que la quadrícula quedi centrada
Yara MoDuL add /Yara exch def %% actualitzem la posició Y
Fi pestell Fi get cvx exec /Fi exch def %% actualitzem el valor inicial del color del pintat de les files (X)
Fi /Fara exch def %% valor actual de color del pintat de les files (X)
}loop %% de les columnes (Y)
grestore
}if
%# %% posicionem el caràcter per omplir-lo o traçar-lo amb negre
gsave
1 1 1 1 setcmykcolor
%% situem el nou punt 0,0 d'inici del caràcter dins del Mòdul Tipogràfic
iATipusX %% posició d'inici X del Mòdul Tipogràfic
iATipusY %% UnQuintUaSumar 3 mul sub % posició d'inici Y del Mòdul Tipogràfic
%% correcció manual d'inici segons dada del menú
oCar UnQuintUaSumar mul dup /ciY exch def %% correcció de la posició Y de la imatge (pel %)
add translate
%% traslladem al punt 0 0 fent el negatiu de les posicions X Y més petites
X+petita fMd mul neg Y+petita fMd mul neg
2 copy 2 array astore /Origen exch def % valor de l'orígen a escriure al diccionari del caràcter a disc
translate
TRaMS
{ %% forall
exch pop %% ens carreguem el literal del tram
begin
xCOO length 1 sub /iXY exch def %% ajustem l'índex al màxim de l'array (tan se val X o Y)
%% situem el primer punt
xCOO iXY get fMd mul
yCOO iXY get fMd mul
moveto
iXY 1 sub /iXY exch def
{ %% loop on llegim dels paquets X Y la resta de coordenades per ordre
xCOO iXY get fMd mul
yCOO iXY get fMd mul
lineto
iXY 1 sub /iXY exch def
iXY 0 lt {exit}if
}loop
closepath
end
}forall %% com que l'ordre dels factors no altera el producte ...
%# %% lectura de les instruccions de dibuix vectorial del glif
%# %% anàlisi dels punts de cobertura del caràcter en funció del seu Mòdul Tipogràfic
femElTxCdC escrivimB42 or %% si els dos són false no actua
{
gsave
1 /res exch def %% salt de resolució per l'explorador per columnes/files
/ntext 0 def %% comptador del total de punts negres de l'àrea d'exploració
/atext 0 def %% comptador del total de punts de l'àrea d'exploració
%% posa a l'stack i en un procediment totes les instruccions de l'UserPath actual
%% (això és interessant per que ens dóna el Bbox exacte!)
true upath %% només 1 vegada, doncs si no, duplica els path!
%%uappend % l'afegim
%%gsave
%% 0 rotate % en vertical (0 rotate) horitzontal (90 rotate)
%%true upath % per que tinguin efecte els canvis produits a la CTM (ex. rotate)
%%grestore
dup 1 4 getinterval %% agafem les dades del Bbox
aload pop
/y exch def %% valors d'inici de files
/cols exch def %% valor màxim de columnes
/fils exch def %% valor màxim de files
/x exch def %% valor d'inici de columnes
%% pel càlcul de l'ample i alt de la imatge cal arrodonir-ho amb ceiling ...
%%(AMPLE...) ==
cols x sub ceiling cvi /xRAW exch def
%%(ALT...) ==
y fils sub ceiling cvi /yRAW exch def
/xini x def
/cAmi exch cvlit
dup /glif exch def %# desem l'array amb les instruccions de dibuix del glif, domesticades com a literal, pel diccionari de l'escriptura del caràcter a disc
def
grestore
femElTxCdC %# escombrem per l'anàlisi de cobertura?
{
%% on escriurem el raw?
%%(Macintosh_HD:eraalescriptori:HagaseLaLuz:LuzRangel_Win:raw.raw)
(raw.raw) %% al mateix directori on s'executa aquest PS Applet
dup /ELraw exch def (w) file /ONraw exch def
(2#00000000) /8bits exch def %% cadena de farciment del byte en cas que treballessim a 1 bit
2 /i8b exch def %% índex pel farciment del byte
%# ara treballarem a una resolució d'1 punt (equivalent a 72 ppp)
(\n >>> analitzant el % d'area de cobertura... ) print flush
{ %% loop 2
y fils lt {exit} if
y res sub /y exch def
{ %% loop 1
x cols gt { /x xini def exit} if
x res add /x exch def
x
gsave
y
cAmi %% avaluador de si el píxel és a la línia de traç
%% inufill % interroga el píxel d'un Userpath en positiu (+ false charpath)
inueofill %% interroga el píxel d'un Userpath i perfila (+ true charpath)
%% not % negativa !!!
grestore
{
ntext 1 add /ntext exch def %% punts totals explorats plens (negres)
%% si treballessim a 1 bit
%8bits i8b (1) putinterval
%% treballem a 256 nivells de gris
ONraw 0 write
}
{
%% treballem a 256 nivells de gris
ONraw 255 write
}ifelse
atext 1 add /atext exch def %% punts totals explorats
%% si treballessim a 1 bit
%%i8b 1 add dup 10 eq
%%{
%%pop 2 /i8b exch def
%%ONraw 8bits cvx exec write
%%(2#00000000) /8bits exch def % regenerem la cadena de farciment del byte
%%}
%%{
%% /i8b exch def
%%}ifelse % comptador de l'índex de l'octet
}loop %% loop 1
%%(filera explorada) atext ntext == flush == flush == flush
}loop %% loop 2
(\n ... ) print flush ntext 12 string cvs print flush
( ... punts de cobertura del caracter\n) print flush
ONraw closefile %% tanquem el raw
}if
}if
%% fi de l'anàlisi del % de cobertura del caràcter
%# %% omplim o tracem el caràcter?
OmplimOtracem %% doncs això ...
{ %% omplim sense gruix de filet
eofill
}
{ %% tracem
%% gruix de línia del filet del caràcter
.7 setlinewidth
stroke
}ifelse
grestore
%% fi de pintat del caràcter
%# %% pintem la graella d'unitat matriu?
pQModul
{
gsave
.2 2 mul setlinewidth %% gruix prim de la línia de retícula
0 0 0 .1 setcmykcolor
/iL 0 def %% valor inicial del comptador de línies
MaxX UnQuintUaSumar div 5 div dup cvi sub
%% 1 exch sub
MoDuL mul 2 div neg
UnQuintUaSumar 2 mul sub %% enretirem cap a l'esquerra 2 unitats matriu ...
/Xara exch def %% valor inicial de la posició X per que la quadricula quedi centrada
MaxY UnQuintUaSumar div 5 div dup cvi sub 1 exch sub MoDuL mul 2 div neg
UnQuintUaSumar 2 mul sub %% enretirem cap a l'esquerra 2 unitats matriu ...
/Yara exch def %% valor inicial de la posició Y per que la quadricula quedi centrada
%% horitzontals de la graella
save
{ %% loop Y
Yara MaxY gt {exit}if %% hem fet totes les files?
Xara Yara moveto MaxX Yara lineto
iL 5 eq
{ %% cada 5 unitats (SubMòdul) pintem la línia més gruixuda
gsave .6 2 mul setlinewidth stroke grestore /iL 1 def
}
{
iL 1 add /iL exch def stroke
}ifelse
Yara UnQuintUaSumar add /Yara exch def %% actualitzem la posició Y
}loop %% de les columnes (Y)
restore
%% verticals de la graella
save
{ %% loop X
Xara MaxX gt {exit}if %% hem fet totes les columnes ?
Xara Yara moveto Xara MaxY lineto
iL 5 eq
{ %% cada 5 unitats (SubMòdul) pintem la línia més gruixuda
gsave .6 2 mul setlinewidth stroke grestore /iL 1 def
}
{
iL 1 add /iL exch def stroke
}ifelse
Xara UnQuintUaSumar add /Xara exch def %% actualitzem la posició X
}loop %% de les files (X)
restore
grestore
}if
%# %% pintem el Mòdul Cal·ligràfic (6x9 SubMòduls) a l'àrea modular
%% sempre que pintem l'arlequinat o la graella modulars
pModul pQModul or
{
gsave
pModul false eq pQModul true eq and
{ %% en cas que no pintem l'arlequinat però pintem la graella, serà en gris
.2 .2 0 0 setcmykcolor
}
{ %% la resta de casos, serà en blanc
0 0 0 0 setcmykcolor
}ifelse
3 setlinewidth
%% aquí ens cal un avaluador si no volem que el marc 6x9 sigui fix?
%%Xara MoDuL add
iATipusX
%%Yara MoDuL add
iATipusY UnQuintUaSumar 2 mul sub
6 MoDuL mul 9 MoDuL mul rectstroke
%% Xara MoDuL add Yara MoDuL add 8 MoDuL mul 9 MoDuL mul rectstroke
grestore
}if
%# %% pintem la línia de base del caràcter i l'altura X en vermell
gsave
1 setlinewidth
0 1 1 0 setcmykcolor
iATipusX iATipusY MoDuL add UnQuintUaSumar 3 mul add moveto %% idem que la que pintarà l'orígen del glif
iATipusX XBbox fMd mul add iATipusY MoDuL add UnQuintUaSumar 3 mul add lineto stroke
%% línia vermella (altura X) a 6 SubMòduls + 3 unitats matriu des de la base del Mòdul Tipogràfic
iATipusX iATipusY MoDuL 6 mul add UnQuintUaSumar 3 mul add moveto
iATipusX XBbox fMd mul add iATipusY MoDuL 6 mul add UnQuintUaSumar 3 mul add lineto stroke
grestore
%% pintem l'orígen del glif (per on es compon)
%%gsave
%%1 0 0 setrgbcolor
%%(:-D)==
%%.5 setlinewidth % meitat de gruix que la línia de base
%%iATipusX
%%bOglif % el valor Oglif és significatiu?
%%{ % NO, llavors coincidirà amb l'orígen X de l'àrea del caràcter
%% /Oglif 0 def % redesem la variable per escriure-la al diccionari del B42
%%}
%%{ % SI
%% Oglif UnQuintUaSumar mul
%% dup /Oglif exch def % redesem la variable per escriure-la al diccionari del B42
%% add
%%}ifelse
%%iATipusY MoDuL add UnQuintUaSumar 3 mul add translate
%% UnQuintUaSumar 2 div dup dup neg exch moveto dup neg lineto stroke % pintem \
%% UnQuintUaSumar 2 div dup dup neg exch neg moveto dup lineto stroke % pintem /
%% pintem |
%%0 UnQuintUaSumar moveto 0 UnQuintUaSumar neg lineto stroke
%% pintem O
%%iATipusX iATipusY MoDuL add UnQuintUaSumar 3 mul add UnQuintUaSumar 0 360 arc stroke
%grestore
%# %% pintem l'orígen de composició del glif següent amb una X puntejada
gsave
0 1 1 0 setcmykcolor
%%(:-D)==
.5 setlinewidth %% meitat de gruix que la línia de base
%% una línia discontinua
[UnQuintUaSumar 30 div] dup 0 get 2 div setdash
iATipusX
bOglifSeguent %% el valor OglifSeguent NO és significatiu?
{
/OglifSeguent null def %% redesem la variable per escriure-la al diccionari del B42
%% en aquest cas, valent null, obligarà a desar-hi el primer valor de l'array /Caixa
XBbox fMd mul add %% i la composició del caràcter següent coincidirà amb el Mòdul Tipogràfic
}
{
OglifSeguent UnQuintUaSumar mul
dup /OglifSeguent exch def %% redesem la variable per escriure-la al diccionari del B42
add
}ifelse
iATipusY MoDuL add UnQuintUaSumar 3 mul add translate
UnQuintUaSumar 2 div dup dup neg exch moveto dup neg lineto stroke %% pintem \
UnQuintUaSumar 2 div dup dup neg exch neg moveto dup lineto stroke %% pintem /
%% pintem |
%%0 UnQuintUaSumar moveto 0 UnQuintUaSumar neg lineto stroke
%% pintem O
%%iATipusX iATipusY MoDuL add UnQuintUaSumar 3 mul add UnQuintUaSumar 0 360 arc stroke
grestore
%# %% pintem el Mòdul Tipogràfic (blau)
gsave
.6 setlinewidth
%%0 0 1 setrgbcolor
1 .2 0 0 setcmykcolor
%% l'inici X sempre coincidint amb un SubMòdul i l'inici Y al primer SubMòdul sencer
iATipusX iATipusY %%UnQuintUaSumar 3 mul sub
XBbox fMd mul MoDuL 8 mul
4 copy %% en fem una còpia pel càlcul del % de cobertura
rectstroke
grestore
%# %% desem l'ample i l'alt en una array pel valor del Mòdul Tipogràfic pel diccionari del .B42
2 copy 2 array astore /Caixa exch def
femElTxCdC
{
%# calculem el % de cobertura en funció del Mòdul Tipogràfic
%% primer posem el total de punts de cobertura del Mòdul Tipogràfic
%%3 -1 roll sub 3 1 roll exch sub
2 copy 2 array astore /iGina exch def %% format de pàgina per la imatge (Mòdul Tipogràfic)
mul dup /tpAT exch def
( ... sobre un total de ... ) print flush 12 string cvs print flush ( ... punts de l'area del tipus ...) print flush
%% després en deduïm el % que en suposen els del caràcter que hem dibuixat
ntext 100 mul tpAT div
(\n >>> suposa un % de cobertura d'un ... ) print flush 12 string cvs dup /txCdC exch def print flush
( %\n) print flush
pop pop %% eliminem les dues primeres dades de posicionat
}
{
pop pop pop pop %% eliminem la còpia del rectstroke
}ifelse
%% ara NO pintem el Bbox del caràcter
%%gsave
%%0 1 0 setrgbcolor
%%.6 setlinewidth
%%[4 2] 0 setdash % linia discontinua
%% situem el nou punt 0,0 d'inici del caràcter dins de l'àrea de tipus
%%iATipusX % posició d'inici X de l'àrea de tipus
%%iATipusY UnQuintUaSumar 3 mul sub % posició d'inici Y de l'àrea de tipus
%% correcció manual d'inici segons dada del menú
%%oCar UnQuintUaSumar mul add
%% XBbox fMd mul YBbox fMd mul rectstroke
%%grestore
[ %% etiquetem el DocInfo...
/Title nomDAT
/Keywords (\(Johannes\) Fust, \(Johannes\) Gutenberg, \(Peter\) Schöffer, Acuñación, Ascendentes, Average linkage, B-42, Biblia, Calígrafo, caligrafía, caligráfico, Carácter, Casa de moneda, Ceca, Cluster analysis \(análisis de conglomerados\), Clustering \(agrupación\), Clustering jerárquico aglomerativo, Clustering óptimo, Código fuente, Composición, Conservador, Contorno exterior, Contornos globales, Coordenadas, Cuerpo, DAT.B42, Dendrograma, Descendentes, Diferencia estructural, Diseño, Disimilaridad, Distancia, Escritura, Evangelio de Mateo, Fondo Antiguo, Fondo Tipográfico, FormPak, Fundición, Fundición Bauer-Neufville, Gensfleich, Ghostscript, Gótica textur, Grupo de control, Industria gráfica, Letras, Línea maestra, Matriz, matrices, Mayúsculas, MDS, Minúsculas, Mitutoyo, Modelo, Modulación, Módulo 'm', Molde, Muestra, Multidimensional Scaling, Nuevo Testamento, Pauta, Póliza francesa, Póliza múltiple, Pseudoformato tipográfico, Punzón, punzones, QVision, QVPak, lenguaje R, Rialera, Software libre, Tallador, Terminal, Test de Dixon, Test estadístico para la detección de outliers, Tipo, tipografía, tipográfica, tipográfico, Tipos móviles, Universidad de Sevilla, VentaQVdat, Aglomerative hierarchical, Ascending, Bible, Body, Calligrapher, calligraphy, calligraphic, Capitalized, Carver, Character, Cluster analysis, Clustering optimal, Codes, Coin, coined, Composition, Conservative, Contour, Control group, Coordinates, Dendrogram, Descending, Dissimilarity, dissimilarities, Distance, Dixon's Test, Font, Foundry, French policy, Gauge, Gospel of Matthew, Gothic textura, Ingot molds, Lowercase, Master line, Matrix, matrices, Mint, Model, Modulation, Module 'm', Mold, Movable type, multiple typographic bill, New Testament, Outline, Pseudoformat, punch, punches, R laguage \(data processing\), Sample, Scripture, Statistical, Terminal, Test for detecting outlier, Textur, Type, typography, typographic, typographical, Encunyació, Ascendents, Bíblia, Cal·lígraf, cal·ligrafia, cal·Ligràfic, Caràcter, Seca, anàlisi de conglomerats, Clustering jeràrquic aglomeratiu, Clustering òptim, Codi font, Composició, Contorn exterior, Contorns globals, Coordenades, Cos, Descendents, Diferència estructural, Disseny, Dissimilaritat, Distància, Escriptura, Evangeli de Mateu, Fons Antic, Fons Tipogràfic, Gòtica textur, Grup de control, Indústria gràfica, Lletres, Línia mestra, Matriu, matrius, Majúscules, Minúscules, Model, Modulació, Mòdul 'm', Motlle, Mostra, Nou Testament, Pòlissa francesa, Pòlissa múltiple, Pseudoformat tipogràfic, Punxó, punxons, llenguatge R \(tractament de dadesi\), Programari lliure, Tallador, Test estadístic per a la detecció de outliers, Tipus, tipografia, tipogràfica, tipogràfic, Tipus mòbils, femfum, open source software, postscript, universitat de barcelona, tesi doctoral, PhD Thesis)
/Author (Luz M. Rangel Alanís + Marc Antoni Malagarriga i Picas)
/Subject (analitza un .DAT generat per QuikVision i en crea un tipus pautat .B42 a disc i a PDF)
/Creator (ventaQVdat_011.ps Applet v0.0.11)
/DOCINFO
pdfmark
showpage
%# %% fem la segona pàgina amb la imatge de l'exploració dels % ?
femElTxCdC
{
<</PageSize iGina>>setpagedevice %% el format de pàgina s'adiu al Mòdul Tipogràfic
gsave
0 ciY translate xRAW yRAW scale %% posicionem al mateix inici de caràcter dins 'la caixa'
<<
/ImageType 1
/Width xRAW
/Height yRAW
/BitsPerComponent 8
/Decode [0 1]
/ImageMatrix [xRAW 0 0 yRAW neg 0 yRAW]
/DataSource ELraw (r) file
>> image
grestore
%# escrivim el percentatge de cobertura
%% com a contingut de pàgina ...
%%10 10 moveto /Courier 24 selectfont txCdC show
%%currentpoint moveto ( %) show
%% com a nota senzilla ...
[
/Rect [10 10 100 25]
/Open false
/Title txCdC dup length dup /fatxc exch def 2 add string dup 3 -1 roll 0 exch putinterval dup fatxc ( %) putinterval dup
/Contents exch
/Color [1 1 0]
/ANN
pdfmark
showpage
%% avisem si el tipus supera per ample o per alt, en 3 punts, el Mòdul Tipogràfic establert
ciY yRAW add iGina 1 get 2 copy gt %% si la imatge supera el format Y de plana...
{
sub abs 3 gt %% tolerància
{
(\n\n >>>> EP! el tipus supera l'area del Modul Tipografic (blau) per la Y) print flush
}if %% el tipus supera la Y de l'àrea blava del Mòdul Tipogràfic en més de # punts?
}
{
pop pop
}ifelse
xRAW iGina 0 get 2 copy gt %% si la imatge supera el format X de plana (Mòdul Tipogràfic) ...
{
sub abs 3 gt % tolerància
{
(\n\n >>> EP! el tipus supera l'area blava per la X) print flush
}if %% el tipus supera la X de l'àrea blava del Mòdul Tipogràfic en més de # punts?
}
{
pop pop
}ifelse
}if
%# %% escrivim el fitxer .B42 ?
escrivimB42
{
(\n\n >>> escrivim el caracter ... ) print flush
%% aquí els algorismes espia# per reescriure diccionaris i paquets de forma segura
%% Nou algorisme que reescriu un diccionari basat en espiadic_fura2.ps
%% per tal de no tenir problemes amb els diccionaris recursius (per més que n'hi hagin!)
%% cal estudiar bé si posem EOL en certs punts d'aquest ventador
/espiadic_fura2
{
/AraVento_D exch def
/iDic 0 def %% índex de diccionaris a incrustar a l'array
/NohAdic true def %% és imprescindible que comenci amb true ?
%% AraVento i AraBorro són variables que s'aniran alternant el diccionari intern d'esborrat
%% de les dades a mida que es vagin ventant
AraVento_D 10 dict copy /AraBorro_D exch def
%% la idea és fer una array dels diccionaris que anem ventant (còpies no vinculades)
%% l'array anirà creixent a mida que anem entrant a diccionaris més interns
%% i d'aquestos anirem eliminant els parells ventats a mida que els anem ventant
%% fent-ne l'actualització/eliminació de l'array quan convingui
/Adic 1 array def %% paquet amb els diccionaris que anem ventant
{ %% loop 1
{ %% loop 2
AraVento_D
{ %% forall
dup type /dicttype eq %% hem d'escriure el diccionari a mida que l'anem trobant
{
exch dup AraBorro_D exch undef %% dono de baixa el parell
%% escrivim la clau
127 string cvs %% converteix a cadena el nom Clau amb el màxim perméss per a un literal al PDF 1.3
%% posem el caràcter / per la clau literal
dup length 1 add string dup 0 (/) putinterval dup 3 -1 roll 1 exch putinterval
Objected'Ara exch writestring
%% Objected'Ara ( ) writestring
Objected'Ara ( <<) writestring %% escrivim l'inici del diccionari
iDic 1 add /iDic exch def %% comptador d'índex pel proper diccionari
%% ampliem l'array de diccionari a 1 més i reincrustem l'anterior
Adic length 1 add array dup Adic 0 exch putinterval /Adic exch def
Adic exch iDic exch put %% incrustem el diccionari que ventem a la darrera posició
Adic iDic 1 sub AraBorro_D put %% incrustem el diccionari còpia, purgat a la posició anterior
/NohAdic false def
Adic iDic get /AraVento_D exch def
AraVento_D 10 dict copy /AraBorro_D exch def exit
}
{
exch dup AraBorro_D exch undef %% dono de baixa el parell
%% escrivim la clau
127 string cvs %% converteix a cadena el nom Clau amb el màxim permés per a un literal al PDF 1.3
%% posem el caràcter / per la clau literal
dup length 1 add string dup 0 (/) putinterval dup 3 -1 roll 1 exch putinterval
Objected'Ara exch writestring
Objected'Ara ( ) writestring
%% escrivim el valor esbrinant de quina mena
dup type /integertype eq
{
256 string cvs
}
{
dup type /booleantype eq
{
6 string cvs
}
{
dup type /realtype eq
{
10000 mul truncate 10000 div
256 string cvs
}
{
dup type /stringtype eq
{
%%65535 string cvs % és redundant?
%% salvaparent2.ps
%% de com reescriure una string per solucionar el problema de no deixar-nos
%% el backslash \ i els parèntesi () sense el \ que els marca com a caràcters
%% adaptat de l'algorisme NRMLTZDR2.ps del cercador de pal·líndroms TURURUT2
/fora
[ %% paquet de caràcters a cercar
(\134) %% \
(\050) %% (
(\051) %% )
] def
/FAfora 3 def %% pestell de sortida del loop
/foraX
[ %% paquet de substitució de caràcter
(\\\\)
(\\\()
(\\\))
] def
/ifora 0 def %% índex de fora
%% aquí la cadena a reescriure correctament
%%(el primer \\\)el segon\\\( el tercer \)\(el quart i el cinque\(\))
mark exch
{ %% loop general
{ %% loop cerca/substitució de caràcters
fora ifora get search
{
exch pop
dup length dup 2 add string dup 3 -1 roll foraX ifora get putinterval
dup 3 -1 roll 0 exch putinterval
}
{
exit
}ifelse
exch
}loop
%% aquest loop capgira tots els elements trobats a l'stack mentre n'hi hagi més d'un
counttomark 1 gt
{
counttomark /atura't exch def
/ici 2 def
{ %% loop
ici -1 roll ici 1 add /ici exch def ici atura't gt {exit} if
}loop
{ %% loop empalmador de les cadenes trobades, en 1 sola
dup length dup 3 index length add string dup 4 -1 roll
0 exch putinterval dup 3 -1 roll 4 -1 roll putinterval
counttomark 1 eq {exit} if
}loop
}if
ifora 1 add /ifora exch def
FAfora ifora eq {exit}if
}loop %% general
exch pop %% eliminem la mark
%% fi de salvaparent2.ps
%% posem els caràcters ( ... ) com a cadena
dup length dup /lAstC exch def 2 add string dup 0 (\() putinterval
dup 3 -1 roll 1 exch putinterval dup lAstC 1 add (\)) putinterval
}
{
dup type /nametype eq
{
128 string cvs
dup length 16 eq
{
dup 10 get 95 eq % ens assegurem que el caràcter central sigui un _
{ %% reconstruim les tres dades originals de referència indirecte d'objecte (# # R)
(_) search pop exch pop exch
{ %% loop
(_) search {pop pop}{(R) exit}ifelse
}loop
3 -1 roll Objected'Ara exch writestring Objected'Ara ( ) writestring exch
Objected'Ara exch writestring Objected'Ara ( ) writestring %% deixem la (R) per la cua de l'algorisme
}
{ %% posem el caràcter / per la clau literal
dup length 1 add string dup 0 (/) putinterval dup 3 -1 roll 1 exch putinterval
}ifelse
}
{ %% posem el caràcter / per la clau literal
dup length 1 add string dup 0 (/) putinterval dup 3 -1 roll 1 exch putinterval
}ifelse
} %% tots aquests tipus els posa el seu valor en una cadena de text i després en un paquet
{
dup type /arraytype eq
{ %% aquí cridem l'espiapaq_fura3 i deixem una string buida per que no peti
/salva'l save def espiapaq_fura3 salva'l restore ()
}
{
dup type /nulltype eq
{
pop (null)
}
{ %% la resta de tipus que quedin es posa en una cadena de text el nom del tipus
type 256 string cvs
}ifelse
}ifelse %% del arraytype
}ifelse %% de nametype
}ifelse %% del stringtype
}ifelse %% del realtype
}ifelse %% del booleantype
}ifelse %% del integertype
Objected'Ara exch writestring
Objected'Ara %%dup
( ) writestring %%flushfile
%% fi d'escriptura del valor i esbrinat de la mena
}ifelse
}forall
NohAdic {exit}if %% sortim si al diccionari més allunyat ja no en niua cap més?
/NohAdic true def %% cada vegada que acabem de ventar un diccionari ...
}loop %% 2
Adic length 0 eq {exit} if %% filtre per l'array de diccionaris, buida
Adic iDic AraBorro_D put %% incrustem el diccionari acabat de ventar i purgat a la darrera posició
%% eliminem enrera els diccionaris buits i reconstruim Adic a la mida justa per continuar el ventat
%% només sortirem quan Adic estigui a 0
{ %% loop
Adic iDic get length 0 eq %% quan trobem un diccionari que no és a 0 sortim del purgat d'Adic
{
Adic length 1 sub Adic exch 0 exch getinterval /Adic exch def
Adic length 0 eq {exit} if
%% aquí la cua del diccionari
Objected'Ara %%dup
(>> ) writestring %%flushfile % escrivim la cua del diccionari
}
{
exit
}ifelse
iDic 1 sub /iDic exch def
}loop
Adic length 0 eq {exit} if %% pleguem?
Adic iDic get /AraVento_D exch def %% agafem el darrer diccionari no zero per continuar el ventat
AraVento_D 10 dict copy /AraBorro_D exch def %% en fem la còpia pel purgat
}loop %% 1
}bind def
%% fi de l'algorisme que reescriu un diccionari espiadic_fura2
%% Nou algorisme que reescriu una array basat en epfadict.ps
%% igual que espiapaq_fura2 pot fer tota mena d'arrays recursius (per més que n'hi hagin!)
%% pero ara gestiona molt millor la VM i les arrays gegants
/espiapaq_fura3
{
%% fem el diccionari on definirem els objectype, així evitem treballar amb els if recursius
<<
%% és un paquet ...
/arraytype
{
%% exch dup AraBorro exch undef % dono de baixa l'element
%% donem de baixa un element cada vegada (cal saber el seu índex) marcant-lo amb un null
/iAo 0 def %% índex general del paquet original
AraBorro_A
{ %% forall
iAo iKill eq
{
AraBorro_A iAo %%null
mark put
pop
} %% si és l'element que hem de matar, doncs el matem
{
pop
}ifelse
iAo 1 add /iAo exch def
}forall
Objected'Ara ([) writestring %% escrivim l'inici del paquet
iPaq 1 add /iPaq exch def %% comptador d'índex pel proper paquet
%% ampliem l'array de paquets a 1 més i reincrustem l'anterior
Apaq length 1 add array dup Apaq 0 exch putinterval /Apaq exch def
Apaq exch iPaq exch put % incrustem el paq que ventem a la darrera posicio
%% purguem els nulls d'AraBorro que hi hagin
/iKill 0 def %% l'índex a matar
{ %% loop
/iAo 0 def %% índex general del paquet original
/iAr 0 def %% índex general del paquet a repicar
AraBorro_A
iKill get %%null
mark eq
{
AraBorro_A dup length 1 sub array
/laNova exch def %% el paquet repicat sempre tindra n-1 elements
{ %% forall
iAo iKill eq
{
pop
iAr 1 sub /iAr exch def
} %% si és l'element que hem de matar, doncs el matem
{
laNova exch iAr exch put
} %% la resta els repiquem a laNova
ifelse
iAo 1 add /iAo exch def
iAr 1 add /iAr exch def
}forall
laNova /AraBorro_A exch def
iKill 1 sub /iKill exch def %% comptador per saber l'índex a matar
}if
iKill 1 add /iKill exch def %% comptador per saber l'índex a matar
AraBorro_A length /maxLoop exch def %% quan sortim
iKill maxLoop ge {exit} if
}loop
%% fi del purgat de nulls
Apaq iPaq 1 sub AraBorro_A put %% incrustem el paquet còpia, purgat a la posició anterior
/NohApaq false def
Apaq iPaq get /AraVento_A exch def
AraVento_A dup length array copy /AraBorro_A exch def exit
}
%% és un enter ...
/integertype
{
%% fix per a tots els objectes
%% donem de baixa un element cada vegada (cal saber el seu índex) marcant-lo amb un null
/iAo 0 def %% índex general del paquet original
AraBorro_A
{ %% forall
iAo iKill eq
{
AraBorro_A iAo %%null
mark put
pop
} %% si és l'element que hem de matar, doncs el matem
{
pop
}ifelse
iAo 1 add /iAo exch def
}forall
%% fix x a tots els objectes
256 string cvs
}
%% és un booleni ...
/booleantype
{
%% fix per a tots els objectes
%% donem de baixa un element cada vegada (cal saber el seu índex) marcant-lo amb un null
/iAo 0 def %% índex general del paquet original
AraBorro_A
{
iAo iKill eq
{
AraBorro_A iAo %%null
mark put
pop
} %% si és l'element que hem de matar, doncs el matem
{
pop
}ifelse
iAo 1 add /iAo exch def
}forall
%% fix per a tots els objectes
6 string cvs
}
%% és un real ...
/realtype
{
%% fix per a tots els objectes
%% donem de baixa un element cada vegada (cal saber el seu índex) marcant-lo amb un null
/iAo 0 def %% índex general del paquet original
AraBorro_A
{
iAo iKill eq
{
AraBorro_A iAo %%null
mark put
pop
} %% si és l'element que hem de matar, doncs el matem
{
pop
}ifelse
iAo 1 add /iAo exch def
}forall
%% fix per a tots els objectes
10000 mul truncate 10000 div
256 string cvs
}
%% és una cadena ...
/stringtype
{
%% fix per a tots els objectes
%% donem de baixa un element cada vegada (cal saber el seu índex) marcant-lo amb un null
/iAo 0 def %% índex general del paquet original
AraBorro_A
{ %% forall
iAo iKill eq
{
AraBorro_A iAo %%null
mark put
pop
} %% si és l'element que hem de matar, doncs el matem
{
pop
}ifelse
iAo 1 add /iAo exch def
}forall
%% fix per a tots els objectes
%% salvaparent2.ps
%% de com reescriure una string per solucionar el problema de no deixar-nos
%% el backslash \ i els parèntesi () sense el \ que els marca com a caràcters
%% adaptat de l'algorisme NRMLTZDR2.ps del cercador de pal·líndroms TURURUT2
/fora
[ %% paquet de caràcters a cercar
(\134) %% \
(\050) %% (
(\051) %% )
] def
/FAfora 3 def %% pestell de sortida del loop
/foraX
[ %% paquet de substitució del caràcter
(\\\\)
(\\\()
(\\\))
] def
/ifora 0 def %% índex de fora
%% aquí la cadena a reescriure correctament
%%(el primer \\\)el segon\\\( el tercer \)\(el quart i el cinque\(\))
mark exch
{ %% loop general
{ %% loop cerca/substitució de caràcters
fora ifora get search
{
exch pop
dup length dup 2 add string dup 3 -1 roll foraX ifora get putinterval
dup 3 -1 roll 0 exch putinterval
}
{
exit
}ifelse
exch
}loop
%% aquest loop capgira tots els elements trobats a la pila mentre n'hi hagi més d'un
counttomark 1 gt
{
counttomark /atura't exch def
/ici 2 def
{ %% loop
ici -1 roll ici 1 add /ici exch def ici atura't gt {exit} if
}loop
{ %% loop empalmador de les cadenes trobades en 1 sola
dup length dup 3 index length add string dup 4 -1 roll
0 exch putinterval dup 3 -1 roll 4 -1 roll putinterval
counttomark 1 eq {exit} if
}loop
}if
ifora 1 add /ifora exch def
FAfora ifora eq {exit}if
}loop
exch pop %% eliminem la mark
%% fi de salvaparent2.ps
%% posem els caràcters ( ... ) com a cadena
dup length dup /lAstC exch def 2 add string dup 0 (\() putinterval
dup 3 -1 roll 1 exch putinterval dup lAstC 1 add (\)) putinterval
}
%% és un literal ...
/nametype
{
%% fix per a tots els objectes
%% donem de baixa un element cada vegada (cal saber el seu índex) marcant-lo amb un null
/iAo 0 def %% índex general del paquet original
AraBorro_A
{
iAo iKill eq
{
AraBorro_A iAo %null
mark put
pop
} %% si és l'element que hem de matar, doncs el matem
{
pop
}ifelse
iAo 1 add /iAo exch def
}forall
%% fix per a tots els objectes
128 string cvs
dup length 16 eq
{
dup 10 get 95 eq %% ens assegurem que el caràcter central sigui un _
{ %% reconstruim les tres dades originals de referència indirecte d'objecte (# # R)
(_) search pop exch pop exch
{ %% loop
(_) search {pop pop}{(R) exit}ifelse
}loop
3 -1 roll Objected'Ara exch writestring Objected'Ara ( ) writestring exch
Objected'Ara exch writestring Objected'Ara ( ) writestring %% deixem la (R) per cua de l'algorisme
}
{ %% posem el caràcter / per la clau literal
dup length 1 add string dup 0 (/) putinterval dup 3 -1 roll 1 exch putinterval
}ifelse
}
{ %% posem el caràcter / per la clau literal
dup length 1 add string dup 0 (/) putinterval dup 3 -1 roll 1 exch putinterval
}ifelse
} %% tots aquest tipus els posa el seu valor en una cadena de text i després en un paquet
%% és un diccionari ...
/dicttype
{ %% aquí cridem l'espiadic_fura2 i deixem una string buida per que no peti
%% fix per a tots els objectes
%% donem de baixa un element cada vegada (cal saber el seu índex) marcant-lo amb un null
/iAo 0 def %% índex general del paquet original
AraBorro_A
{ %% forall
iAo iKill eq
{
AraBorro_A iAo %null
mark
put
pop
} %% si és l'element que hem de matar, doncs el matem
{
pop
}ifelse
iAo 1 add /iAo exch def
}forall
%% fix per a tots els objectes
Objected'Ara (<<) writestring
/salva'l save def espiadic_fura2 salva'l restore ()
Objected'Ara (>>) writestring
%% el diccionari que quedaria a l'stack seria el presumible culpable
%% del null de més que sempre sortia a la cua del l'array
%% però realment ara integrat a Rustec ... hi queda?
%% deixem aquest codi com a test temporal per comprovar-ho
%%count 1 ne {exch dup type /dicttype eq {pop (... Hi ha el Dic dels Nulls!!)==}{exch}ifelse}if
%% si veiem que amb molts tests no hi surt l'eliminarem ...
}
%% és un null ...
/nulltype
{
%% fix per a tots els objectes
%% donem de baixa un element cada vegada (cal saber el seu índex) marcant-lo amb un null
/iAo 0 def %% índex general del paquet original
AraBorro_A
{ %% forall
iAo iKill eq
{
AraBorro_A iAo %%null
mark put
pop
} %% si és l'element que hem de matar, doncs el matem
{
pop
}ifelse
iAo 1 add /iAo exch def
}forall
%% fix per a tots els objectes
pop (null)
}
>> /furaP exch def
/AraVento_A exch def %% pesquem el paquet
Objected'Ara ([) writestring %% escrivim l'inici del paquet
/iPaq 0 def %% índex de paquets a incrustar a l'array Apaq
/NohApaq true def %% és imprescindible que comenci amb true?
%% la idea es fer una array dels paquets que anem ventant (còpies no vinculades)
%% l'array anirà creixent a mida que anem entrant a paquets més interns
%% i d'aquestos anirem eliminant els elements ventats a mida que els anem ventant
%% fent-ne l'actualització/eliminació del array quan convingui
/Apaq 1 array def %% paquet amb els arrays que anem ventant
%% deixem el paquet a trams a l'stack
%% aquest algorisme extrau trams d'un paquet en funció de la variable rAng
%% sempre que rAng<maxA, si no, extrau tota l'array de forma intacte
/rAng 13 def %% mida del tram a extraure, és la millor que hem trobat per una array al màxim!
/iRay 0 def %% índex dinàmic d'inici d'extracció del tram
mark %% pel counttomark!
AraVento_A %% paquet a tractar
dup length /maxA exch def %% mida del paquet
maxA rAng lt %% la capacitat del paquet és més petita que el tram a extraure?
{
iRay maxA getinterval %% extraiem el paquet de forma intacte
}
{
{ %% loop
dup iRay rAng getinterval exch %% extraiem el paquet
iRay rAng add /iRay exch def %% actualitzem l'índex dinàmic d'inici d'extracció del tram
%% si queda per extraure una quantitat menor que rAng, l'agafem com a darrer valor
maxA iRay sub rAng lt {maxA iRay sub /rAng exch def}if
maxA iRay le
{
pop exit
}if %% si la capacitat del paquet és més petita o igual que l'índex dinamic, sortim
}loop
}ifelse
%% fi de deixar el paquet a trams a l'stack
%% aquest loop capgira tots els elements trobats a l'stack
counttomark dup 1 gt
{ %% capgirem sempre que hi hagi més d'un paquet
/atura't exch def
/ici 2 def
{
ici -1 roll ici 1 add /ici exch def ici atura't gt {exit} if
}loop
%% per eliminar la mark
atura't 1 add -1 roll pop
}
{
pop exch pop /atura't 1 def
}ifelse
%% ara ho farem amb un repeat en comptes d'un loop
atura't
{ %% repeat de llegir l'array per trams
/AraVento_A exch def
%% AraVento i AraBorro són variables que s'aniran alternant el paquet intern d'esborrat
%% de les dades a mida que es vagin ventant
AraVento_A dup length
dup 0 eq
{
pop pop
%1 array
0 array
%% quan és una simple array buida no hi podem posar un null doncs p.e. al PDF 21KX75.pdf
%% (d'Esko!) es dóna la curiositat que al dic 28 0 obj (una mena de Shading Pattern crec)
%% l'entrada /Bounds ha d'estar buida [] i si duia [null] no donava error però l'Acrobat
%% no visualitzava res!
}
{
array copy
}ifelse %% filtre per arrays buides
/AraBorro_A exch def
save /salva'm exch def
{ %% loop 1
{ %% loop 2
/iKill 0 def %% inicialitzem l'índex a matar
AraVento_A
{ %% forall
%% aquí interroguem l'objecte i tibem el seu type de la definició del dic furaP
dup type furaP exch get exec
Objected'Ara exch writestring
Objected'Ara %%dup
( ) writestring %%flushfile
%% fi d'escriptura del valor i esbrinat de la mena
iKill 1 add /iKill exch def %% comptador per saber l'índex a matar
}forall
NohApaq {exit}if %% sortim si a l'array més allunyat ja no en niua cap més
/NohApaq true def %% cada vegada que acabem de ventar un array ...
}loop % 2
%% purguem els nulls d'AraBorro que hi hagin
/iKill 0 def % l'índex a matar
{ %% loop
/iAo 0 def %% índex general del paquet original
/iAr 0 def %% índex general del paquet a repicar
AraBorro_A
%% filtre per arrays buides
%% sense aquest filtre el cas l'objecte 9 0 del fitxer H200205081001000JAI.pdf
%% dóna un error típic d'array buida ...
%% [ Error: rangecheck; OffendingCommand: get ] %% Stack: 0 []
dup length 0 eq
{
pop Apaq length 0 eq
{
1 array /Apaq exch def
}if
exit
}if
iKill get %%null
mark eq
{
AraBorro_A dup length 1 sub array
/laNova exch def %% el paquet repicat sempre tindrà n-1 elements
{ %% forall
iAo iKill eq
{
pop
iAr 1 sub /iAr exch def
} %% si és l'element que hem de matar, doncs el matem
{
laNova exch iAr exch put
} %% la resta els repiquem a laNova
ifelse
iAo 1 add /iAo exch def
iAr 1 add /iAr exch def
}forall
laNova /AraBorro_A exch def
iKill 1 sub /iKill exch def %% comptador per saber l'índex a matar
}if
iKill 1 add /iKill exch def %% comptador per saber l'índex a matar
AraBorro_A length /maxLoop exch def %% quan sortim
iKill maxLoop ge {exit} if
}loop
%% fi del purgat de nulls
Apaq iPaq AraBorro_A put %% incrustem el paquet acabat de ventar i purgat a la darrera posició
%% eliminem enrera els paquets buits i reconstruim Apaq a la mida justa per continuar el ventat
%% només sortirem quan Apaq estigui a 0
{ %% loop
Apaq iPaq get length 0 eq %% quan trobem un array que no és a 0 sortim del purgat d'Apaq
{
Apaq length 1 sub Apaq exch 0 exch getinterval /Apaq exch def
Apaq length 0 eq {exit} if
%% aquí la cua del paquet
Objected'Ara %%dup
(]) writestring %%flushfile % escrivim la cua del paquet
}
{
exit
}ifelse
iPaq 1 sub /iPaq exch def
}loop
Apaq length 0 eq {exit} if %% pleguem ?
Apaq iPaq get /AraVento_A exch def %% agafem el darrer array no zero per continuar el ventat
AraVento_A dup length array copy /AraBorro_A exch def %% en fem la còpia pel purgat
}loop %% 1
salva'm restore
%%counttomark 0 eq {pop exit}if % sortim quan ja no hi hagi cap paquet a l'stack
%%dup type /arraytype ne {exit}if
} %% ara no loop
repeat
Objected'Ara %%dup dup
(]\015) writestring %%EOL writestring flushfile % escrivim el final del paquet
} bind def
%% fi de l'algorisme que reescriu un paquet espiapaq_fura3
%% fi dels algorismes espia#
nomDAT dup length dup /DATfa exch def 4 add string dup 3 -1 roll 0 exch putinterval %% primer farcit
dup DATfa (.B42) putinterval dup /B42 exch def print flush (\n\n) print flush
pathDAT dup length DATfa sub dup /faPath exch def 0 exch getinterval dup length DATfa add 4 add string
dup 3 -1 roll 0 exch putinterval dup faPath B42 putinterval
(w) file /Objected'Ara exch def %% escriurem el .B42 al mateix directori que el .DAT
/B42dic 12 dict def %% diccionari amb totes les dades del caràcter
%% desem les dades
B42dic
dup /glif glif put %% array literal del procediment que dibuixa el glif (en coordenades caràcter)
dup /DAT nomDAT put %% nom del .DAT utilitzat
dup /UliniaDbase oCar put %% nombre d'unitats matriu (1/5 de SubMòdul) que situen la línia de base (inici del glif), des de l'inici del Mòdul Tipogràfic (àrea blava) UliniaAscendent - UliniaDbase = Mòdul m
dup /Modul:5 UnQuintUaSumar put %% valor de la unitat matriu (5 unitats matriu = 1 SubMòdul)
dup /fMd factorMultiplicadorDescala put %% factor multiplicador d'escala que adapta les coordenades caràcter de /glif a les mides escalades de /Caixa, /OglifS i al valor de /Modul:5
dup /Origen Origen put %% array amb l'X,Y (en coordenades caràcter) de correcció dels valors de les coordenades de /glif per situar l'orígen del caràcter a la línia de base
dup /Caixa Caixa put %% array amb l'X,Y del valor del Mòdul Tipogràfic (caixa del caràcter)
%% aquí es on posarem el valor de l'orígen del glif següent
dup /OglifS
[
OglifSeguent null eq %% no és significatiu?
{ %% agafarà el valor X de /Caixa
Caixa 0 get
}
{ %% el punt d'inici del caràcter següent és diferent al valor X de /Caixa
OglifSeguent
}ifelse
] put %% array amb el punt d'orígen del següent glif
dup /UliniaAscendent 33 put %% nombre d'unitats matriu que marquen la línia de l'ascendent des de l'inici del Mòdul Tipogràfic (caixa del caràcter) UliniaAscendent - UliniaDbase = Mòdul m
dup /Caracter
[
%% posem el nombre en base vuit dins una cadena per que a l'escriure's quedi amb la notació correcte
(\\000) dup B8Lletra dup length 4 exch sub exch putinterval %% string amb l'octal (Latin 1)
nomLletra %% string amb el nom intern del caràcter
] put
%% escrivim el contingut del diccionari al fitxer
Objected'Ara (<<) writestring %% obrim el diccionari
/salva'l save def espiadic_fura2 salva'l restore
Objected'Ara (>>) writestring %% tanquem el diccionari
}if %% escrivim el fitxer .B42 ?
(\n\n ... FET !\n\n\n) print flush