Handbuch durchsuchen:

- Startseite
- Einleitung
- Hallo Welt!
- Grundlagen
  - Erstellen eines Layoutregelwerks
  - Aufbau der Datendatei und des Layoutregelwerks
  - Objekte ausgeben
  - Raster
  - Bereiche auf der Seite (PositioningArea)
  - Dateiorganisation
  - Silbentrennung / Spracheinstellungen
  - Einbinden von Schriftarten
  - Textformate
  - Textformatierung
  - Farben
- Programmierung
- Bilder einbinden
- Tabellen
- Fortgeschrittene Themen
  - Lesezeichen (Bookmarks)
  - Erzeugen von XML-Strukturen
  - Druckausgabe / Schnittmarken
  - CSS
  - Gruppen (virtuelle Objekte)
  - Virtuelle Seiten
  - Rotieren von Inhalten
  - Sortieren von Daten
  - Umfließen von Bildern
  - Seitentypen
  - Starten des Publishers über den Hotfolder
  - Lua-Filter / Datenvorverarbeitung
  - Schemavalidierung
  - Qualitätssicherung (PDF-Vergleich)
  - Fehlersuche / Debugging
  - Servermodus
  - Steuerung des Layouts beim Aufruf des Publishers
- Kochbuch
  - Daumenregister
  - Mehrseitige PDF-Dateien einbinden
  - Layoutoptimierung mithilfe von Gruppen
  - Aufzählungslisten nachahmen
  - Verzeichnisse erstellen
  - Inhaltsverzeichnis in einem Durchlauf erstellen
  - Seitenzahlen: Seite x von y
- Installationsanleitung
- Dateinamen im Publisher
- Voreinstellungen im speedata Publisher
- Starten des Publishers über die Kommandozeile
- Konfiguration des Publishers
- Längenangaben und Maßeinheiten
- XPath- und Layoutfunktionen
- Interne Variablen
- XML Editor mit Schema verbinden
  - Visual Studio Code
  - OxygenXML
  - Atom
- Liste der Änderungen
- Glossar
- Befehlsreferenz
  - A
  - Action
  - AddSearchpath
  - AtPageCreation
  - AtPageShipout
  - AttachFile
  - Attribute
  - B
  - Barcode
  - Bold
  - BoldItalic
  - Bookmark
  - Box
  - Br
  - Case
  - Circle
  - Color
  - Column
  - Columns
  - Compatibility
  - Contents
  - Copy-of
  - DefineColor
  - DefineColorprofile
  - DefineFontalias
  - DefineFontfamily
  - DefineTextformat
  - Element
  - Fallback
  - Fontface
  - ForAll
  - Frame
  - Grid
  - Group
  - Groupcontents
  - HSpace
  - Hyphenation
  - I
  - Image
  - Include
  - Initial
  - InsertPages
  - Italic
  - Layout
  - Li
  - LoadDataset
  - LoadFontfile
  - Loop
  - Makeindex
  - Margin
  - Mark
  - Message
  - NewPage
  - NextFrame
  - NextRow
  - NoBreak
  - Ol
  - Options
  - Otherwise
  - Output
  - Overlay
  - Pageformat
  - Pagetype
  - Paragraph
  - PDFOptions
  - PlaceObject
  - Position
  - PositioningArea
  - PositioningFrame
  - ProcessNode
  - Record
  - Regular
  - Rule
  - SaveDataset
  - SavePages
  - SetGrid
  - SetVariable
  - SortSequence
  - Stylesheet
  - Span
  - Sub
  - Sup
  - Switch
  - Table
  - TableNewPage
  - Tablefoot
  - Tablehead
  - Tablerule
  - Td
  - Text
  - Textblock
  - Tr
  - Trace
  - Transformation
  - U
  - Ul
  - Until
  - URL
  - Value
  - VSpace
  - While

Version 4.2.0
Handbuch durchsuchen

- Startseite
- Einleitung
- Hallo Welt!
- Grundlagen
  - Erstellen eines Layoutregelwerks
  - Aufbau der Datendatei und des Layoutregelwerks
  - Objekte ausgeben
  - Raster
  - Bereiche auf der Seite (PositioningArea)
  - Dateiorganisation
  - Silbentrennung / Spracheinstellungen
  - Einbinden von Schriftarten
  - Textformate
  - Textformatierung
  - Farben
- Programmierung
- Bilder einbinden
- Tabellen
- Fortgeschrittene Themen
  - Lesezeichen (Bookmarks)
  - Erzeugen von XML-Strukturen
  - Druckausgabe / Schnittmarken
  - CSS
  - Gruppen (virtuelle Objekte)
  - Virtuelle Seiten
  - Rotieren von Inhalten
  - Sortieren von Daten
  - Umfließen von Bildern
  - Seitentypen
  - Starten des Publishers über den Hotfolder
  - Lua-Filter / Datenvorverarbeitung
  - Schemavalidierung
  - Qualitätssicherung (PDF-Vergleich)
  - Fehlersuche / Debugging
  - Servermodus
  - Steuerung des Layouts beim Aufruf des Publishers
- Kochbuch
  - Daumenregister
  - Mehrseitige PDF-Dateien einbinden
  - Layoutoptimierung mithilfe von Gruppen
  - Aufzählungslisten nachahmen
  - Verzeichnisse erstellen
  - Inhaltsverzeichnis in einem Durchlauf erstellen
  - Seitenzahlen: Seite x von y
- Installationsanleitung
- Dateinamen im Publisher
- Voreinstellungen im speedata Publisher
- Starten des Publishers über die Kommandozeile
- Konfiguration des Publishers
- Längenangaben und Maßeinheiten
- XPath- und Layoutfunktionen
- Interne Variablen
- XML Editor mit Schema verbinden
  - Visual Studio Code
  - OxygenXML
  - Atom
- Liste der Änderungen
- Glossar
- Befehlsreferenz
  - A
  - Action
  - AddSearchpath
  - AtPageCreation
  - AtPageShipout
  - AttachFile
  - Attribute
  - B
  - Barcode
  - Bold
  - BoldItalic
  - Bookmark
  - Box
  - Br
  - Case
  - Circle
  - Color
  - Column
  - Columns
  - Compatibility
  - Contents
  - Copy-of
  - DefineColor
  - DefineColorprofile
  - DefineFontalias
  - DefineFontfamily
  - DefineTextformat
  - Element
  - Fallback
  - Fontface
  - ForAll
  - Frame
  - Grid
  - Group
  - Groupcontents
  - HSpace
  - Hyphenation
  - I
  - Image
  - Include
  - Initial
  - InsertPages
  - Italic
  - Layout
  - Li
  - LoadDataset
  - LoadFontfile
  - Loop
  - Makeindex
  - Margin
  - Mark
  - Message
  - NewPage
  - NextFrame
  - NextRow
  - NoBreak
  - Ol
  - Options
  - Otherwise
  - Output
  - Overlay
  - Pageformat
  - Pagetype
  - Paragraph
  - PDFOptions
  - PlaceObject
  - Position
  - PositioningArea
  - PositioningFrame
  - ProcessNode
  - Record
  - Regular
  - Rule
  - SaveDataset
  - SavePages
  - SetGrid
  - SetVariable
  - SortSequence
  - Stylesheet
  - Span
  - Sub
  - Sup
  - Switch
  - Table
  - TableNewPage
  - Tablefoot
  - Tablehead
  - Tablerule
  - Td
  - Text
  - Textblock
  - Tr
  - Trace
  - Transformation
  - U
  - Ul
  - Until
  - URL
  - Value
  - VSpace
  - While

- This manual in English

# Seitenzahlen: Seite x von y

Es gibt zwei Wege, die letzte Seitenzahl zu ermitteln. Der erste Weg ist einfach und empfohlen. Der zweite Weg führt über selbst gespeicherte Daten und war die einzige Möglichkeit bis Version 3.9.26. Er wird hier weiterhin beschrieben, weil er aufzeigt, wie Daten gespeichert und für den nächsten Durchlauf bereitgestellt werden.

Um die Länge des Dokuments in Seiten anzugeben, ist in beiden Fällen ein zweiter Durchlauf des Publishers notwendig, da erst am Ende des ersten Durchlaufs klar ist, wie lang das Dokument wird.

## Der einfache Weg: `$_lastpage`

Die interne Variable `$_lastpage` enthält die Anzahl der Seiten im vorherigen Durchlauf. Diese Variable ist seit Version 3.9.26 verfügbar.

## Der etwas kompliziertere Weg

Am Ende des ersten Durchlaufs wird die aktuelle (= letzte) Seitennummer gespeichert, die man anschließend in den folgenden Durchläufen nutzen kann.

Das folgende Beispiel erzeugt einige Seiten mit Ausgaben in der Form `Seite 1 von ??`. Das dient als Basis für die Ergänzungen.

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

      <Record element="data">
        <!-- ?? is a placeholder that gets overridden -->
        <SetVariable variable="maxpages" select="'??'"/>

        <Loop select="10" variable="i">
          <PlaceObject>
            <Textblock>
              <Paragraph>
                <Value
                  select="concat('Page ', sd:current-page(), ' of ', $maxpages )"/>
              </Paragraph>
            </Textblock>
          </PlaceObject>
          <SetVariable variable="lastpage" select="sd:current-page()"/>
          <NewPage/>
        </Loop>
      </Record>
    </Layout>

Am Ende der letzte Seite kann die Information mithilfe von `<SaveDataset>` für den nächsten Lauf zwischengespeichert werden:

    <SetVariable variable="attrPagenumber">
      <Attribute name="numberofpages" select="$lastpage"/>
    </SetVariable>
    <SaveDataset
      name="pagecount"
      elementname="pageinfo"
      attributes="$attrPagenumber"/>

`<SaveDataset>` erwartet eine XML-Struktur bei der Attribute im Element `<Attribute>` und, Elemente in `<Element>` gespeichert werden, wobei dieser Befehl wiederum `<Attribute>` als Kindelemente haben kann. Diese Struktur wird als XML auf die Festplatte gespeichert und hat in diesem Beispiel die folgende Form:

    <pageinfo numberofpages="10" />

Zu Beginn des Laufs kann nun die Datei eingelesen werden, falls sie existiert (d.h. im ersten Lauf wird kein Fehler erzeugt, weil die Datei noch nicht erzeugt wurde):

    <Record element="data">
      <SetVariable variable="maxpages" select="'??'"/>
      <LoadDataset name="pagecount"/>
      ...

und dazu

    <Record element="pageinfo">
      <SetVariable variable="maxpages" select="@numberofpages"/>
    </Record>

Der Datensatz `pageinfo` wird dann aufgerufen, wenn die XML-Datei `pagecount` eingelesen wird. Es wird nichts anderes gemacht, als die kurz vorher definierte Variable `maxpages` mit dem korrekten Inhalt zu überschreiben.

Das vollständige Beispiel sieht nun so aus:

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

      <!-- only evaluated if the file `pagecount` is found (second run) -->
      <Record element="pageinfo">
        <SetVariable variable="maxpages" select="@numberofpages"/>
      </Record>

      <!-- start of data processing -->
      <Record element="data">
        <SetVariable variable="maxpages" select="'??'"/>
        <LoadDataset name="pagecount"/>
        <Loop select="10" variable="i">
          <PlaceObject>
            <Textblock>
              <Paragraph>
                <Value
                  select="concat('Page ', sd:current-page(), ' of ', $maxpages )"/>
              </Paragraph>
            </Textblock>
          </PlaceObject>
          <SetVariable variable="lastpage" select="sd:current-page()"/>
          <NewPage/>
        </Loop>
        <!--  Now we know the total number of pages  -->
        <SetVariable variable="attrPagenumber">
          <Attribute name="numberofpages" select="$lastpage"/>
        </SetVariable>
        <SaveDataset
          name="pagecount"
          elementname="pageinfo"
          attributes="$attrPagenumber"/>
      </Record>
    </Layout>

- Inhaltsverzeichnis in einem Durchlauf erstellen
- Installationsanleitung