PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tabelle mit Pfeilen



Helveticus
22-10-2012, 15:09
Hallo

Ich würde in Latex gerne eine Tabelle wie im Bild im Anhang zeichnen. Eine Tabelle würde ich ja noch hinbekommen, aber die Pfeile wohl nicht.

Könnte da vielleicht jemand kurz ein Beispiel mit einer kleinen Tabelle (vielleicht 2x2) machen? Das könnte ich ja dann beliebig erweitern. Wäre sehr nett.

hakaze
22-10-2012, 16:19
Hast du denn schonmal probiert diese "Tabelle" mit tikz/pgf zu zeichnen, wie es dir in deinen (http://mrunix.de/forums/showthread.php?t=73982), anderen Threads (http://www.latex-community.org/forum/viewtopic.php?f=45&t=21502) (oder in diesem von plektron (http://mrunix.de/forums/showthread.php?t=73998&highlight=tabelle)) empfohlen wurde?

Wie dort überall schon beschrieben, ist Tabelle wohl der falsche Suchbegriff. Was du möchtest, ist wohl eher eine Matrix mit Verbindungspfeilen und einem hinterlegten Gitter. Dafür wäre tikz/pgf ideal. Du hast ja die Graphik schon vorgezeichnet. Also bräuchtest du nur noch die Koordinaten abzählen und in Code hacken.

Auf texample.net (wurde auch schon vorgeschlagen) gibt es schon einige Beispiele mit Matricen (http://www.texample.net/tikz/examples/feature/matrices/)und Pfeilen (http://www.texample.net/tikz/examples/feature/arrows/) zur Anregung.

Versuch doch, damit schon mal etwas auszuprobieren und poste dann konkrete Fragen! Aktuell klingt es noch sehr nach: "Mrunix, das ist mir alles zu schwer... macht doch diese Aufgabe für mich!".

So, damit mir auch keine mangelnde Hilfsbereitschaft vorgeworfen wird, hier noch eine quick-n-dirty-Variante:
\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{matrix,arrows}

\begin{document}
\begin{tikzpicture}
\tikzset{>=stealth'};
\matrix (m) [matrix of nodes, row sep=1em, column sep=1em]
{ 0 & 1 & 2 & 3 \\
1 & \node[red]{1}; & 2 & \node[red]{2}; \\ };
\draw (m-1-1) edge[->] (m-1-2);
\draw (m-1-1) edge[->,red] (m-2-2);
\draw (m-1-1) edge[->] (m-2-1);

\draw (m-1-2) edge[->] (m-1-3);
\draw (m-1-2) edge[->] (m-2-3);
\draw (m-2-2) edge[->] (m-2-3);

\draw (m-1-3) edge[->] (m-1-4);
\draw (m-1-3) edge[->,red] (m-2-4);
\end{tikzpicture}
\end{document}http://mrunix.de/forums/attachment.php?attachmentid=5425&stc=1&d=1350915332

Helveticus
22-10-2012, 18:39
Vielen Dank. Ich habe jetzt versucht ein Gitter darüberzulegen. Das sollte ja gehen mit

\draw[thick] (0,0) grid [step=1] (3,2);

Ich bekomme es einfach nicht so hin, dass das Gitter über die Matrix passt, ist immer verschoben und/oder zu grob/zu fein.

bobmalaria
22-10-2012, 18:51
hi,

du musst doch das gitter nicht drueber malen. da gibt es doch einfach eine grid option fuer die matrix, oder? schau dafuer nochmal ins pgfmanual oder hier (http://tex.stackexchange.com/questions/50929/copy-able-matrix-grid)

gruss

Helveticus
22-10-2012, 19:38
Ich habs jetzt wie folgt.


\begin{tikzpicture}
\tikzset{>=stealth'};
\matrix (m) [matrix of nodes, style={nodes={rectangle,draw,minimum width=3em}}, minimum height=1.5em, row sep=-\pgflinewidth, column sep=-\pgflinewidth]
{ 0 & 1 & 2 & 3 \\
1 & \node[red]{1}; & 2 & \node[red]{2}; \\ };
\draw (m-1-1) edge[->] (m-1-2);
\draw (m-1-1) edge[->,red] (m-2-2);
\draw (m-1-1) edge[->] (m-2-1);

\draw (m-1-2) edge[->] (m-1-3);
\draw (m-1-2) edge[->] (m-2-3);
\draw (m-2-2) edge[->] (m-2-3);

\draw (m-1-3) edge[->] (m-1-4);
\draw (m-1-3) edge[->,red] (m-2-4);
\end{tikzpicture}

Jetzt sehen aber die Pfeile blöd aus bzw. man sieht sie fast nicht mehr. :( Bin am verzweifeln. Zudem habe ich auch noch nicht rausbekommen wie man die erste Zeile und Spalte vom Gitter ausnehmen kann (da diese ja die Beschriftungen der Zeilen und Spalten enthalten).

hakaze
23-10-2012, 09:55
Hier ist ein Beispiel, das sich großzügig bei Elkes (esdd) Post (http://mrunix.de/forums/showpost.php?p=346603&postcount=7) bedient:
\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{matrix,arrows}

\begin{document}
\begin{tikzpicture}
% eigene Stildefinitionen der Übersichtlichkeit halber
\tikzset{mycell/.style={inner sep=0pt,outer sep=0pt,minimum size=4mm},
mymatrix/.style={%
matrix of nodes,inner sep=0.2cm,row sep=0.4cm,column sep=0.4cm,%
nodes=mycell},%
mygrid/.style={very thin, dashed},%
>=stealth'};
% Matrix 1. Zeile/Spalte = Beschriftung
\matrix (m) [mymatrix]
{ & O & S & E & T \\
O & 0 & 1 & 2 & 3 \\
T & 1 & \node[red]{1}; & 2 & \node[red]{2}; \\ };
% Pfeile zusammengefasst
\begin{scope}[->]
\draw (m-2-2)-- (m-2-3);
\draw[red] (m-2-2) -- (m-3-3);
\draw (m-2-2) -- (m-3-2);

\draw (m-2-3) -- (m-2-4);
\draw (m-2-3) -- (m-3-4);
\draw (m-3-3) -- (m-3-4);

\draw (m-2-4) -- (m-2-5);
\draw[red] (m-2-4) -- (m-3-5);
\end{scope}
% Gitter als foreach-Schleife
% senkrechte Linien
\foreach \i in {1,...,5}{%
\foreach \j in {2,...,3}{%
\draw[mygrid] ([yshift=4mm,xshift=4mm]m-\j-\i.center) -- ([yshift=-4mm,xshift=4mm]m-\j-\i.center);} };
% waagerechte Linien
\foreach \k in {1,...,3}{%
\foreach \l in {2,...,5}{%
\draw[mygrid] ([yshift=-4mm,xshift=-4mm]m-\k-\l.center) -- ([yshift=-4mm,xshift=4mm]m-\k-\l.center);} };
\end{tikzpicture}
\end{document}Ich habe die Beschriftung mit in die Matrix genommen. Dadurch verschieben sich dei Koordinaten für die Pfeile um +1. Die Pfeile habe der Übersichtlichkeit halber wie Elke in der Scope-Umgebung zusammengefasst.

Das Gitter ist über foreach-Schleifen realisiert. Ab der 2. Zeile wird jeweils am rechten Rand der Zelle eine senkrechte Linie gezogen. Ab der 2. Spalte wird unter jeder Zelle eine waagerechte Linie gezogen.
http://mrunix.de/forums/attachment.php?attachmentid=5431&stc=1&d=1350978909

Helveticus
23-10-2012, 10:25
Wow vielen Dank hakaze, das sieht ja sehr gut aus. Ich werde es mir über Mittag genauer anschauen. Kann man denn das Gitter auch mit durchgezogenen Linien machen? Vielleicht sieht man dann aber die Pfeile nicht mehr bzw. müsste die grösser und länger machen.

esdd
23-10-2012, 10:40
Hallo,

die Optionen fürs Gitter werden in hakazes Code in mygrid/.style festgelegt und können dort auch geändert werden. Das Gitter sollte aber vielleicht besser vor den Pfeilen gezeichnet werden.

Bei den Einträgen in der Matrix lässt sich die Umstellung einzelner Zellen auf rote Schrift noch etwas verkürzen.

Wenn viele ähnliche Pfeile gezeichnet werden sollen, sind foreach Schleifen wahrscheinlich auch hilfreich. Unten sind zwei Beispiel eingebaut.


\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{matrix,arrows}

\begin{document}
\begin{tikzpicture}
% eigene Stildefinitionen der Übersichtlichkeit halber
\tikzset{mycell/.style={inner sep=0pt,outer sep=0pt,minimum size=4mm},
mymatrix/.style={%
matrix of nodes,inner sep=0.2cm,row sep=0.4cm,column sep=0.4cm,%
nodes=mycell},%
mygrid/.style={very thin, lightgray},% Einstellungen für das Gitter
>=stealth'};
% Matrix 1. Zeile/Spalte = Beschriftung
\matrix (m) [mymatrix]
{ & O & S & E & T \\
O & 0 & 1 & 2 & 3 \\
T & 1 & |[red]|1 & 2 & |[red]|2 \\ };
%
% Gitter als foreach-Schleife
% senkrechte Linien
\foreach \i in {1,...,5}{%
\foreach \j in {2,...,3}{%
\draw[mygrid] ([yshift=4mm,xshift=4mm]m-\j-\i.center) -- ([yshift=-4mm,xshift=4mm]m-\j-\i.center);} };
% waagerechte Linien
\foreach \k in {1,...,3}{%
\foreach \l in {2,...,5}{%
\draw[mygrid] ([yshift=-4mm,xshift=-4mm]m-\k-\l.center) -- ([yshift=-4mm,xshift=4mm]m-\k-\l.center);} };
%
% Pfeile zusammengefasst
\begin{scope}[->]
% waagerechte Pfeile zweite Matrixzeile (=erste Zeile im Gitter)
\foreach \i [evaluate=\i as \j using int(\i+1)] in {2,...,4}{
\draw(m-2-\i)--(m-2-\j);}
% schräge Pfeile zweite nach dritte Matrixzeile (= erste Zeile im Gitter nach zweite Zeile im Gitter)
\foreach \i/\farbe [evaluate=\i as \j using int(\i+1)] in {2/red,3/black,4/red}{
\draw[\farbe](m-2-\i)--(m-3-\j);}
% weitere Pfeile
\draw (m-2-2) -- (m-3-2);
\draw (m-3-3) -- (m-3-4);
\end{scope}
\end{tikzpicture}
\end{document}
Gruß
Elke

Helveticus
23-10-2012, 11:19
Vielen Dank, das ist perfekt.

Ich habe jetzt die ganze Matrix in eine figure Umgebung gepackt. Das Problem ist noch, dass die Figur relativ klein ist, hätte sie gerne grösser. Kann man das irgendwie noch skalieren?

Zudem ist der Coe ja relativ umfangreich von daher wäre es vielleicht besser die Grafik extern zu halten. Ich könnte ja einfach den Code in ein neues latex Dokument kopieren und dann ein PDF erzeugen und dann als Grafik einbinden. Das sollte funktionieren, oder? Oder könnte ich den Code einfach in ein neues latex Dokument kopieren und dann als Latex Dokument (nicht PDF) einbinden? So könnte ich z.B. den Code für alle meine Grafiken in einem Latex Dokument sammeln und darauf referenzieren.

hakaze
23-10-2012, 11:49
Es gibt den scale-Parameter für tikzset. Der wird aber hier nicht so gut funktionieren, da absolute und relative Längenangaben gemischt sind.

Ich würde daher auf adjustbox zurückgreifen. Das kannst du dann auch mit ausgelagertem Code kombinieren: einfach alles von \begin{tikzpicture} bis inklusive \end{tikzpicture} in einer externen Datei speichern (meinematrix.tex) und über input einbinden.

\documentclass{article}

\usepackage{tikz,adjustbox}
\usetikzlibrary{matrix,arrows}

\begin{document}
\begin{figure}[tbp]
\begin{adjustbox}{width=\linewidth} % oder eine beliebige andere Breite
\input{meinematrix}
\end{adjustbox}
\caption{Die Beschriftung}
\end{figure}
\end{document}

Helveticus
23-10-2012, 12:59
Vielen Dank, hat alles wunderbar geklappt. Ein Problem ist aber noch aufgetaucht. Und zwar wenn ich ein Leerzeichen einfüge, dann hat das Gitter Unterbrechungen drin. Der Code ist der folgende.


\begin{tikzpicture}
% eigene Stildefinitionen der Übersichtlichkeit halber
\tikzset{mycell/.style={inner sep=0pt,outer sep=0pt,minimum size=4mm},
mymatrix/.style={%
matrix of nodes,inner sep=0.2cm,row sep=0.4cm,column sep=0.4cm,%
nodes=mycell},%
mygrid/.style={very thin, lightgray},% Einstellungen für das Gitter
>=stealth'};
% Matrix 1. Zeile/Spalte = Beschriftung
\matrix (m) [mymatrix]
{ & O & S & ~ & T \\
O & 0 & 1 & 2 & 3 \\
~ & 1 & |[red]|1 & 2 & |[red]|2 \\ };
%
% Gitter als foreach-Schleife
% senkrechte Linien
\foreach \i in {1,...,5}{%
\foreach \j in {2,...,3}{%
\draw[mygrid] ([yshift=4mm,xshift=4mm]m-\j-\i.center) -- ([yshift=-4mm,xshift=4mm]m-\j-\i.center);} };
% waagerechte Linien
\foreach \k in {1,...,3}{%
\foreach \l in {2,...,5}{%
\draw[mygrid] ([yshift=-4mm,xshift=-4mm]m-\k-\l.center) -- ([yshift=-4mm,xshift=4mm]m-\k-\l.center);} };
%
% Pfeile zusammengefasst
\begin{scope}[->]
% waagerechte Pfeile zweite Matrixzeile (=erste Zeile im Gitter)
\foreach \i [evaluate=\i as \j using int(\i+1)] in {2,...,4}{
\draw(m-2-\i)--(m-2-\j);}
% schräge Pfeile zweite nach dritte Matrixzeile (= erste Zeile im Gitter nach zweite Zeile im Gitter)
\foreach \i/\farbe [evaluate=\i as \j using int(\i+1)] in {2/red,3/black,4/red}{
\draw[\farbe](m-2-\i)--(m-3-\j);}
% weitere Pfeile
\draw (m-2-2) -- (m-3-2);
\draw (m-3-3) -- (m-3-4);
\end{scope}
\end{tikzpicture}

hakaze
23-10-2012, 13:26
Zwei kleine Änderungen sind notwendig:
\tikzset{mycell/.style={inner sep=0pt,outer sep=0pt,minimum size=4mm,anchor=center},
mymatrix/.style={%
matrix of nodes,inner sep=0.2cm,row sep=0.4cm,column sep=0.4cm,%
nodes=mycell, nodes in empty cells},%
mygrid/.style={very thin, lightgray},% Einstellungen für das Gitter
>=stealth'};
"nodes in empty cells" erlaubt auch komplett leere Zellen (ohne ~), "anchor=center" sorgt für die korrekte Ausrichtung verschieden großer (oder auch leerer) nodes.

esdd
23-10-2012, 13:27
Das von hakaze anfangs verwendete standalone bietet auch eine interessante Möglichkeit, die Zeichnungen sowohl einzeln zu erstellen, als auch den Code in die Hauptdatei einzubinden:

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{matrix,arrows}

\usepackage[obeyclassoptions]{standalone}

\begin{document}
\includestandalone[scale=3,page=1]{Zeichnungen}
\hfill
\includestandalone[scale=2,page=2]{Zeichnungen}
\end{document}
und in der Zeichnungen.tex zwei Beispielbilder:

\documentclass[tikz]{standalone}

\usetikzlibrary{matrix,arrows}

\begin{document}

\begin{tikzpicture}
\draw[red](0,0)rectangle(1,1);
\end{tikzpicture}

\begin{tikzpicture}
\draw[orange](0,0)rectangle(1,1);
\end{tikzpicture}

\end{document}

Gruß
Elke

Helveticus
23-10-2012, 14:43
Vielen Dank, hat alles wunderbar geklappt.

In meinem latex template hatte ich Unterordner für Figures und Images. Was ist da eigentlich der Unterschied? In Papers ist fast immer alles mit Figure beschrieben.

rstuby
23-10-2012, 14:56
Ich würde sagen, Figures sind wissenschaftliche Abbildungen, so Zeichnungen, Schemata usw. und Images sind so richtige Bilder, z.B. Fotos.

Helveticus
01-11-2012, 10:51
Ich muss das Thema hier leider wieder aufwärmen. ;) Es hat bisher alles wunderbar geklappt, konnte alle meine Grafiken erstellen.

Nun möchte ich aber gewisse Zahlen gepunktet darstellen, also nicht als gezogene Linie, sondern aus vielen Punkten bestehend. Habe da leider in Google nichts gefunden.

Ist das einfach realisierbar?

bobmalaria
01-11-2012, 11:30
hi,

ich habe zwar gepunktete fonts gesehen, aber fuer latex ist mir keine bekannt die mal eben so 'out of the box' funktioniert.

ich glaube das ist nicht einfach zurealisieren ohne an der font selbst herumzupfuschen. naterulich koennte man irgendwie tricksen und in fixen abstaenden eine zahl mit weissen balken ueberdecken, aber ob das gut aussieht....

hakaze
01-11-2012, 12:21
Nun möchte ich aber gewisse Zahlen gepunktet darstellen, also nicht als gezogene Linie, sondern aus vielen Punkten bestehend. Habe da leider in Google nichts gefunden.

Ist das einfach realisierbar?
Ich stimme Bob zu, da müsstest du schon einen Font mit "gepunkteten" Zahlen haben. Was spricht denn dagegen, die Zahlen einfach (hell)grau einzufärben?

Helveticus
06-01-2013, 12:29
Hallo

Es ist leider schon wieder ein Problem zu dem Thema aufgetaucht. Das Problem ist nun, dass zwar die Tabelle im PDF super aussieht, allerdings nicht wenn ich es ausdrucke. Dann sind die Linien nämlich gepunktet anstatt durchgezogen und zudem fehlt die erste und letzte vertikale Linie. Der Header der Tabelle sieht wie folgt aus (Ich darf leider nicht die ganze Tabelle posten, da es sich um eine Bachelor-Arbeit handelt und ich daher nicht einfach Teile davon veröffentlichen darf, ich denke aber, dass das Problem am Header liegt).


\begin{tikzpicture}
% Own style definition for better oversight.
\tikzset{mycell/.style={inner sep=0pt,outer sep=0pt,minimum size=4mm,anchor=center},
mymatrix/.style={%
matrix of nodes,inner sep=0.2cm,row sep=0.4cm,column sep=0.4cm,%
nodes=mycell,nodes in empty cells},%
mygrid/.style={very thin, lightgray},% Settings for the grid.
>=stealth'};
....
....
\end{tikzpicture}

Weiss das jemand wo das Problem liegt?

hakaze
06-01-2013, 13:31
Ich denke, die Auflösung deines Druckers reicht nicht, um die sehr feine, hellgraue Linie durchgehend darzustellen. Das ist kein Problem von TikZ/LaTeX.

Helveticus
06-01-2013, 13:50
Es handelt sich um einen Laserdrucker mit eigentlich sehr guter Auflösung von 2400dpi. Ich habe es allerdings mit 1200dpi gedruckt. Ich werde es jetzt noch einmal mit 2400dpi probieren und schauen, ob das Problem immer noch auftaucht.

Im Anhang habe ich die PDF Version (pdf.jpg) und die gedruckte Version der Tabelle (print.jpg), welche ich eingescannt habe, hinzugefügt. Leider hat der Scan nicht so eine hohe Auflösung, allerdings sieht man das Problem trotzdem.

Die gepunktete Linie kann natürlich durch die zu wenig hohe Auflösung des Druckers kommen. Allerdings fällt auch auf das die linkeste und rechteste vertikale Linie beim Ausdruckt fehlt, das kann ja wohl kaum vom Drucker kommen.

Die Tabelle habe ich mit folgendem Code erzeugt.

Deleted.

Ich werde den Code und die Bilder wieder entfernen, wenn das Problem gelöst wurde, da es sonst Probleme mit meiner Arbeit geben könnte.

hakaze
06-01-2013, 14:16
Die Linie ist im PDF (das zeigt ja dein Ausschnitt), also wird sie richtig erzeugt. Dann kommt die Verarbeitungsreihe PDFViewer -> Druckertreiber -> Drucker bis zum finalen Ausdruck. Irgendwo dort auch wird der Fehler sein. Falsche Auflösung eingestellt, Rechenfehler beim Rastern, Dreck im Drucker, schlechter Tonertransfer, etc.

Du kannst ja mal testweise die Linie (im mygrid/.style) etwas breiter machen bzw. die Farbe etwas dunkler.

Helveticus
06-01-2013, 20:47
Ich werde mal mit höherer Auflösung drucken und die Linie stärker machen. Ansonsten muss ich wohl damit leben.

MoonKid
07-05-2013, 12:11
Ich wurde in meinem anderen Thread http://www.golatex.de/viewtopic.php?p=47769 auf diesen hingewiesen und möchte an dieser Stelle nur meine eigenen Lösung präsentieren.

Da meine Tabelle nicht so komplex ist, wollte ich nicht alles zeichnen, sondern tatsächlich nur die Pfeile als Zeichnung und den Rest als normale TeX-Tabelle.

Das funktioniert dann so.

\documentclass{scrartcl}

\usepackage{xltxtra}
\defaultfontfeatures{Mapping=tex-text}

\usepackage{polyglossia}
\setdefaultlanguage[spelling=new]{german}

\usepackage{tikz}

\begin{document}
\begin{tabular} {c | c}
\tikz[remember picture] \node (n1) {}; A
&
B \tikz[remember picture] \node (n2) {};
\end{tabular}

\begin{tikzpicture}[remember picture,overlay]
\draw[->,very thick] (n1) -- (n2);
\end{tikzpicture}
\end{document}