Feature der Woche: Absatzformen
Es gibt zwei Befehle, Text auszugeben: PlaceObject/Textblock
und
Output/Text
. Die erste Variante über Textblock
erzeugt einen
rechteckigen Bereich, der nicht über mehrere Seiten umbrochen werden kann. Das
ist für Produktkataloge in der Regel ausreichend, für Fließtext aber nicht.
Ein Beispiel für die Ausgabe mit Textblock
(speichern als layout.xml
und Aufruf mit sp --dummy
) :
<Layout
xmlns="urn:speedata.de:2009/publisher/en"
xmlns:sd="urn:speedata:2009/publisher/functions/en">
<Pageformat width="180mm" height="50mm" />
<Record element="data">
<PlaceObject>
<Textblock>
<Paragraph>
<Value select="sd:dummytext()"></Value>
</Paragraph>
</Textblock>
</PlaceObject>
</Record>
</Layout>

Ausgabe über Textblock
Hier sind die einzigen Veränderungen über Textformate, Schriftart und Schriftfarbe möglich.
Jetzt neu: Ausgabe über Output/Text
Naja, nicht wirklich neu, aber bisher als experimentell betrachtet und nun langsam wird es stabil nutzbar.
Im Prinzip wird es benutzt wie Textblock:
<Layout
xmlns="urn:speedata.de:2009/publisher/en"
xmlns:sd="urn:speedata:2009/publisher/functions/en">
<Pageformat width="180mm" height="50mm" />
<DefineTextformat name="indent" indentation="1cm"/>
<LoadFontfile name="RedactedScript" filename="redacted-script-regular.ttf" />
<DefineFontfamily name="text" fontsize="10" leading="12">
<Regular fontface="RedactedScript"/>
</DefineFontfamily>
<Record element="data">
<Output>
<Text textformat="indent">
<Paragraph>
<Value select="sd:dummytext()"/>
</Paragraph>
</Text>
</Output>
</Record>
</Layout>

Ausgabe über Text mit Definition einer neuen Schriftart
Für alle weiteren Beispiele lagere ich die allgemeinen Definitionen aus in die Datei definitionen.xml
, die im selben Verzeichnis liegt wie die layout.xml
:
<Include xmlns="urn:speedata.de:2009/publisher/en">
<Pageformat width="180mm" height="50mm" />
<DefineTextformat name="indent" indentation="1cm"/>
<LoadFontfile name="RedactedScript" filename="redacted-script-regular.ttf"/>
<DefineFontfamily name="text" fontsize="10" leading="12">
<Regular fontface="RedactedScript"/>
</DefineFontfamily>
</Include>
und lade in der layout.xml
diese Datei.
<Layout
xmlns="urn:speedata.de:2009/publisher/en"
xmlns:sd="urn:speedata:2009/publisher/functions/en"
xmlns:xi="http://www.w3.org/2001/XInclude"
>
<Options show-grid="yes"/>
<xi:include href="definitionen.xml"/>
<Record element="data">
<PlaceObject column="13" row="1">
<Box width="4" height="1" backgroundcolor="#DDD"/>
</PlaceObject>
<Output allocate="auto" row="1">
<Text textformat="indent">
<Paragraph>
<Value select="sd:dummytext()"/>
</Paragraph>
</Text>
</Output>
</Record>
</Layout>

allocate="auto" und das Umfließen von Objekten.
Wenn allocate="auto"
gesetzt und ggf. eine Zeilenangabe hinzugefügt wird, dann merkt sich das System, welche Bereiche belegt sind und welche frei sind und erzeugt einen Absatz in der passenden Form.
Das beste Ergebnis wird erzielt, wenn die Rasterhöhe der (Text-)Schrifthöhe entspricht:
<Layout xmlns=“urn:speedata.de:2009/publisher/en” xmlns:sd=“urn:speedata:2009/publisher/functions/en” xmlns:xi=“http://www.w3.org/2001/XInclude"
<Record element="data">
<PlaceObject column="8" row="1">
<Box width="3" height="2" backgroundcolor="thistle"/>
</PlaceObject>
<PlaceObject column="1" row="4">
<Box width="4" height="4" backgroundcolor="lightgreen"/>
</PlaceObject>
<Output allocate="auto" row="1">
<Text textformat="indent">
<Paragraph>
<Value select="sd:dummytext()"/>
</Paragraph>
</Text>
</Output>
</Record>
</Layout>

allocate="auto" mit Rasterhöhe = Zeilenabstand
Wenn man jetzt noch die Objekte nicht direkt am Raster ausrichtet, sondern etwas kleiner macht (padding), ist das ganze auch ansehnlich:
<Layout
xmlns="urn:speedata.de:2009/publisher/en"
xmlns:sd="urn:speedata:2009/publisher/functions/en"
xmlns:xi="http://www.w3.org/2001/XInclude"
>
<Options show-grid="yes"/>
<SetGrid height="12pt" nx="10"/>
<xi:include href="definitionen.xml"/>
<Record element="data">
<PlaceObject column="8" row="1">
<Box width="3" height="2" backgroundcolor="thistle"
padding-left="2mm" padding-bottom="2mm"/>
</PlaceObject>
<PlaceObject column="1" row="4">
<Box width="4" height="4" backgroundcolor="lightgreen"
padding-top="2mm" padding-right="2mm"/>
</PlaceObject>
<Output allocate="auto" row="1">
<Text textformat="indent">
<Paragraph>
<Value select="sd:dummytext()"/>
</Paragraph>
</Text>
</Output>
</Record>
</Layout>

Die Objekte sind nun etwas kleiner als das Raster, damit wirkt das Layout schon etwas angenehmer.
Die Möglichkeit den Innenabstand der Box (über padding-*
) anzugeben, besteht erst seit Version 2.5.10.