Mindmaps aus Freemind nach LaTeX exportieren – Teil 3

Nach Teil 1 und Teil 2 wird es jetzt Zeit, das XSLT anzupassen. Ziel ist es, ein selbstständig kompilierbares TeX-Dokument zu bekommen und — falls meine XSLT Kenntnisse reichen — den Export für die tieferen Ebenen als itemize zu fixen.

Teil 1 der Anforderung ist recht schnell umgesetzt. Es reicht, den Teil zu editieren, der das map Tag matcht:

<xsl:template match="map">
<xsl:text>
\documentclass[ngerman]{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage[]{babel}
\usepackage[T1]{fontenc}
\author{Uwe Ziegenhagen}
\title{</xsl:text><xsl:value-of select="node/@TEXT"/><xsl:text>}
\begin{document}
\maketitle
\tableofcontents
 
</xsl:text>
 
<xsl:apply-templates/>
 
<xsl:text>
\end{document}
</xsl:text>

Für den zweiten Teil, die korrekte Ausgabe der itemize Umgebungen, müssen wir etwas tiefer in die Materie steigen. Um selbst wieder ins Thema reinzukommen, habe ich ein Minimalbeispiel minimal.xslt des XLST Sheets erstellt, das zum Testen genutzt wird.

Um nicht jedes Mal in Freemind den Export starten zu müssen, habe ich mir die Binärversion von Saxon installiert, der Aufruf lautet dann:

transform -xsl:minimal.xsl -t -s:minimal.mm -o:minimal.tex

Aus der folgenden Freemind Map wird dann der nachfolgende TeX-Code erzeugt:

\documentclass[ngerman]{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage[]{babel}
\usepackage[T1]{fontenc}
\author{Uwe Ziegenhagen}
\title{Minimal}
\begin{document}
\maketitle
\tableofcontents
 
 
 
 
\section{Hallo}		\begin{itemize}	\item A1
			\item A2		\begin{itemize}	\item B1
			\item B2
			\item B3
		\end{itemize}
			\item A3
		\end{itemize}
 
 
\end{document}

Vom Umbruch noch nicht perfekt, es kompiliert aber problemlos. Wie sieht jetzt die entsprechende XSLT-Datei aus:

<?xml version='1.0'?>
 
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>  
<xsl:output omit-xml-declaration="yes" encoding="ISO-8859-1"/>
 
<xsl:template match="map">
	<xsl:text>
	\documentclass[ngerman]{scrreprt}
	\usepackage[utf8]{inputenc}
	\usepackage[]{babel}
	\usepackage[T1]{fontenc}
	\author{Uwe Ziegenhagen}
	\title{</xsl:text><xsl:value-of select="node/@TEXT"/><xsl:text>}
	\begin{document}
	\maketitle
	\tableofcontents
	</xsl:text>
 
		<xsl:apply-templates/>
 
	<xsl:text>
	\end{document}
	</xsl:text>
</xsl:template>
 
 
<xsl:template match="node">
	<xsl:if test="(count(ancestor::node())-2)=0">
	<xsl:apply-templates/>
	</xsl:if>
 
	<xsl:if test="(count(ancestor::node())-2)=1">
		<xsl:text>\section{</xsl:text><xsl:value-of select="@TEXT"/><xsl:text>}</xsl:text>
		<xsl:if test="current()/node">
			<xsl:call-template name="itemization"></xsl:call-template>
		</xsl:if>
	</xsl:if>
</xsl:template>
 
<xsl:template name="itemization">
	<xsl:param name="i" select="current()/node"/>
	<xsl:text>		\begin{itemize}</xsl:text>
	<xsl:for-each select="$i">
		<xsl:choose>
			<xsl:when test="@TEXT">
				<xsl:text>	\item </xsl:text><xsl:value-of select="@TEXT"/><xsl:text></xsl:text>
			</xsl:when>
			<xsl:otherwise>
			</xsl:otherwise>
		</xsl:choose>
		<xsl:if test="current()/node">
			<xsl:call-template name="itemization"></xsl:call-template>
		</xsl:if>
		<xsl:text>
		</xsl:text>	
	</xsl:for-each>
	<xsl:text>\end{itemize}</xsl:text>
	</xsl:template>
 
</xsl:stylesheet>

Es ist das gleiche map Matching, wie oben erwähnt. Von den Node Matches habe ich die meisten entfernt, nur das 0er und 1er sind übriggeblieben. Einen Unterschied gibt es: im 1er Matching wird explizit das itemize Matching aufgerufen: . Dieses wiederum habe ich der originalen XSL Datei von http://sites.google.com/site/freemind2beamer/Home/freemind2latex entnommen, hier fanden keine Anpassungen statt.

In Teil 4 werden wir das erlangte Wissen dann auf die ursprüngliche XSLT Datei anwenden und das Beispiel fertigstellen.

Uwe

Uwe Ziegenhagen mag LaTeX und Python, auch gern in Kombination. Hat Dir dieser Beitrag geholfen und möchtest Du Dich dafür bedanken? Dann unterstütze doch vielleicht die Dingfabrik Köln e.V. mit einem kleinen Beitrag. Details zur Bezahlung findest Du unter Spenden für die Dingfabrik.

More Posts - Website