PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Figur zeichnen



Helveticus
02-06-2014, 11:46
Hallo

Ich würde in Latex gerne eine Figur wie im Bild im Anhang zeichnen. Das zweite Rechteck sowie der Pfeil zuunterst sollte gestrichelt sein.

Ich habe zwar mit Latex schon etwas Erfahrung, allerdings nicht mit solchen Sachen zeichnen. Könnte da vielleicht jemand kurz helfen? Wäre sehr nett.

Vielen Dank!

klops
02-06-2014, 13:18
Auf TeXample (http://www.texample.net/tikz/examples/) gibt es diverse Beispiele für Block- oder Ablaufdiagramme (http://www.texample.net/tikz/examples/tag/block-diagrams/).

Gestrichelte Linien macht man bei Tikz in der Regel über die Eigenschaft dashed. Näheres dazu verrät das pgfmanual (http://mirrors.ctan.org/graphics/pgf/base/doc/pgfmanual.pdf).

esdd
02-06-2014, 14:35
Da du bereits mit pgfplots und auch mit tikz gearbeitet hast, sollte es dir möglich sein, dafür wenigstens einen Ansatz zu erstellen. Das Beispiel sieht außerdem recht überschaubar aus, so dass es sich als Einstieg ganz gut eignet. Wenn dann noch Fragen offen sind und du hier zeigst, wie weit du selbst gekommen bist, dann hilft dir bestimmt jemand weiter.

Gruß
Elke

Helveticus
07-06-2014, 12:33
So ich konnte es jetzt fast selber lösen, aber eben nur fast. :( Ich habe noch drei kleine Probleme:

1. Der Abstand zwischen dem unteren Pfeil (von Output nach Input) und den Blöcken sollte kleiner sein. Dazu muss ich wohl die Position von der tmp coordinate verändern, aber ich weiss nicht wie.

2. Ich wurde gerne auf dem unteren Pfeil noch ein Text stehen haben, z.B. "test".

3. Ich habe das Diagramm in ein separates File gepackt und dann mittels figure eingebunden. Mein Dokument hat zwei Spalten. Leider geht das Diagramm über beide Spalten, es sollte allerdings auf eine Splate skaliert werden. Wie geht das?

Hier jetzt ein Minimalbeispiel:

Zuerst die flowchart.tex

\tikzstyle{block} = [draw, fill=blue!20, rectangle,
minimum height=3em, minimum width=6em]
\tikzstyle{input} = [coordinate]
\tikzstyle{output} = [coordinate]
\tikzstyle{pinstyle} = [pin edge={to-,thin,black}]

\begin{tikzpicture}[auto, node distance=4cm,>=latex']
% Placing the blocks
\node [input, name=input] {};
\node [block, right of=input] (controller) {Controller};
\node [block, right of=controller,node distance=3cm] (system) {System};
\node [block, right of=system,node distance=3cm] (system2) {System2};
\node [output, right of=system2] (output) {};
\coordinate [below of=system] (tmp);

% Connecting the nodes
\draw [draw,->] (input) -- node [name=r] {$Input$} (controller);
\draw [->] (controller) -- node[name=u] {} (system);
\draw [->] (system) -- node[name=u] {} (system2);
\draw [->] (system2) -- node [name=y] {$Output$}(output);
\draw [->] (y) |- (tmp) -| (r);
\end{tikzpicture}

Und die Hauptdatei

\documentclass[10pt,conference,compsocconf]{IEEEtran}

%\usepackage{times}
%\usepackage{balance}
\usepackage{url}
\usepackage{graphicx} % For figure environment
\usepackage{xcolor} % For colored text
\usepackage{pdfpages}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}

\begin{document}
\title{This is a title}

\maketitle

\begin{abstract}
\vspace{3cm}
\end{abstract}

\section{Introduction}
\label{sec:introduction}

\begin{figure}[h]
\centering
\input{flowchart}
\caption{The system.}
\label{flowchart}
\end{figure}

\end{document}

esdd
07-06-2014, 14:27
1. Den Abstand hast du mit node distance für die gesamte Abbildung vorgegeben. Ändere ihn für die Koordinate tmp mit


\coordinate [node distance=2cm,below of=system,label=above:{test}] (tmp);

2. Mit dem oben eingefügten Label hast du auch gleich den Text auf der Linie.

3. Das Bild ist einfach zu groß für eine Spalte. Skalieren kannst du mit


\resizebox{\columnwidth}{!}{\input{flowchart}}

Allerdings fügst du in deiner flowchart.tex einige zusätzliche Leerzeichen ein. Entweder du fügst an den Zeilenenden hinter \tikzstyle Kommentarzeichen ein und kommentierst die Leerzeile vor \begin{tikzpicture} aus oder du verwendest


\begin{tikzpicture}[
block/.style={draw, fill=blue!20,minimum height=3em, minimum width=6em},
input/.style={coordinate},
output/.style={coordinate},
auto,
node distance=4cm,
>=latex'
]
% Placing the blocks
\node [input, name=input] {};
\node [block, right of=input] (controller) {Controller};
\node [block, right of=controller,node distance=3cm] (system) {System};
\node [block, right of=system,node distance=3cm] (system2) {System2};
\node [output, right of=system2] (output) {};
\coordinate [node distance=2cm,below of=system,label=above:{test}] (tmp);
%
% Connecting the nodes
\draw [draw,->] (input) -- node [name=r] {$Input$} (controller);
\draw [->] (controller) -- node[name=u] {} (system);
\draw [->] (system) -- node[name=u] {} (system2);
\draw [->] (system2) -- node [name=y] {$Output$}(output);
\draw [->] (y) |- (tmp) -| (r);
\end{tikzpicture}%

Gruß
Elke

Helveticus
07-06-2014, 21:08
Ich danke dir tausend Mal Elke, hat alles wunderbar geklappt.

Nur so aus neugier, wie würde man das eigentlich machen, wenn ich es über zwei Kolonnen möchte? Bei mir ist es dann nämlich nicht zentriert obwohl ich ein \centering drin habe.


\begin{figure}[h]
\centering
\input{flowchart}
\caption{The system.}
\label{flowchart}
\end{figure}


Und wie macht man es, dass es die gesamte Breite (zwei Kolonnen) einnimmt und die Höhe dann entsprechend angepasst wird damit es nicht verzerrt? Ich brauche das sehr wahrscheinlich später, allerdings dann für eine \includegraphics in einer figure Umgebung.

esdd
07-06-2014, 23:16
Wenn die Abbildung über beide Spalten gehen soll, dann verwende die figure* Umgebung und lasse die Platzierungsparameter weg. Eventuell hilft dir auch Wie platziere ich im zweispaltigen Satz eine seitenbreite Tabelle auf der aktuellen Seite? (http://texwelt.de/wissen/fragen/996/wie-platziere-ich-im-zweispaltigen-satz-eine-seitenbreite-tabelle-auf-der-aktuellen-seite)

Wenn du auf die gesamte Textbreite skalieren willst, dann nimm \textwidth statt \columnwidth. Das ! im zweiten Argument sorgt dafür, dass die Höhe passend skaliert wird. Alternativ könntest du in beiden Fällen \linewidth verwenden. Dann würde die Abbildung in einer figure Umgebung auf die Spaltenbreite skaliert und in einer figure* Umgebung auf Textbreite. Siehe auch Worin besteht der Unterschied zwischen \textwidth und \linewidth? (http://texwelt.de/wissen/fragen/2520/worin-besteht-der-unterschied-zwischen-textwidth-und-linewidth/2526)

Gruß
Elke

Helveticus
08-06-2014, 18:36
Vielen Dank Elke. Ich werde es ausprobieren. Falls es Probleme gibt, melde ich mich wieder.

Helveticus
17-06-2014, 11:06
Jetzt habe ich doch noch zwei kleine Probleme. Und zwar habe ich ja einen zweispaltigen Textsatz.

1. Ich habe zwei Bilder (.png), welche ich nebeneinander stehen haben möchte. Also Bild 1 in Spalte 1 und Bild 2 in Spalte 2 direkt daneben. Wie geht das? Muss ich da beide Bilder zu einem Bild zusammenfügen und das dann über die ganze Breite einfügen? Allerdings sollten beide Bilder schon die Spaltengrenzen nicht überschreiten.

2. Ich habe mehrere kleinere Bilder welche ich als eine Art horizontaler Vektor einfügen möchte. D.h. die Bilder sollten alle horizontal nebeneinander stehen und die ganze Breite füllen (die Spaltengrenzen müssen hier nicht beachtet werden). Jedes Bild sollte noch eine caption haben und das gesamte Bild, also alle images zusammen sollten auch eine caption haben, einfach in etwas grösserer Schrift als die caption der einzelnen Bilder.

Wie geht das?

esdd
17-06-2014, 16:01
Hier ist ein Vorschlag für den ersten Teil deiner Frage. Bitte beachte dazu auch die beiden Links aus meinem vorhergehenden Post.


\documentclass[10pt,conference]{IEEEtran}

\usepackage{graphicx}
\usepackage{caption}
\usepackage{subcaption}

\usepackage{blindtext}% Besipieltext
\usepackage{mwe}% für example-image
\usepackage{showframe}% Anzeige der Seitenaufteilung
\begin{document}
\title{This is a title}

\maketitle

\begin{abstract}
\blindtext
\end{abstract}

\section{Introduction}
\label{sec:introduction}
\Blindtext[5]

\begin{figure*}
\begin{minipage}{\columnwidth}
\centering
\includegraphics[width=\linewidth]{example-image}
\captionof{figure}{erstes Bild}
\end{minipage}\hfill
\begin{minipage}{\columnwidth}
\centering
\includegraphics[width=\linewidth]{example-image}
\captionof{figure}{zweites Bild}
\end{minipage}
\end{figure*}

\Blindtext[8]

\end{document}

Für deine zweite Frage kannst du das Paket subcaption nutzen. Schau dazu einfach in dessen Doku.

Gruß
Elke

Helveticus
17-06-2014, 16:58
Vielen, vielen Dank Elke.

Noch eine kleine Off-topic Frage.

Ich benutze \documentclass[10pt,conference,compsocconf]{IEEEtran} und habe den Font nicht weiter spezifiziert. Welcher Font wird denn da standardmässig verwendet? Ich möchte nämlich Grafiken, die ich einfüge, im selben Font machen.

nixversteh
17-06-2014, 18:17
Vielen, vielen Dank Elke.

Noch eine kleine Off-topic Frage.

Ich benutze \documentclass[10pt,conference,compsocconf]{IEEEtran} und habe den Font nicht weiter spezifiziert. Welcher Font wird denn da standardmässig verwendet? Ich möchte nämlich Grafiken, die ich einfüge, im selben Font machen.

Hallo Helveticus,

schaumal hier:
http://tex.stackexchange.com/questions/109703/how-to-determine-the-font-being-used-by-a-latex-document

Viel Erfolg

Gruß

Martin

Helveticus
17-06-2014, 23:35
Hat auch wunderbar geklappt, vielen Dank. Ich verwende hier Times.

Bei meiner obigen flowchart.tex sind die Boxen ja mit blauem Hintergrund. Wie mache ich das wenn ich bei einer Box möchte, dass der Hintergrund blau gepunktet oder gestrichelt ist und zudem die schwarze Umrahmung der Box schwarz gestrichelt ist?

esdd
18-06-2014, 12:23
Für den gestrichelten Rand gibt es die Option dashed und für einen gepunkteten Hintergrund musst du die tikzlibrary patterns laden und dann zum Beispiel pattern=dots und pattern color=blue!20 verwenden. Das findet man aber alles im pgfmanual.

Gruß
Elke

Helveticus
19-06-2014, 22:12
Ich danke dir Elke, hat super geklappt.

Ein letzte Problem habe ich noch und zwar beziehe ich mich jetzt auf den obigen Code:


\documentclass[10pt,conference]{IEEEtran}

\usepackage{graphicx}
\usepackage{caption}
\usepackage{subcaption}

\usepackage{blindtext}% Besipieltext
\usepackage{mwe}% für example-image
\usepackage{showframe}% Anzeige der Seitenaufteilung
\begin{document}
\title{This is a title}

\maketitle

\begin{abstract}
\blindtext
\end{abstract}

\section{Introduction}
\label{sec:introduction}
\Blindtext[5]

\begin{figure*}
\begin{minipage}{\columnwidth}
\centering
\includegraphics[width=\linewidth]{example-image}
\captionof{figure}{erstes Bild}
\end{minipage}\hfill
\begin{minipage}{\columnwidth}
\centering
\includegraphics[width=\linewidth]{example-image}
\captionof{figure}{zweites Bild}
\end{minipage}
\end{figure*}

\Blindtext[8]

\end{document}


Der klappt auch ganz wunderbar, d.h. ich habe jetzt zwei Bilder nebeneinander, die über die gesamte Spalte gehen. Nun möchte ich aber noch ein drittes Bild und zwar unter dem linken Bild in der linken Spalte.

Ich habe keine Ahnung wie ich das sauber machen könnte. Wenn ich es in die obige figure Umgebung einfüge, dann wird es über die gesamten Zwei Spalten gestreckt.

Kannst du mir da helfen?

klops
22-06-2014, 20:24
Kann ich nicht nachvollziehen:
\documentclass[10pt,conference]{IEEEtran}

\usepackage{graphicx}
\usepackage{caption}
\usepackage{subcaption}

\usepackage{blindtext}% Besipieltext
\usepackage{mwe}% für example-image
\usepackage{showframe}% Anzeige der Seitenaufteilung
\begin{document}
\title{This is a title}

\maketitle

\begin{abstract}
\blindtext
\end{abstract}

\section{Introduction}
\label{sec:introduction}
\Blindtext[5]

\begin{figure*}
\begin{minipage}{\columnwidth}
\centering
\includegraphics[width=\linewidth]{example-image}
\caption{erstes Bild}
\end{minipage}\hfill
\begin{minipage}{\columnwidth}
\centering
\includegraphics[width=\linewidth]{example-image}
\caption{zweites Bild}
\end{minipage}
\begin{minipage}{\columnwidth}
\centering
\includegraphics[width=\linewidth]{example-image}
\caption{drittes Bild}
\end{minipage}

\end{figure*}

\Blindtext[8]

\end{document}
Ich habe auch noch \captionof durch \caption ersetzte, da die Verwendung von \captionof in diesem Fall keinen Gewinn bringt und deshalb wenig sinnvoll sein dürfte.

Oder wolltest Du eventuell, dass die zweite Spalte bereits rechts neben der dritten Abbildung fortgesetzt wird? Das geht so nicht figure* reserviert immer Platz über beide Spalten. Dann musst du die dritte Abbildung als figure setzen statt als figure* setzen. Allerdings hast Du dann keine unmittelbare Kontrolle, wo diese ausgegeben wird. Unschöner Weise kann dann das dritte Bild sogar vor dem ersten und zweiten ausgegeben werden. Man kann allerdings die Chancen mit Hilfe von afterpage ein klein wenig verbessern:
\documentclass[10pt,conference]{IEEEtran}

\usepackage{graphicx}
\usepackage{caption}
\usepackage{subcaption}

\usepackage{blindtext}% Besipieltext
\usepackage{mwe}% für example-image
\usepackage{showframe}% Anzeige der Seitenaufteilung
\usepackage{afterpage}
\begin{document}
\title{This is a title}

\maketitle

\begin{abstract}
\blindtext
\end{abstract}

\section{Introduction}
\label{sec:introduction}
\Blindtext[5]

\begin{figure*}
\begin{minipage}{\columnwidth}
\centering
\includegraphics[width=\linewidth]{example-image}
\caption{erstes Bild}
\end{minipage}\hfill
\begin{minipage}{\columnwidth}
\centering
\includegraphics[width=\linewidth]{example-image}
\caption{zweites Bild}
\end{minipage}
\end{figure*}
\afterpage{%
\begin{figure}
\centering
\includegraphics[width=\linewidth]{example-image}
\caption{drittes Bild}
\end{figure}}


\Blindtext[8]

\end{document} Das funktioniert aber nicht immer, wie gewünscht.

PS: Eigentlich ist das ein komplett neues Thema und es wäre gut gewesen, wenn Du dafür eine komplett neue Frage gestellt hättest. So stört es die Übersicht erheblich und erschwert die Suche. Bitte beachte das künftig.