LaTeX

Aus VISki
Wechseln zu: Navigation, Suche

LaTeX (ausgeprochen läitech oder lah-tech) ist ein Textsatzprogramm, das sich besonders für die Erstellung von wissenschaftlichen Manuskripten eignet. Eigentlich ist LaTeX eine Sammlung von Makros, die das Arbeiten mit TeX vereinfacht.

Es handelt sich dabei nicht um ein WYSIWYG-Programm, wie Microsoft Word oder OpenOffice Writer, sondern eher um eine Art Interpreter, der eine Textdatei als Input erwartet und je nach Wahl eine DVI- oder PDF-Datei erstellt. Siehe auch http://de.wikipedia.org/wiki/LaTeX

Einführungen

Eine sehr empfehlenswerte Einführung ist die (Not So) Short Introduction von Tobi Oetiker. Viele Fragen werden in der englischen oder deutschen TeX-FAQ beantwortet; die Dokumentation aller offiziellen Packages (und ganz, ganz viel mehr) ist im Comprehensive TeX Archive Network zu finden. Als schnelles Nachschlagewerk bietet sich auch die entsprechende Hilfeseite der Wikipedia an.

Bei de.wikibooks.org existiert ein Wikibook über LaTeX: LaTeX-Kompendium

Endliche Automaten in DOT language in LaTeX

Vorbedingungen

Alle hier erwähnten Methoden wurden auf Ubuntu 9.04 mit pdflatex getestet. Dafür waren folgende Packages nötig, die über die Repositories verfügbar waren: graphviz, dot2tex.

Auf windows (mit graphviz und dot2tex via cygwin setup installiert) musste ich auch noch im MikTex Package Manager das package pgf installieren, sonst wurde tikz.sty nicht gefunden. Ich nehme an, dass dieses package auf linux auch benötigt wird.

Dot language

Die DOT language ist eine Sprache zur Beschreibung von Graphen, die von graphviz zur Generierung von ebendiesen genutzt wird. Mithilfe des Programms dot2tex können Graphen in DOT language direkt in tikz-enabled-LaTeX-Quellcode umgewandelt werden. Dokumente in DOT language haben eine sehr simple Syntax (hier als Beispiel ein gerichteter Graph, der einen Endlichen Automaten darstellt):

digraph simpleFA
{
    rankdir=LR;
    node [shape="point"] start;
    node [shape="circle"] p0;
    node [shape="circle"] p1;
    node [shape="doublecircle"] p2;

<code><pre>start -&gt; p0;

p0 -&gt; p0 [label="0"];
p0 -&gt; p1 [label="1"];

p1 -&gt; p2 [label="0"];
p1 -&gt; p1 [label="1"];

p2 -&gt; p2 [label="0,1"];
</pre></code>

}

Output von dot2tex+pdflatex:

Latex.Dot.FA.2.png

Wenn der output wie folgt aussieht, siehe diese stackexchange Frage. Dann ist es einfacher, das Bild direkt mit dot -Tpng temp.dot -o temp.png zu erstellen und dann als bild in Latex einbinden. Latex.Dot.FA.png

Das Problem hier ist dass pip install dot2tex nicht die aktuelle version von github holt. Siehe diese Antwort für mehr info.

Methode 1: Manuelles Generieren von LaTeX-source

Dies ist die Methode, die einfacher einzurichten ist, jedoch eine umständlichere Kompilierung erfordert: Man schreibt den Graphen in DOT language in graph.dot...

digraph G
{
    node [shape="circle"] p0;
    node [shape="doublecircle"] p1;

<code><pre>p0 -&gt; p1 [label="0,1"];
p1 -&gt; p1 [label="0,1"];
</pre></code>

}

...und kompiliert diese Datei mithilfe von

dot2tex --figonly -o graph.tex graph.dot
in die Datei graph.tex.

In dem LaTeX-Dokument, in dem der Graph erscheinen soll, sind noch einige Einstellungen in der Präambel vorzunehmen (diese werden auch von dot2tex ohne --figonly generiert):

\documentclass[...]{...}
...
\usepackage[x11names, rgb]{xcolor}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{snakes,arrows,shapes}
\usepackage{amsmath}

\begin{document}
...
% Hier wird nun der Inhalt der vorhin generierten .tex-Datei includet. Wichtig: Hierfür ist --figonly erforderlich!
\input{graph.tex}
...
\end{document}

Methode 2: Einbinden mithilfe von dot2texi

Wenn man sich Mühe gibt, seine LaTeX-Installation so zu konfigurieren, dass sie mit dot2texi interagiert, ist die Kompilierung jedoch einfacher: Man kann direkt DOT language in LaTeX-Quellcode eintragen:

\documentclass[a4paper,10pt]{article}

\usepackage{dot2texi}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}

\begin{document}
\begin{dot2tex}[neato,options=-tmath]
digraph G 
{
    node [shape="circle"] p0;
    node [shape="doublecircle"] p1;

<code><pre>p0 -&gt; p1 [label="0,1"];
p1 -&gt; p1 [label="0,1"];
</pre></code>

}
\end{dot2tex}
\end{document}

Da dafür pdflatex allerdings dot2tex extern aufrufen muss, muss pdflatex das -shell-escape-Parameter übergeben werden:

pdflatex -shell-escape document.tex

Achtung: Diese Option ist aus gutem Grund per Default deaktiviert, da sie es möglich macht, beliebige Shell-Commands per LaTeX auszuführen! Man sollte also nicht ungeprüfte LaTeX-Dokumente ohne weiteres damit kompilieren.

Installation von dot2texi

dot2texi kann bei [1] heruntergeladen werden (aktuelle Version, Stand 4.11.2009: dot2texisty-3-0-0.zip). Installiert wird (zumindest unter Ubuntu) mit:

sudo unzip dot2texisty-3-0-0.zip -d /usr/share/texmf-texlive/tex/latex
sudo texconfig rehash

Aktivieren von -shell-escape für das gedit-LaTeX-Plugin

Ist zwar ein blöder Hack, aber es funktioniert wenigstens: Füge in der Datei /usr/share/rubber/rubber/rules/latex/pdftex.py die folgende Zeile am Ende hinzu:

doc.cmdline.insert(0, "-shell-escape")

Wichtig ist dabei, dass die Zeile mit der vorigen Zeile gleich weit eingerückt ist (Python). Ab dann kann man ganz normal mit dem gedit-LaTex-Plugin PDFs per Strg+Alt+1 erstellen.

===Diverse Tricks===
; Querformat
</dd>
</dl>

rankdir=LR;
; Knoten auf horizontaler Achse anordnen (nicht in Verbindung mit rankdir!)
</dd>
</dl>

{rank=same; Knoten1 Knoten2 Knoten3}

Further reading

Offizielle graphviz-Dokumentation: Insbesondere nützlich für verschiedene node-, arrow-Typen usw.

Templates

kleinerer Rand

%GPL V3 by Mathias Hablützel, feel free to improve this template
 \documentclass[a4paper,10pt]{article}
 % Use UTF8 since the laptop is configured so and use ngerman for word breaking. If you encounter an encoding problem, remove the line with utf8.
 \usepackage[utf8]{inputenc}
 \usepackage{ngerman}
 % I set here a different sidemargin because the original margin looks not so
 % good for normal documents. Additionally I have to enlarge the textwidth.
 \setlength{\oddsidemargin}{0cm}
 \setlength{\evensidemargin}{0cm}
 \addtolength{\textwidth}{4cm}
 \begin{document}
 % Here I use the up-to-date font encoding T1 and the font familly Computer Modern
 % Sans Serif (since I don't like the standard font) medium and normal (non-italic or so).
 \usefont{T1}{cmss}{m}{n}
 %Here, insert your text!

\end{document}

kleinerer Rand (Version 2)

% This relies on the package geometry, which is e.g. included in the Ubuntu package texlive-latex-base
\documentclass[a4paper,10pt]{article}
\usepackage[top=1in, left=1.2in, right=1.2in, bottom=0.5in]{geometry}
% Be careful not to set the values below 0.5in! Most VPP printers can still handle 0.5in-margins, but will cut off page numbering if values are below 0.5in.

\begin{document}
% Here comes your actual document
%
\end{document}

LaTeX-Export

MATLAB

Mit latex()

Bei Verwendung der Symbolic Toolbox kann man mit der latex()-Funktion LaTeX-Code generieren.

<blockquote>
  <blockquote>
    A = rand(2, 2);
    latex(sym(A))
  </blockquote>
</blockquote>

ans =

\left(\begin{array}{cc} \frac{7334425678513941}{9007199254740992} &amp; \frac{1046257826778739}{1125899906842624}&#92; \frac{2193477916810547}{9007199254740992} &amp; \frac{3152373516149815}{9007199254740992} \end{array}\right)

liefert

Matrizen

Wenn man lediglich Matrizen konvertieren moechte (z.B. fuer den VISki) ist der Output von latex() meist ziemlich haesslich, man kann daher folgendes Script verwenden, das den LaTeX-Code direkt ins Clipboard kopiert:

function [latex] = totex(matrix)
%TOTEX Outputs a matrix in latex format and copies it to the clipboard.
    latex = latexmatrix(matrix);
    clipboard('copy', latex);

<code><pre>function [latex] = latexmatrix(matrix)
%LATEXMATRIX Outputs a matrix in latex format for easy copy-pasting.
    CR = char(13); %Carriage return character
    BEGIN = ['\begin{pmatrix}' CR];
    END = '\end{pmatrix}';
    ITEMSEP = ' &amp; ';
    LINESEP = [' \\' CR];
    NWIDTH = 7; %num2str typically returns strings no longer than 7 chars.
    height = size(matrix, 1);
    width = size(matrix, 2);
    latex = BEGIN;
    for y = [1:height]
        latex = [latex pad(num2str(matrix(y, 1)), NWIDTH)];
        for x = [2:width]
            latex = [latex ITEMSEP pad(num2str(matrix(y, x)), NWIDTH)];
        end
        latex = [latex LINESEP];
    end
    latex = [latex END];

    function [paddedstring] = pad(string, len)
    %PAD prepads a string until a certain length is reached.
        paddedstring = string;
        while (length(paddedstring) &lt; len)
            paddedstring = [' ' paddedstring];
        end
    end
end
</pre></code>

end

Verwendung:

<blockquote>
  <blockquote>
    A = rand(2, 2);
    totex(A)
  </blockquote>
</blockquote>

ans =

\begin{pmatrix}
 0.1966 &amp; 0.61604 &#92;
0.25108 &amp; 0.47329 &#92;
\end{pmatrix}

Und so siehts aus:

IDEs

Alle hier vorgestellten IDEs sind entweder kostenlos oder OSS.

Linux

Mac

Windows

Plattformunabhängig