von Patrick Gundlach |

Arbeiten mit Maßeinheiten

Der speedata Publisher kennt zwei unterschiedliche Modi beim Platzieren von Objekten.

  1. absolute Positionierung auf der Seite
  2. rasterbasierte bzw. relative Positionierung von Objekten

Die absolute Positionierung wird häufig benutzt um Logos und ähnliche fixe Seitenelemente auszugeben während die rasterbasierte Platzierung für Objekte gedacht ist, die fortlaufend auf der Seite ausgegeben werden müssen.

Die absolute Positionierung hat immer eine Maßeinheit anbei. So kann ein Objekt links oben bei Position (2cm, 2cm) ausgegeben werden. Die rasterbasierte Positionierung arbeitet mit den Zellen im (virtuellen) Seitenraster. Diese wird immer ohne Maßeinheit angegeben. Die erste Zelle links oben ist die Zelle (1,1).

Rechnen mit Maßeinheiten

Bleibt man innerhalb des Seitenrasters, ist die Berechnung von Positionen sehr leicht, da alles einfache Zahlen sind. Mit Maßeinheiten zu rechnen ist seit der Version 4.5.7 ebenfalls sehr einfach geworden. Wenn z.B. 12 Punkt zu 4cm addiert werden sollen, kann man direkt rechnen:

<Message select="4cm + 12pt" />

Das Ergebnis ist die Zeichenkette "8248100sp", ein Wert in der Basiseinheit scaled points (sp, siehe unten).

Konvertieren von Längeneinheiten

Mit der ebenfalls neuen Funktion sd:tounit() können Längeneinheiten von einer Einheit in eine andere konvertiert werden.

sd:tounit('pt','1in')

ergibt beispielsweise die Zahl 72, da ein Zoll 72 Punkt enthält. Ein drittes Argument kann noch angegeben werden. Das gibt an, auf wie viele Nachkommastellen das Ergebnis gerundet werden soll.

<!-- Ergebnis: 28.3468 -->
sd:tounit('pt','1cm',4)

Basiseinheit

Der speedata Publisher basiert auf dem Textsatzprogramm TeX, von dort ist die Basiseinheit sp übernommen. sp steht für scaled points und entspicht einem 65536tel Didot-Punkt. Ein Didot-Punkt enstpricht einem 72,27tel Zoll. In der DTP-Welt üblich ist aber die Umrechnung: 72 Punkt = 1 Zoll. Daher sind in einem Punkt 65781 scaled points. Diesen Wert braucht man gar nicht zu kennen, denn man kann mit den scaled points einfach rechnen wie mit jeder anderen Maßeinheit auch. Um die 4cm und die 12pt von oben zu addieren, kann man folgendes Konstrukt benutzen:

<SetVariable variable="a" select="sd:tounit('sp','4cm')"/>
<SetVariable variable="b" select="sd:tounit('sp','12pt')"/>
<!-- wichtig: a und b sind dimensionslose Zahlen und
     müssen daher um die korrekte Einheit ergänzt
     werden -->
<PlaceObject row="{ $a + $b }sp">
    ...
</PlaceObject>

Oder natürlich wie oben direkt über die Addition 4cm + 12pt.

Auf diese Weise lassen sich nun alle Rechenoperationen mit Maßeinheiten auf Rechenoperationen mit Zahlen reduzieren, was vieles vereinfacht.