von Patrick Gundlach |

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.

In der Serie »Feature der Woche« beschreibe ich jeden Montag mehr oder weniger nützliche Eigenschaften des Publishers. Kommentare gerne an mich per E-Mail oder einfach im Kommentarfeld.