Bridging the Gaps
Between XML and TEX

Deklarativ TEX-Code aus beliebigem XML erzeugen

Martin Kraetke

Überblick

  • XML nach TeX

    1. xmltex
    2. PassiveTeX
    3. pandoc
    4. XSLT
  • Vorstellung xml2tex

  • Vergleich der Ansätze

Warum XML?

  • XML-basierte Input-Formate im Publishing
  • QS mit XML-Schemas, Schematron
  • Ausgabeformate: PDF, EPUB, HTML

1. xmltex

1. xmltex*

  • von David Carlisle
  • in TeX geschriebener (nicht-validierender) XML-Parser
  • TeX-Code kann mit XML-Elementen, Attributen, PIs und Unicode-Zeichen assoziiert werden.

1. xmltex - Minimalbeispiel

MyProject/
  |--main.tex 
  |--main.cfg (xmltex-Config)
  |--doc.xml (XML-Input)
  |--tei.xmt (xmltex-Mapping)

1. xmltex - TeX-Datei

\def\xmlfile{doc.xml} % XML-Datei
\input xmltex.tex % laden von XML-TeX
MyProject/
  |--main.tex
  |--(…)

1. xmltex - xmltex-Config

\NAMESPACE{http://www.tei-c.org/ns/1.0}{tei.xmt}
MyProject/
  |--(…)
  |--main.cfg (xmltex-Config)

1. xmltex - XML-Input

<?xml version="1.0" encoding="UTF-8"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0">
 <teiHeader>
  <fileDesc>
   <titleStmt>
    <title>Title</title>
   </titleStmt>
   <publicationStmt>
    <p>Publication Information</p>
   </publicationStmt>
   <sourceDesc>
    <p>Information about the source</p>
   </sourceDesc>
  </fileDesc>
 </teiHeader>
 <text>
  <body>
   <p>Some text here.</p>
  </body>
 </text>
</TEI>

1. xmltex - Mapping

\XMLelement{TEI}          % Elementname (QName)
{}                        % Attribute
{\begin{document}}        % Beginn des Elements
{\end{document}}          % Ende des Elements
MyProject/
  |--(…)
  |--tei.xmt (xmltex-Mapping)

1. xmltex - Fazit

  • schnell und recht deklarativ
  • tief verschachtelte Strukturen aufwändig
  • keine moderne Abfragesprache wie XPath

2. PassiveTeX

2. PassiveTeX*

  • von Michel Goossens, Sebastian Rahtz
  • xmltex-Konfiguration für
    XSL Formatting Objects (XSL-FO)
  • Konvertierung von XML nach XSL-FO,
    xmltex übernimmt Rolle des FO-Formatters

2. PassiveTeX – Formatting Objects (FO)

  • XML-basierter W3C-Standard für Beschreibung seitenbasierter Layouts
  • Attribute an CSS angelehnt
  • wird langsam von PrintCSS abgelöst, Working Group seit 2013 geschlossen

2. PassiveTeX – FO-Beispiel

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="sample">
      <fo:region-body/>
    </fo:simple-page-master>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="sample">
    <fo:flow flow-name="xsl-region-body">
      <fo:block>Sample FO document</fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

2. PassiveTeX – Fazit

  • Zunächst muss FO z.B. mit XSLT erzeugt werden
  • man muss gleichzeitig FO und xmltex debuggen
  • interessanter, aber auch eher experimenteller Ansatz

3. Pandoc

3. Pandoc*

  • „universeller“ Dokumentkonverter für die Shell
  • unterstützt neben anderen Formaten auch
    XML (DocBook und JATS) und LaTeX

3. Pandoc – Aufruf

$ pandoc -s -t docbook input.xml -o output.tex

3. Pandoc – DocBook-Beispiel

<?xml version="1.0" encoding="UTF-8"?>
<article xmlns="http://docbook.org/ns/docbook" version="5.0">
  <title>my Title</title>
  <sect1>
    <title>Random Section Title</title>
    <para>This is a para and this is 
      <emphasis role="bold">bold</emphasis>
    </para>
  </sect1>
</article>

3. Pandoc – TeX-Output

\section{This is a title}

This is a para and this is \textbf{bold}

3. Pandoc – Fazit

  • XML-Input beschränkt auf DocBook und JATS
  • Ausgabe nur aufwändig mit Filtern (Haskell, Python) konfigurierbar
  • nicht für professionelle Szenarien geeignet
    (u.a. kein MathML)

4. XSLT

4. XSLT

  • XML-basierte Programmiersprache
  • sehr mächtig mit XPath, regulären Ausdrücken, gruppieren etc.
  • Text-Ausgabe möglich

4. XSLT - TeX aus XML erzeugen

  • Ausgabe zu Text ändern mit
    <xsl:output method="text"/>
  • Mit <xsl:template match="element"/>
    XML mit TeX-Code assoziieren

4. XSLT - Ein minimales XSLT für TEI

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xpath-default-namespace="http://www.tei-c.org/ns/1.0"
  version="3.0">
  
  <xsl:output method="text"/>
  
  <xsl:template match="TEI">
    <xsl:text>\documentclass{article}&#xa;</xsl:text>
    <xsl:text>\begin{document}&#xa;</xsl:text>
    <xsl:apply-templates select="* except teiHeader"/>
    <xsl:text>\end{document}</xsl:text>
  </xsl:template>
  
  <xsl:template match="p">
    <xsl:apply-templates/>
    <xsl:text>&#xa;&#xa;</xsl:text>
  </xsl:template>
  
</xsl:stylesheet>

4. XSLT - TeX-Output

\documentclass{article}
\begin{document}
Some text here.

\end{document}

4. XSLT - Fazit

  • sehr mächtig für die Steuerung der TeX-Ausgabe
  • Problem: wird schnell recht komplex und aufwändig
  • Implementierung von Tabellen, MathML ist eine langwierige Aufgabe

xml2tex

xml2tex*

  • basiert auf XProc/XSLT
  • deklarative XML-Konfiguration
  • fertige Module für MathML, Tabellen

xml2tex - MathML

  • mml-normalize: Heuristiken zur MathML-Normalisierung
  • mml2tex: wandelt MathML nach TeX

mml2tex - Ein DocBook-Beispiel

<?xml version="1.0" encoding="UTF-8"?>
<article xmlns="http://docbook.org/ns/docbook" version="5.0">
  <title>Example</title>
  <equation>
    <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML">
      <mml:mi>A</mml:mi>
      <mml:mo>=</mml:mo>
      <mml:mi>π</mml:mi>
      <mml:msup>
        <mml:mrow>
          <mml:mi>r</mml:mi>
        </mml:mrow>
        <mml:mrow>
          <mml:mn>2</mml:mn>
        </mml:mrow>
      </mml:msup>
    </mml:math>
  </equation>
</article>

mml2tex - TeX-Ausgabe

<?xml version="1.0" encoding="UTF-8"?>
<article xmlns="http://docbook.org/ns/docbook" version="5.0">
  <title>Example</title>
  <equation>
    <?mml2tex A=\pi r^{2}?>
  </equation>
</article>

xml2tex - Tabellen

  • Input: CALS- und HTML-Tabellenmodell
  • Output: tabularx und htmltabs

xml2tex - Konfiguration

  • XML-basiertes Format (RNG- und RNC-Schema, Integration in oXygen XML Editor)
  • wird intern in XSLT umgewandelt und auf
    XML-Datei angewendet

xml2tex - Konfiguration (Makrostruktur)

  • <ns/> Namespaces deklarieren (superwichtig :D)
  • <import/> Import anderer xml2tex-configs
  • <preamble/> alles vor \begin{document}
  • <front/> alles direkt nach \begin{document}
  • <back/> alles direkt vor \end{document}

xml2tex - Konfiguration (Mikrostruktur)

  • <template/> XML-Matching-Patterns nach TeX
  • <regex/> reguläre Ausdrücke nach TeX
  • <charmap/> Mapping von Unicode nach TeX

xml2tex - Templates

<template context="dbk:section">
  <rule break-after="2" name="section" type="cmd">
    <param/>
  </rule>
</template>
  • @name → TeX-Name
  • @type = "cmd"|"env" → Makro, Umgebung
  • <param> → {Parameter}
  • <option> → [Optionale Argumente]
  • <text> → einfacher Text

xml2tex - Regex

<regex regex="(\d{1,2})\.(\d{1,2})\.(\d{4})">
  <rule name="mydate" type="cmd">
    <param select="regex-group(1)"/>
    <param select="regex-group(2)"/>
    <param select="regex-group(3)"/>
  </rule>
</regex>

Zuordnung von regulären Ausdrücken inkl. Gruppen

xml2tex - Character maps

<charmap ignore-imported-charmaps="false">
  <!--= Uppercase Gamma -->   
  <char character="Γ" string="${\Upgamma}$"/>
  <char character="Γ" string="$\boldsymbol{\Upgamma}$" 
        context="*[@css:font-weight eq 'bold']"/> 
  <char character="Γ" string="${\Gamma}$"
        context="*[@css:font-style eq 'italic']"/>
</charmap>

Zeichen in MathML werden vorher von mml2tex in Math-Mode umgewandelt

Subjektiver Vergleich: Time to TeX

Feature xmltex PassiveTeX Pandoc XSLT xml2tex
XML FO DocBook, JATS
MathML ✓ (XMT) ✓ (XMT) XSLT ✓ (mml2tex)
table-in XMT FO CALS, HTML XSLT CALS, HTML
table-out XMT tabular longtable XSLT tabularx/htmltabs
Config XSLT XSLT
and now it's show time!