codi font PS | ventaQVdat_011.ps v0.11 Beta | El Arte de Imprimir o La Biblia de 42 líneas

codi font PS | ventaQVdat_011.ps v0.11 Beta | El Arte de Imprimir o La Biblia de 42 líneas


 %!
 %# 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