Bilder mit MetaPost erstellen und einbinden

MetaPost ist eine Programmiersprache, mit der man Grafiken erstellen kann. So erzeugt man beispielsweise aus folgendem Programmcode:

beginfig(1)
    for a=0 upto 9:
      draw (0,0){dir 45}..{dir -10a}(6cm,0);
    endfor
endfig;

diese Grafik:

mp first

MetaPost im speedata Publisher

Die Idee ist nun, diese Bilder auch im speedata Publisher nutzen zu können. Dazu definiert man erst eine Grafik und benutzt sie später bei dem Box-Befehl:

<Layout
    xmlns="urn:speedata.de:2009/publisher/en"
    xmlns:sd="urn:speedata:2009/publisher/functions/en">

    <!-- beginfig() ... endfig nicht notwendig -->
    <DefineGraphic name="dottedbox">
      pickup pencircle scaled 1mm;
      draw (0,0) -- (box.width,0) -- (box.width, box.height) --
        (box.width, box.height) -- (0, box.height ) -- cycle
        dashed withdots withcolor 0.7red ;
    </DefineGraphic>

    <!-- dasselbe, nutzt aber den vordefinierten Pfad box: -->
    <DefineGraphic name="dottedboxsimple">
        pickup pencircle scaled 1mm;
        draw box dashed withdots withcolor 0.7red ;
    </DefineGraphic>

    <Record element="data">
        <PlaceObject row="1" column="1">
            <Box height="2" width="5" graphic="dottedbox" />
        </PlaceObject>
    </Record>
</Layout>

Die Breite der Box und die Höhe der Box sind mit den Variablen box.width und box.height in MetaPost definiert. Damit kann man die Grafik an die Vorgaben im Publisher anpassen.

mp dotted
Die gepunkteten Linien entsprechen den Vorgaben der Box. Die Rasterdarstellung wurde eingeschaltet, damit das sichtbar wird.

Alternativ kann die Grafik auch bei dem <Image> Befehl aus einer Datei mit der Endung .mp geladen werden.

Koordinaten

Der Ursprung des Koordinatensystems liegt in der linken unteren Ecke der Box, positive Werte gehen also in die Richtung rechts und oben.

Variablen

Es können mit <SetVariable> Variablen für MetaPost gesetzt werden.

<SetVariable
    variable="curcol"
    type="mp:rgbcolor"
    select="'colors.mycolor'"/>

Die Zuweisung wird zu Beginn des MetaPost-Kontexts ausgewertet. Damit steht curcol am Anfang der Grafiken zur Verfügung.

Vordefinierte Werte

  • Alle Farben, die im Layout definiert werden, können mit dem Präfix colors. in MetaPost benutzt werden:
    <DefineColor name="mycolor" value="#FF4E00"/>
    
    <DefineGraphic name="dots">
        pickup pencircle scaled 3mm;
        for i=0 upto 3:
            draw (i * 1cm, i * 1cm) withcolor colors.mycolor ;
        endfor;
    </DefineGraphic>
    
    <Record element="data">
        <PlaceObject row="1" column="1">
            <Box height="5" width="1" graphic="dots" />
        </PlaceObject>
    </Record>
  • CSS Level 3 Farben sind im RGB-Farbraum vordefiniert.
  • Die Breite und Höhe der umgebenden Fläche können mit box.width und box.height abgefragt werden.
  • Der Pfad box ist für die Außmaße der Fläche definiert (siehe das Beispiel oben).
  • Hans Hagens Metafun-Makros sind teilweise eingebunden.
  • Bei Seitentypen stehen zusätzlich folgende Variablen zur Verfügung:
    Variable Beschreibung
    page.width Seitenbreite
    page.height Seitenhöhe
    page.margin.left Rand links
    page.margin.right Rand rechts
    page.margin.top Rand oben
    page.margin.bottom Rand unten
    page.trim Beschnittzugabe

Text in MetaPost

sptext("Hello, world!","text","regular")

Die Argumente sind folgende: der zu druckende Text, die Schriftfamilie und der Schnitt, wobei die möglichen Werte für Schnitt folgende sind: regular, bold, italic und bolditalic.

Beispiel in der Nutzung von Label:

label.top(sptext("origin","text","regular"),(0,0));

Alternativ zu diesem »langen« Makro gibt es auch die kurze Variante:

defaultfontfamily := "mptext";
defaultfontstyle := "bold";

draw txt("Hello, world!");

Gibt den Text in der Variante Fett der Familie mptext aus.

Transparenz

Um einen Transparenzeffekt zu nutzen, kann man eine Farbangabe mit withalpha um einen Faktor ergänzen. Dieser liegt zwischen 0 (unsichtbar) und 1 (voller Farbauftrag).

fill box scaled 0.5 shifted (-20,-20);
fill box withcolor rebeccapurple withalpha 0.6;

Verfügbare Makros (mit Beispielen)

Die in dem Format »plain« enthaltenen Makros sind im speedata Publisher enthalten. Daneben noch folgende (tlw. aus MetaFun).

Verschiebungen etc.

xshifted, yshifted

Verschiebung in einer Richtung.

draw unitsquare xshifted 3cm;
xyscaled

Skalierung mit unterschiedlichen Werten

draw unitsquare xyscaled (2cm,5cm);
randomshifted

Verschiebung mit zufälligen Werten

draw unitsquare randomshifted (2cm,5cm);
superellipsed

Transformation zu einer »Superellipse«

draw box superellipsed 0.9;
roundedsquare

Rechteck mit abgerundeten Ecken

draw roundedsquare(box.width,box.height,.25cm);
withalpha

Veränderung des Farbauftrags (1.0 = voller Farbauftrag, 0 = kein Farbauftrag)

fill unitsquare withalpha 0.7;
randomized

Veränderung verschiedener Objekte um einen bestimmten Wert.

draw box randomized 2cm;

Pfade

box

Rechteck mit der Seitenlänge aus dem Layout.

draw box;

Bildbefehle

drawdot

Zeichnet einen Punkt an eine bestimmte Stelle.

drawdot origin;
spcolor

Wählt eine Farbe aus den vordefinierten Farben aus. Kann nur mit withcolor benutzt werden. Der Unterschied zu den Farben aus colors. ist, dass der Farbraum erhalten bleibt.

fill box withcolor spcolor("mycolor");

Text

sptext

Text mit Angaben zur Schriftart und der Variante. Die möglichen Werte sind unter defaultfontfamily und defaultfontstyle beschrieben.

draw sptext("Hello","text","bold");
txt

Text, der die Voreinstellungen defaultfontfamily und defaultfontstyle nutzt.

Optionen

defaultfontfamily

Font-Familie, die bei txt() benutzt wird. Die Familie muss zuvor im Layout definiert worden sein.

defaultfontstyle

Font-Stil, der bei txt() benutzt wird. Mögliche Stile: regular, bold, italic, bolditalic.

MetaPost Ressourcen

Es gibt eine Reihe englischer Handbücher und Tutorials für MetaPost: