Programmablaufplan Thema ist als GELÖST markiert

Tabellen und Grafiken erstellen und anordnen


Robert2000
Forum-Anfänger
Forum-Anfänger
Beiträge: 19
Registriert: Do 27. Okt 2022, 09:07

Programmablaufplan

Beitrag von Robert2000 »

Guten Morgen,

Ich möchte gerne per LaTeX ein PAP erstellen und eigentlich klappt auch alles wie gewollte.
Nur habe ich zwei Probleme.
  • Platzmangel: Meine PAP ist etwas größer geworde, als erwartet. Wie bekomme ich das etwas kleiner hin bzw. würde den PAP nach oben links verschieben wollen, sodass alles auf eine Seite passt?
  • Ich habe in der PAP ein Block, was "Back to ..." (grün) heißt. Dieser dient eigentlich nur dazu, dass ich zurück zu meiner "decision" zurückkomme. Würde gerne den Block weglassen. Und ist es möglich, den Pfeil auf einen anderen Pfeil zu führen? Das wäre der Pfeil, über "decision".


Hier ist einmal mein Code:
\documentclass{article}

\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\begin{document}
	\pagestyle{empty}
	
	
	% Define block styles
	\tikzstyle{decision} = [diamond, draw, fill=yellow!20, 
	text width=5.3em, text badly centered, node distance=3cm, inner sep=0pt]
	
	\tikzstyle{block} = [rectangle, draw, fill=blue!20, 
	text width=5em, text centered, rounded corners, minimum height=4em]
	
	\tikzstyle{line} = [draw, -latex']
	
	\tikzstyle{cloud} = [draw, ellipse,fill=red!20, node distance=3cm,
	minimum height=2em]
	
	\tikzstyle{process} = [rectangle, draw, fill=green!20, 
	text width=5em, text centered, rounded corners, minimum height=2em]
	
	\begin{tikzpicture}[node distance = 2cm, auto]
		% Place nodes
		\node [cloud] (init) {Start};
		
		\node [block, below of=init] (time) {END\_TIME = 30s};
		
		\node [decision, below of=time] (timestamp) {timestamp $<$ END\_TIME};
		
		\node [block, below of=timestamp, node distance=3.5cm] (output) {Output $<$ TIME\_END};
		
		\node [process, left of=output, node distance=3.5cm] (loop) {Back to the loop};
		
		\node [block, right of=timestamp, node distance=4.5cm] (passedtime) {passed\_time = monotonic - timestamp};
		
		\node [decision, below of=passedtime] (if0) {passed\_time $<=$ 6s};
		
		\node [block, below of=if0, node distance=3.5cm] (SAMPLE0) {print passed\_time, sample\_0};
		
		\node [process, left of=SAMPLE0, node distance=2.5cm] (loopelif) {Back to the if-Statement};
		
		\node [decision, right of=if0, node distance=4.5cm] (elif1) {passed\_time $<=$ 12s};
		
		\node [block, right of=elif1, node distance=3.5cm] (SAMPLE1) {print passed\_time, sample\_1};
		
		
		
		% Draw edges
		\path [line] (init) -- (time);
		
		\path [line] (time) -- (timestamp);
		
		\path [line] (timestamp) -- node {yes}(output);
		
		\path [line] (output) -- (loop);
		
		\path [line] (loop) |- (timestamp);
		
		\path [line] (timestamp) -- node {no}(passedtime);
		
		\path [line] (passedtime) -- (if0);
		
		\path [line] (if0) -- node {yes}(SAMPLE0);
		
		\path [line] (SAMPLE0) -- (loopelif);
		
		\path [line] (loopelif) |- (if0);
		
		\path [line] (if0) -- node {no}(elif1);
		
		\path [line] (elif1) -- node {yes}(SAMPLE1);
		
	\end{tikzpicture}
	
	
\end{document}
Bin für jede Hilfe dankbar.

Grüße
Robert

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2485
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

Re: Programmablaufplan

Beitrag von Stefan Kottwitz »

Hallo Robert,

willkommen im Forum!

Die Seitenränder sind hier sehr groß, da hast Du wenig Platz für das Bild. Warum ist es die article-Klasse mit voreingestellten (breiten) Rändern? Ist Dein Gesamtdokument so? Ist das Bild Bestandteil eines Dokuments, oder alleinstehend? Wenn letzteres, könntest Du die standalone-Klasse verwenden.

Ansonsten kann man eben Ränder ändern, es links und rechts gleichmäßig in den Rand ragen lassen, es mit scale und transform shape Optionen verkleinern (geht schnell), oder es anders aufbauen. Z.B. kann doch auch das letzte "yes" rechts nach unten gehen.

Du brauchst den loop-node nicht zwingend zeichnen, erweitere eben etwas den Pfad. Und hier gleich mit dem neuen Zielpunkt, mittig zwischen den Nodes auf den Pfeil, mit der calc-Library-Syntax:
\path [line] (output) -- ++(-3.5cm,0cm) |- ($(timestamp.north)!0.5!(time.south)$);
Hier mal zum Testen, die mich störenden vielen Leerzeilen habe ich mal weggelassen, und den Befehl \tikzset statt des nicht mehr empfohlenen \tikzstyle benutzt, und die Schrift in den Nodes mal serifenlos gemacht um mal zu sehen, wie der Eindruck sich ändert - Serifen-Schrift in Diagrammen finde ich nicht so schick, ist natl. Deine Wahl.
\documentclass{article}
\usepackage[left=1cm,right=1cm]{geometry}% nur als Rand-Demo
\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,calc}
% Define block styles
\tikzset{decision/.style = {diamond, draw, fill=yellow!20, 
		text width=5.3em, text badly centered, node distance=3cm, inner sep=0pt},
	block/.style = {rectangle, draw, fill=blue!20, 
		text width=5em, text centered, rounded corners, minimum height=4em},
	line/.style = {draw, -latex'},
	cloud/.style = {draw, ellipse,fill=red!20, node distance=3cm,
  		minimum height=2em},
	process/.style = {rectangle, draw, fill=green!20, 
		text width=5em, text centered, rounded corners, minimum height=2em},
	every node/.append style = {font=\sffamily}}
\begin{document}%
	\pagestyle{empty}%
	\begin{tikzpicture}[node distance = 2cm, auto]
		% Place nodes
		\node [cloud] (init) {Start};
		\node [block, below of=init] (time) {END\_TIME = 30s};
		\node [decision, below of=time] (timestamp) {timestamp $<$ END\_TIME};
		\node [block, below of=timestamp, node distance=3.5cm] (output) {Output $<$ TIME\_END};
		\node [block, right of=timestamp, node distance=4.5cm] (passedtime) {passed\_time = monotonic - timestamp};
		\node [decision, below of=passedtime] (if0) {passed\_time $<=$ 6s};
		\node [block, below of=if0, node distance=3.5cm] (SAMPLE0) {print passed\_time, sample\_0};
		\node [process, left of=SAMPLE0, node distance=2.5cm] (loopelif) {Back to the if-Statement};
		\node [decision, right of=if0, node distance=4.5cm] (elif1) {passed\_time $<=$ 12s};
		\node [block, right of=elif1, node distance=3.5cm] (SAMPLE1) {print passed\_time, sample\_1};
		% Draw edges
		\path [line] (init) -- (time);
		\path [line] (time) -- (timestamp);
		\path [line] (timestamp) -- node {yes}(output);
		\path [line] (output) -- ++(-3.5cm,0cm) |- ($(timestamp.north)!0.5!(time.south)$);
		\path [line] (timestamp) -- node {no}(passedtime);
		\path [line] (passedtime) -- (if0);
		\path [line] (if0) -- node {yes}(SAMPLE0);
		\path [line] (SAMPLE0) -- (loopelif);
		\path [line] (loopelif) |- (if0);
		\path [line] (if0) -- node {no}(elif1);
		\path [line] (elif1) -- node {yes}(SAMPLE1);
	\end{tikzpicture}
\end{document}
Stefan

Robert2000
Forum-Anfänger
Forum-Anfänger
Beiträge: 19
Registriert: Do 27. Okt 2022, 09:07

Re: Programmablaufplan

Beitrag von Robert2000 »

Hallo Stefan,

der Programmablaufplan ist ein alleinstehendes Dokument. Dein Beispiel war genau das, was ich gesucht habe.
Hier ist einmal meine Version:
\documentclass{article}
\usepackage[left=6cm,right=1cm,top=0.5cm,bottom=0cm]{geometry}% nur als Rand-Demo
\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,calc}
% Define block styles
\tikzset{decision/.style = {diamond, draw, fill=yellow!20, 
		text width=5.3em, text badly centered, node distance=3cm, inner sep=0pt},
	block/.style = {rectangle, draw, fill=blue!20, 
		text width=8em, text centered, rounded corners, minimum height=4em},
	line/.style = {draw, -latex'},
	cloud/.style = {draw, ellipse,fill=red!20, node distance=3cm,
		minimum height=2em},
	process/.style = {rectangle, draw, fill=green!20, 
		text width=5em, text centered, rounded corners, minimum height=2em},
	every node/.append style = {font=\sffamily}}
\begin{document}%
	\pagestyle{empty}%
	\begin{tikzpicture}[node distance = 2cm, auto]
		% Place nodes
		\node [cloud] (init) {Start};
		\node [block, below of=init] (time) {END\_TIME = 30s};
		\node [decision, below of=time] (timestamp) {monotonic() - timestamp $<$ END\_TIME};
		\node [cloud, below of=timestamp, node distance=2.5cm] (init2) {Stop};
		\node [block, left of=timestamp, node distance=4.5cm] (passedtime) {passed\_time = (monotonic() - timestamp)*1000};
		\node [decision, below of=passedtime, node distance=4.5cm, fill=green!20] (if0) {passed\_time $<=$ 6s};
		\node [block, right of=if0, node distance=4.5cm, fill=orange!20] (SAMPLE0) {print(passed\_time, sample\_0)};
		\node [decision, below of=if0, node distance=4.0cm, fill=green!20] (elif1) {passed\_time $<=$ 12s};
		\node [block, right of=elif1, node distance=4.5cm, fill=orange!20] (SAMPLE1) {print(passed\_time, sample\_1)};
		\node [decision, below of=elif1, node distance=4.0cm, fill=green!20] (elif2) {passed\_time $<=$ 18s};
		\node [block, right of=elif2, node distance=4.5cm, fill=orange!20] (SAMPLE2) {print(passed\_time, sample\_2)};
		\node [decision, below of=elif2, node distance=4.0cm, fill=green!20] (elif3) {passed\_time $<=$ 24s};
		\node [block, right of=elif3, node distance=4.5cm, fill=orange!20] (SAMPLE3) {print(passed\_time, sample\_3)};
		\node [decision, below of=elif3, node distance=4.0cm, fill=green!20] (elif4) {passed\_time $<=$ 30s};
		\node [block, right of=elif4, node distance=4.5cm, fill=orange!20] (SAMPLE4) {print(passed\_time, sample\_4)};
		
		% Draw edges
		\path [line] (init) -- (time);
		\path [line] (time) -- (timestamp);
		\path [line] (timestamp) -- node {yes}(passedtime);
		\path [line] (timestamp) -- node {no}(init2);
		\path [line] (passedtime) -- (if0);
		\path [line] (if0) -- node {yes}(SAMPLE0);
		\path [line] (SAMPLE0) -- ++(2.5cm,0cm) |- ($(timestamp.north)!1.0!(timestamp.east)$);
		\path [line] (if0) -- node {no}(elif1);
		\path [line] (SAMPLE1) -- ++(2.5cm,0cm) |- ($(timestamp.west)!1.0!(timestamp.east)$);	
		\path [line] (elif1) -- node {yes}(SAMPLE1);
		\path [line] (elif1) -- node {no}(elif2);
		\path [line] (elif2) -- node {yes}(SAMPLE2);
		\path [line] (SAMPLE2) -- ++(2.5cm,0cm) |- ($(timestamp.west)!1.0!(timestamp.east)$);
		\path [line] (elif2) -- node {no}(elif3);
		\path [line] (elif3) -- node {yes}(SAMPLE3);
		\path [line] (SAMPLE3) -- ++(2.5cm,0cm) |- ($(timestamp.west)!1.0!(timestamp.east)$);
		\path [line] (elif3) -- node {no}(elif4);
		\path [line] (elif4) -- node {yes}(SAMPLE4);
		\path [line] (SAMPLE4) -- ++(2.5cm,0cm) |- ($(timestamp.west)!1.0!(timestamp.east)$);
	\end{tikzpicture}
\end{document}
Vielen Dank für deine Hilfe.

Beste Grüße
Robert

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2485
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

Re: Programmablaufplan

Beitrag von Stefan Kottwitz »

Hallo Robert,

für alleinstehende Dokumente kann man einfach die standalone-Klasse verwenden, dann kann Dir der Rand egal sein.

Ich nutze routinemäßig
\documentclass[tikz,border=10pt]{standalone}
Durch die erste Option lädt die Klasse TikZ, die zweite Option setzt einen kleinen Rand. Letzteres mache ich, damit es nicht nicht so "eng geschnitten" aussieht, etwa wenn man die Grafik auf eine Webseite setzt, etwa auf TikZ.net/ oder TeXample.net. Dort findest Du viele Beispiele. Auf TeXample.net oft noch ohne die standalone-Klasse, weil es die zu der Zeit noch nicht gab.

Stefan

Robert2000
Forum-Anfänger
Forum-Anfänger
Beiträge: 19
Registriert: Do 27. Okt 2022, 09:07

Re: Programmablaufplan

Beitrag von Robert2000 »

"für alleinstehende Dokumente kann man einfach die standalone-Klasse verwenden, dann kann Dir der Rand egal sein."

Alles klar, werden das dann so machen. Ich danke dir Stefan.

Beste Grüße
Robert

Antworten