Posts tagged ‘Freemind’

Mindmaps aus Freemind nach LaTeX exportieren – Teil 4

Hier jetzt der finale Teil unserer Reihe, der Anpassung des originalen komplexen XSL Sheets auf unsere Bedürfnisse:

  • Erstellung eines kompletten, kompilierbaren Dokuments
  • Aufruf der itemize Matches, um itemize Umgebungen zu erzeugen

Die erste Anforderung ist leicht umzusetzen, wir setzen statt des original Match auf das „map“ Element einfach unseren ein:

<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>


Was die zweite Anforderung angeht: Wir haben ja schon im dritten Teil unserer Reihe gesehen, dass der Call auf das „itemize“ Matching problemlos ausgeführt werden kann, selbst wenn die entsprechenden Mindmaps viel kleiner sind. Es reicht daher, in der XSLT Datei einfach im subparagraph Teil die IF Abfrage zu entfernen:

<!-- <xsl:if test="current()/node/richcontent/html/body/p/@text"> -->
     <xsl:call-template name="itemization"></xsl:call-template>
<!-- </xsl:if> -->

Hier jetzt die finale Version, wie sie aktuell bei mir im Einsatz ist: mm2latexr_richcontent_v1.02_uwe. Der erzeugte TeX Code ist bei den itemizes nicht besonders gut eingerückt, aber auf absehbare Zeit kann ich damit leben.

Uwe

Uwe Ziegenhagen has been working with LaTeX for more than a decade. Besides TeX/LaTeX he likes to work with Python, Rasberry/Arduino and his digital camera.

More Posts - Website

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 has been working with LaTeX for more than a decade. Besides TeX/LaTeX he likes to work with Python, Rasberry/Arduino and his digital camera.

More Posts - Website

Mindmaps aus Freemind nach LaTeX exportieren – Teil 2

Dies ist der zweite Teil der Reihe, Teil 1 liegt unter http://uweziegenhagen.de/?p=2032.

Schauen wir uns mal den Aufbau der FreeMind Datei an:

<map version="0.9.0">
<!-- To view this file, download free mind mapping software FreeMind from http://freemind.sourceforge.net -->
<node CREATED="1335794057887" ID="ID_1245350673" MODIFIED="1335794109247" TEXT="Zentrum">
<node CREATED="1335794071208" ID="ID_1530114542" MODIFIED="1335794074163" POSITION="right" TEXT="Level 1"/>
<node CREATED="1335794075246" ID="ID_1662348218" MODIFIED="1335794079639" POSITION="right" TEXT="Level 1">
<node CREATED="1335794081307" ID="ID_1399980217" MODIFIED="1335794085467" TEXT="Level 2">
<node CREATED="1335794088715" ID="ID_1065307715" MODIFIED="1335794091703" TEXT="Level 3">
<node CREATED="1335794092827" ID="ID_1370145863" MODIFIED="1335794094989" TEXT="Level 4">
<node CREATED="1335794096421" ID="ID_9970207" MODIFIED="1335794099648" TEXT="Level 5">
<node CREATED="1335794173930" ID="ID_919041832" MODIFIED="1335794177008" TEXT="Level 6">
<node CREATED="1335794178164" ID="ID_1274260836" MODIFIED="1335794180516" TEXT="Level 7"/>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</map>

Es gibt ein map Tag, das entsprechende verschachtelte node Tags enthält. Wenn ein node Tag keine „Kinder“ hat, wird es am Ende der Zeile mittels „/“ geschlossen. node Tags mit „Kindern“ enthalten diese nodes und werden dann rekursiv geschlossen.

Schauen wir uns mal das XSLT an (Eine tiefgehende Einführung in XSLT kann ich hier jedoch nicht geben): Hinter dem Matching auf das map Tag wird die Text Eigenschaft des ersten node-Elements als part ausgegeben. Sehr interessant, an dieser Stelle können wir später ansetzen, um direkt ein kompilierbares LaTeX-Dokument zu erhalten.

Es gibt im Dokument noch drei weitere Matches:

  • richcontent
  • soll uns aktuell nicht interessieren, wird eventuell später mal behandelt.

  • node
  • Hier wird die Ausgabe der einzelnen node Tags gesteuert.

  • text
  • Dieses match steuert die Ausgabe der Notizen als einfachen Text, gehe ich eventuell später mal drauf ein.

In den node matches wird geschaut, wie tief sich der aktuelle Knoten befindet, in Abhängigkeit dessen wird das Text Attribut des Knotens einfach in ein entsprechendes LaTeX-Kommando eingebettet. Entsprechende Abschnitte wie den folgenden finden sich für alle Levels von \chapter bis \subparagraph.

Im nächsten Teil werden wir dieses XSLT Sheet auf unsere Bedürfnisse anpassen.

Uwe

Uwe Ziegenhagen has been working with LaTeX for more than a decade. Besides TeX/LaTeX he likes to work with Python, Rasberry/Arduino and his digital camera.

More Posts - Website

Mindmaps aus Freemind nach LaTeX exportieren – Teil 1

FreeMind ist meines Erachtens das beste OpenSource Tool für die Erstellung von Mindmaps, jedoch ist eine MindMap oft nicht das Format, das man zum Weiterbearbeiten benötigt. Neben diversen fertigen Export-Filtern für Grafikformate wie PDF oder PNG bietet FreeMind auch die Möglichkeit, eigene XSLT-Sheets für den Export zu nutzen. Das Rad muss man hier nicht komplett neu erfinden, mit Freemind to Latex gibt es schon ein entsprechendes Projekt, das eine passende XSLT Datei bereitstellt. Möchte man eine Mindmap exportieren, so geht man im „Datei“ Menü einfach auf den Export => „Mittels XSLT“ Eintrag und kann dann den Namen der Output Datei sowie das zu nutzende XSLT Sheet auswählen.

Mit der standardmäßigen mm2latexr_richcontent_v1.02.xsl erhält man für die Map aus dem Bild folgendes Ergebnis:

\part{Zentrum}
 
 
 
\chapter{Level 1}
\chapter{Level 1}
\section{Level 2}
\subsection{Level 3}
\subsubsection{Level 4}
\paragraph{Level 5}
\subparagraph{Level 6}

Man sieht:

  • Es fehlen Dokumentenpräambel und -struktur
  • Es wird nur bis Level 6 exportiert, danach fehlen die Inhalte (Laut der Webseite sollten eigentlich itemize Umgebungen daraus werden…)

Mit ein wenig XML/XSLT Kenntnissen lässt sich dieser Export aber sehr einfach auf die eigenen Bedürfnisse anpassen, was ich in Teil 2 zeigen werde.

Uwe

Uwe Ziegenhagen has been working with LaTeX for more than a decade. Besides TeX/LaTeX he likes to work with Python, Rasberry/Arduino and his digital camera.

More Posts - Website