Analytischer Font


%!PS-Adobe-1.0
%%Creator: Holger Gehringer
%%Title: Beispiel fuer analytischer Font
%%CreationDate: Mo, 23.11.1998
%%DocumentMedia: A4 595 842 0 () ()
%%Orientation: Portrait
%%Pages: (atend)
%%DocumentFonts: Times-Roman Helvetica
%%EndComments

% Das Programm demonstriert den Entwurf eines neuen Fonts mit analytisch (geo-
% metrisch) definierten Zeichen.

10 dict dup begin                % Dictionary fuer den Font. Muss Platz fuer
                                 % den FID-Eintrag enthalten.
  /FontType 3 def                % Typ 3 = benutzerdefinierter Font
  /FontMatrix                    % Die Matrix transformiert von den 1000 Einhei-
  [.001 0 0 .001 0 0] def        % ten des Zeichen-Koord.s. ins Benutzer-K.s.
  /FontBBox [50 0 760 700] def   % Bounding-Box aller Zeichen des Fonts
  /Encoding 256 array def
  0 1 255                        % Codierungsvektor wird zuerst mit .notdef
  { Encoding exch /.notdef put   % initialisiert.
  } for
  Encoding
  dup (a) 0 get                  % kleiner Punkt <-> Code des Buchstabens 'a'
  /SmallBullet put               % mittlerer Punkt <-> Code des Buchstabens 'b'
  dup (b) 0 get                  % u.s.w.
  /MediumBullet put
  dup (c) 0 get
  /LargeBullet put
  (d) 0 get /OpenBox put

  /Metrics 5 dict def            % Dictionary fuer die Dickten
  Metrics begin
    /.notdef 0 def               % Auch fuer .notdef muss ein Eintrag da sein
    /SmallBullet 400 def
    /MediumBullet 520 def
    /LargeBullet 640 def
    /OpenBox 820 def
  end

  /BBox 5 dict def               % Dictionary fuer die Bounding-Boxes
  BBox begin
    /.notdef [0 0 0 0] def       % Bounding-BOX fuer .notdef nicht vergessen
    /SmallBullet [50 200 350 500] def
    /MediumBullet [50 150 450 550] def
    /LargeBullet [50 100 550 600] def
    /OpenBox [60 0 760 700] def  % Bounding-BOX fuer OpenBox ist um die halbe
                                 % Strichstaerke (60/2 = 30) groesser als der
                                 %eigentliche Pfad.
  end

  /CharacterDefs 5 dict def      % CharacterDefs enthaelt Beschreibungen der
  CharacterDefs begin            % vier Zeichen
    /.notdef {} def              % Die Prozedur fuer .notdef tut nichts
    /SmallBullet                 % kleiner Punkt, zentriert um die halbe Versal-
    { newpath                    % hoehe (=700 Punkt).
      200 350 150 0 360 arc
      closepath fill
    } def
    /MediumBullet                % Mittelgrosser Punkt
    { newpath
      250 350 200 0 360 arc
      closepath fill
    } def
    /LargeBullet                 % Grosser Punkt
    { newpath
      300 350 250 0 360 arc
      closepath fill
    } def
    /OpenBox                     % Offenes Quadrat
    { newpath
       90  30 moveto
       90 670 lineto
      730 670 lineto
      730  30 lineto
      closepath
      60 setlinewidth
      stroke
    } def
  end

  /BuildChar                     % wird jedesmal aufgerufen, wenn ein Zeichen
  { 0 begin                      % dieses Fonts konstruiert werden muss.
      /Char exch def             % Der Zeichencode und das Font-Dictionary
      /FontDict exch def         % werden als Parameter uebergeben.
      /Charname FontDict         % Mit Hilfe des Codes wird der Name des
      /Encoding get Char get     % Zeichens ermittelt.
      def
      FontDict begin
        Metrics Charname get 0   % Dickte des Zeichens
        BBox Charname get        % Bounding-Box des Zeichens
   aload pop
        setcachedevice           % nimmt ein Zeichen in den Cache auf
        CharacterDefs            % Prozedur zur Konstruktion des Zeichens wird
        Charname get exec        % ausgefuehrt.
      end
    end
  } def
  
  /BuildChar load 0 3 dict put   % Lokaler Speicher fuer BuildChar
  /UniqueID 1 def                % UniqueID-Nummer fuer den Font
end

/BoxesAndBullets                 % Der Font wird unter dem Namen
exch definefont pop              % 'BoxesAndBullets' registriert.

/BBFont                          % Die folgenden Zeilen demonstrieren die
/BoxesAndBullets findfont        % Benutzung des neuen Fonts
16 scalefont def
/TextFont
/Times-Roman findfont
16 scalefont def

/SS                              % gibt String aus; bereitet Zeilenwechsel vor
{ 72 YLine moveto show
  /YLine YLine 16 sub def
} def

/ShowBulletText                  % Prozedur erlaubt, den gleichen Text, mit
{ /BulletChar exch def           % jeweils anderen Punkten zu Beginn, mehrfach
  BBFont setfont                 % auszugeben.
  BulletChar SS                  % Den Punkt im BBFont ausgeben
  TextFont setfont               % Auf TextFont umschalten
  
  ( Every bullet has its billet. \261 William III) show
  BBFont setfont
  BulletChar SS
  TextFont setfont
  ( The bullet that will kill me is not yet cast. ) show
  (\261 Napoleon I) show
  BBFont setfont
  BulletChar SS
  TextFont setfont
  ( The ballot is stronger than the bullet. ) show
  (\261 Abraham Lincoln) show
} def

%%EndProlog

%%Page: 1 1
/YLine 650 def                   % Dreimal der gleiche Text, jeweils mit Punkten
(a) ShowBulletText               % verschiedener Groesse
/YLine 550 def
(b) ShowBulletText
/YLine 450 def
(c) ShowBulletText

/YLine 300 def                   % Textbeispiel mit dem OpenBox-Zeichen als
TextFont setfont                 % Paragraph-Ende.
(Hieroglyphs are the roots of letters. All) SS
(characters were originally signs and all) SS
(signs were once images. Human society,) SS
(the world, man in his entirety is in the) SS
(alphabet.) SS
BBFont setfont
(d) show

showpage

%%Trailer
%%Pages: 1


Vorschau:

Download PostScript-File

© Holger Gehringer, Dezember 1998