[VERY-LONG] Bounding boxy opet

Pavel Janik ml. Pavel.Janik at inet.cz
Thu Jan 6 01:13:49 CET 2000


[ Tento mail je ponekud delsi, v nekterych castech je urcen spise pro lidi,
kteri spi s TeX Book (ci spise TeX The Program), BlackBook a od pulnoci i s
RedBook pod polstarem. Pokud jste tyto knihy nikdy nevidel/a, nebo nevite o co
jde, nezoufejte a zkuste si tento mail take precist. Pokud bych jej mel
shrnout, tak je o tom, jak jsem stravil neuveritelne chvilky tim, ze mi
nasledujici soubor nezobrazi to, co bych si predstavoval:

--- cut here ---
\nopagenumbers\font\Anna=Anna at 20cm\Anna
\def\fbox#1{\vbox{\hrule\hbox{\vrule#1\vrule}\hrule}}\fbox{A}\bye
--- cut here ---

Tento mail take navazuje na muj dotaz (a nasledujici diskusi) o tom, zda jde
v Metapostu (jakymkoli zpusobem, nejen pomoci btex a etex) ziskat opsany
ramecek jakemukoli textu (samozrejme obecne a nikoli pro jeden predem
definovany retezec).

Nektere nazory nize uveden se vam jiste nebudou libit, ale ja uz jsem
takovy. Pokud se mi neco nelibi, tak to proste reknu! ]

Zdravim,

dnes vecer jsem stravil zajimave chvilky nad bounding boxy. Sel jsem na to
uplne od nuly :-))

1. Vzal jsem prvni Type1 font, ktery mi lezel na disku - je jim Anna.pfb (ITC
   Anna, verze 001.000).

2. udelal jsem z nej pfa, abych jej mohl vlozit do EPS.

3. Podival jsem se do jeho originalni metriky na pismenko A:

       C 65 ; WX 389 ; N A ; B -25 0 334 722 ;

   Tedy znak A ma bounding box {(-25,0),(334, 722)}. Jeho sirka je ovsem 389
   bodu, coz nam dava (389-(334+25)=30) 30 bodu navic (uvidime kde se
   objevi...).

   Pro jistotu jsem si zkusil vygenerovat AFM z pfb pomoci printafm z gs:

       C 65 ; WX 389 ; N A ; B -25 0 334 722 ;

   Na vlas stejne hodnoty. U jinych pismen jsou rozdily maximalne jeden ci dva
   body.

4. Rucne jsem si vytvoril maly pokusny eps soubor:

--- cut here ---
%!PS-Adobe-2.0 EPSF-1.2
%%Creator: Pavel by hand :-))
%%BoundingBox: -25 0 334 722

%!PS-AdobeFont-1.0: Anna 001.000
... <vynechano - zde byl Anna.pfa>
cleartomark

/Anna findfont
1000 scalefont setfont
0 0 moveto
(A) show

-25 0 334 722 setbbox
-25 0 moveto
334 0 lineto
334 722 lineto
-25 722 lineto
closepath

stroke
--- cut here ---

   Kdyz se na tento soubor podivam pomoci ghostview, vidim presne to co chci -
   opsany ramecek pismenu A. Opravdu opsany, zadne mezery vlevo ci
   vpravo. Font je tedy v poradku, bounding box je opravdu bounding boxem.

4. Jen pro informaci jsem se podival, jak je A vlastne nakresleno v Type1
   fontu (pomoci t1disasm):

/A {
        -25 389 hsbw
        84 callsubr
        80 callsubr
        endchar
        } |-

   hsbw nastavi rasterizer na (-25, 0) a nastavi sirku znaku na 389 (viz vyse,
   dokumentace k Type1 existuje v PDF volne na Internetu).

   Procedura 84 pouze vola dalsi procedury definujici jak horizontalni, tak
   vertikalni hinty. No a protoze nemam zase tak dobrou pamet, abych si
   pamatoval vsech 170 procedur tohoto fontu a pak si jeste dokazal v hlave
   vyrastrovat pismeno A, tak jsem si opet pomohl berlickou - ghostscript (ja
   mam 5.99, ale jiste i starsi verze) obsahuje soubor showchar.ps, ktery
   ukaze zadane pismeno vyrastrovane i s kontrolnimi body. Viz soubor
   showchar.ps v archivu, ktery mohu zverejnit spolecne s timto textem. A
   potom jsem jiz pokracoval podle programu pro A a nejvyssim bodem je bod s
   y-ovou souradnici 722 jak dokazuje i vyse uvedeny eps soubor! Nyni tedy
   vime, ze font opravdu obsahuje pismeno A, jeho bbox je korektni, tedy
   opsany obdelnik a jeho sirka je o 30 bodu sirsi nez pismeno samo.

5. Vygeneroval jsem si tfm pomoci afm2tfm a pak tftopl:

...
(CHARACTER C A
   (CHARWD R 0.389)
   (CHARHT R 0.711)
   )
...

   Tady jsem se zarazil podruhe - kde se nam ztratilo onech jedenact bodu
   (722-711=11)??? A opravdu, kdyz TeXu dam

\nopagenumbers
\font\Anna=Anna at 20cm\Anna
\def\fbox#1{\vbox{\hrule\hbox{\vrule#1\vrule}\hrule}}
\fbox{A}
\bye

   a pote prevedu do ps pomoci dvips, tak mne prekvapi krasne A, ktere
   presahuje bbox vlevo i nahore.

   Zkusil jsem jeste dat metapostu:

prologues:=1;

verbatimtex
\font\Anna=Anna at 20cm\Anna
etex

beginfig(1);
draw btex A etex;
draw bbox btex A etex;
endfig;
end

   A pote upravit vysledny soubor tak, ze jsem mu vnutil PFA a zrusil makro
   fshow tak, aby se pouzil font Anna. Vysledek je naprosto totozny s
   vysledkem TeXu (samozrejme po nastaveni promenne bboxmargin na nulu misto
   implicitnich dvou bodu, ale to se dalo predpokladat). Problem tedy vznika
   pri generovani metriky pro TeX. Problem v tftopl byt nemuze. Proc?

   a. SnowWhite:/home/pavel$ head -1 /tmp/tftopl.web
      % This program by D. E. Knuth is not copyrighted and can be used freely.
      SnowWhite:/home/pavel$

      Protoze jeho autorem je D.E. Knuth :-)

   b. TeX vidi tytez rozmery a v TeXu snad chyba neni :-)

   Byl jsem dosti zoufaly a tak jsem zamiril primo do zdrojoveho textu
   afm2tfm. Vzal jsem jej z teTeX-1.0, pridal k nemu dva soubory, ktere
   potreboval, a prelozil. (Hned jsem v nem nasel chybne osetreni parametru
   prikazove radky kdyz jsem omylem za -v nezadal argument a tak jsem poslal
   bug-report, ale o tom ted nechci psat).

   Problem opravdu vznika v afm2tfm, kdy se pri zapisu vysky znaku A zapise
   odkaz na 11. prvek v poli vysky znaku a to je opravu 711 a nikoli 722.

   Mimochodem s .tfm soubory si clovek opravdu uzije:

   SnowWhite:/home/pavel/Tmp$ file Anna.tfm
   Anna.tfm: SVR2 pure executable (Amdahl-UTS) not stripped - version 655121807
   SnowWhite:/home/pavel/Tmp$ file /tmp/qsr17.tfm
   /tmp/qsr17.tfm: 3b20 COFF executable not stripped
   SnowWhite:/home/pavel/Tmp$

   Prikaz file slouzi pro identifikaci souboru, napr.:

   SnowWhite:/home/pavel/Tmp/q/afm2tfm$ file /tmp/1.eps
   /tmp/1.eps: PostScript document text conforming at level 2.0 - type EPS
   SnowWhite:/home/pavel/Tmp/q/afm2tfm$

   A opet pokracuji. Nasel jsem kod, kde je problem v afm2tfm:

   if (nh > 16) {
      remap(height, nh, 16) ;
      nh = 16 ;
      for (i=bc; i<=ec; i++)
         if (0 != (ai=adobeptrs[i]))
            ai->hptr = unsort[ai->hptr] ;
   }

   Tento usek kodu dela nasledujici. TFM obsahuje pole vysek (jmenuje se
   height, viz TFtoPL paragraf 9) o nh prvcich. Tento kod, pokud je nh > 16,
   upravi pocet vysek na 16 a upravi odkazy do tohoto pole (cimz vlastne
   zaokrouhli vysky). Opravdu skvele... Kdyz se clovek podiva do TeX The
   Program, tak tam Knuth pise:

   |nh|&number of words in the height table;\cr
   ...
   They are all nonnegative and less than $2^{15}$.
   ...

   Ano, zatim neni duvod proc nh omezovat na 16. Avsak nize:

   \hang second byte: |@!height_index| (4 bits) times 16,

   Tedy neco v tom smyslu, ze height_index (ktery mimochodem musi byt mensi
   nebo roven nh) ma k dispozici pouze 4bity, tj. 0x00-0x0f, tj. max. 16
   hodnot. Pokud tedy obsahuje font vice nez 16 ruznych vysek, tak je afm2tfm
   proste a jednoduse zaokrouhli a nic nam ani nerekne. No dobra. Zkusil jsem
   tedy kod zakomentovat, prekompilovat afm2tfm a vytvorit .tfm. Ten je
   samozrejme spatny, ale to nam nic nebrani v tom si jej prevest do .pl,
   chyby odstranit :-)) a vratit zpet (stacilo mi odmazat definici informaci
   pro dva znaky). Zkusil jsem tedy opet znovu tex a pote dvips a ejhle, horni
   presah je jiz v poradku...

   Zbyva jeste presah levy, ale ten si jiz necham na zitrek :-( Dobrou noc a
   hezke sny. Ja tedy mam opravdu nad cim premyslet. V prubehu prace na sve
   diplomove praci jsem jiz narazil na nejmene pet duvodu, proc nepouzivat
   TeX, Metapost a spol. a opravdu zacinam verit ve smysl projektu jako Omega
   a NTS. TeX byl dobre navrzeny ve sve dobe, ale podle meho skromneho nazoru
   je nyni jiz zastaraly (resp. obsahuje az prilis mnoho omezeni, ktera je
   potreba obchazet). Ale co je na tom nejhorsi? Ze lepsiho programu neni :-((

P.S. Pri teto praci jsem vygeneroval asi 230kB dat, pokud se na ne chcete
podivat, mohu je dat k dispozici. Samozrejme az rano, abych nekrmil
spolecnost, ktera si jako snad jedina v teto zemi muze uplne klidne dovolit
zmenit si sve jmeno a nechat to zaplatit nas, danove poplatniky :-))

P.P.S. Kdo prvni odpovi cim je zpusoben levy presah (podobne polopaticky, tedy
ne neco jako "souvisi to s referencnim bodem a chybejicimi 30 body"), ma u mne
CD s Red Hat Linux CZ 6.1 (nebo drink, podle uvazeni). Neni to bezchybny
operacni system, ale lepsi neni!
--
Pavel Janík ml.
Pavel.Janik at inet.cz




More information about the csTeX mailing list