Ich versuche, ein Pfeil, so wie er in schwarz eingezeichnet ist zu platzieren (er soll zwischen e und f verlaufen, angefangen bei der Linie ausgehend von c).

Ich habe es damit versucht, mit Hilfe von below=of zwei Hilfskoordinaten zu erstellen und den Start des Pfeils auf die zweite Hilfskoordinate (hilfps2) zu setzen. Ich bin davon ausgegangen, dass sich diese Koordinate on grid zwischen e und f (auf Höhe c) befindet - das tut sie aber nicht.

Open in Online-Editor
\node [coord, below=of c] (hilfps) {};

z.B. bin ich davon ausgegangen, dass hilfps auf der Höhe von e platziert wird. Aber es landet direkt unter c. Daher bringt mir die zweite Hilfsvariable auch nichts. Die ist viel zu weit oben.

  1. Wie sollte ich vorgehen? Gibt es noch Alternativen zum Erstellen von Hilfskoordinaten mit below=of... ? Ich möchte auch ungern manuell mit yshift einen Offset vorgeben. Wenn das Bild mal größer wird, blicke ich dann nicht mehr durch...
  2. Wie ihr im Code sehen könnt, musste ich die node coord h weiter unten platzieren, da bereits vorher auf sie referenziert wird. Jetzt wäre es schön, wenn ich alle nodes eines Typs in einen Block schreiben könnte. So muss ich immer aufpassen, wann ich eine node deklariere- dadurch wird der Code sehr unübersichtlich. Wie kann man das vermeiden?

Open in Online-Editor
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,arrows.meta,calc}

\colorlet{lcfree}{green}
\colorlet{lcnorm}{blue}
\colorlet{lccong}{red}

% globale Settings
\tikzset{
    base/.style={draw, on grid, align=center, minimum height=4ex},
    proc/.style={base, rectangle, text width=10em},
    var/.style={base, circle, text width=4ex},
    %% Stil für Hilfskoordinaten
    coord/.style={coordinate, on grid, node distance=6mm and 20mm},
    % Stile für Verbindungslinien
    norm/.style={->, draw, lcnorm},
    free/.style={->, draw, lcfree},
    cong/.style={->, draw, lccong},
    % Stil für Kreuzungen von Pfaden
    jump/.style args={(#1) to (#2) over (#3) by #4}{
        insert path={
            let \p1=($(#1)-(#3)$), \n1={veclen(\x1,\y1)}, 
            \n2={atan2(\y1,\x1)}, \n3={abs(#4)}, \n4={#4>0 ?180:-180}  in 
            (#1) -- ($(#1)!\n1-\n3!(#3)$) 
            arc (\n2:\n2+\n4:\n3) -- (#2)
        }
     }
    }

\begin{document}
\begin{tikzpicture}[%
    >={Triangle[angle=60:5pt]},% Form der Pfeilspitzen
    node distance=20mm and 30mm, % Vorgaben für Abstände zwischen Nodes in dieser Zeichnung
    every join/.style={norm},   % Default linetype for connecting boxes
    ]

\begin{scope}[nodes=var]
    \node (0) {0};
    \node [right=of 0] (a) {a};
    \node [right=of a] (b) {b};
    \node [right=of b] (c) {c};

    \node [below=of a] (d) {d};
    \node [below=of b] (e) {e};
\end{scope}

\node [coord, below=of e] (hilf) {};% Hilfskoordinate für definierten Zusatzabstand
\node [coord, below=of c] (hilfps) {};
\node [coord, below=of hilfps] (hilfps2) {};

\begin{scope}[nodes=proc]
    \node [below=of hilf] (f) {f};
    \node [below=of f] (g) {ggg};
    \node (h) at (0|-g) {hhh};
\end{scope}

\node [coord, right=12mm of h.north] (hilfps3){};

\begin{scope}[every path/.append style=free]
    \foreach \start/\end in 
        {a/d,b/e,e/f,0/h,f/g,h/g}
        \path(\start)--(\end);
    \path (c)|-(f);
    \path (d)|-(f);
    \path (hilfps)-|(hilfps3);
    %über Kreuz
    \path (a) -- coordinate(bd-ae) (e);
    \path [jump=(b) to (d) over (bd-ae) by 6pt];
\end{scope}
\end{tikzpicture}
\end{document}

gefragt 25 Okt '16, 10:08

SF6's gravatar image

SF6
15953440
Akzeptiert-Rate: 0%

bearbeitet 25 Okt '16, 11:04

Henri's gravatar image

Henri
15.7k133943


Mit

Open in Online-Editor
coord/.style={coordinate, on grid, node distance=6mm and 20mm},

hast Du eingestellt, dass mit

Open in Online-Editor
\node [coord, below=of c] (hilfps) {};

das Zentrum der Node hilfps 6mm unterhalb der Mitte des Nodes c liegt und mit

Open in Online-Editor
\node [coord, below=of hilfps] (hilfps2) {};

das Zentrum der Node hilfps2 6mm unterhalb der Mitte des Nodes hilfps und damit 12mm unterhalb des Zentrums von c ist.

Für andere Nodes in der tikzpicture Umgebung hast Du aber

Open in Online-Editor
node distance=20mm and 30mm, % Vorgaben für Abstände zwischen Nodes in dieser Zeichnung

eingestellt. Damit liegt die Koordinate hilfps2 noch oberhalb der Zentren von d und e, die von den Zentren a bzw. b 2cm entfernt sind.

Eine Möglichkeit wäre die Koordinate hilfps direkt auf der Höhe von hilf zu platzieren:

Open in Online-Editor
\node [coord, below=of e] (hilf) {};% Hilfskoordinate für definierten Zusatzabstand
\node [coord] (hilfps) at (hilf-|c) {};
\node [coord, below= of hilfps] (hilfps2) {};

Wenn Nodes und Koordinaten relativ zueinander positioniert werden, kann man die Reihenfolge von deren Definition naturgemäß nicht beliebig ändern.

Im folgenden Bild sind die Hilfspunkte mit farbigen Kreuzen markiert:

alt text

Den Code habe ich nur ein klein wenig umsortiert:

Open in Online-Editor
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,arrows.meta,calc}

\colorlet{lcfree}{green}
\colorlet{lcnorm}{blue}
\colorlet{lccong}{red}

% globale Settings
\tikzset{
    base/.style={draw, on grid, align=center, minimum height=4ex},
    proc/.style={base, rectangle, text width=10em},
    var/.style={base, circle, text width=4ex},
    %% Stil für Hilfskoordinaten
    coord/.style={coordinate, on grid, node distance=6mm and 20mm},
    % Stile für Verbindungslinien
    norm/.style={->, draw, lcnorm},
    free/.style={->, draw, lcfree},
    cong/.style={->, draw, lccong},
    % Stil für Kreuzungen von Pfaden
    jump/.style args={(#1) to (#2) over (#3) by #4}{
        insert path={
            let \p1=($(#1)-(#3)$), \n1={veclen(\x1,\y1)}, 
            \n2={atan2(\y1,\x1)}, \n3={abs(#4)}, \n4={#4>0 ?180:-180}  in 
            (#1) -- ($(#1)!\n1-\n3!(#3)$) 
            arc (\n2:\n2+\n4:\n3) -- (#2)
        }
     }
    }

\begin{document}
\begin{tikzpicture}[%
    >={Triangle[angle=60:5pt]},% Form der Pfeilspitzen
    node distance=20mm and 30mm, % Vorgaben für Abstände zwischen Nodes in dieser Zeichnung
    every join/.style={norm},   % Default linetype for connecting boxes
    ]

\begin{scope}[nodes=var]
    \node (0) {0};
    \node [right=of 0] (a) {a};
    \node [right=of a] (b) {b};
    \node [right=of b] (c) {c};

    \node [below=of a] (d) {d};
    \node [below=of b] (e) {e};
\end{scope}

\begin{scope}[nodes=coord]
\node [below=of e] (hilf) {};% Hilfskoordinate für definierten Zusatzabstand
\node (hilfps) at (hilf-|c){};
\node [below=of hilfps] (hilfps2) {};
\end{scope}

\begin{scope}[nodes=proc]
    \node [below=of hilf] (f) {f};
    \node [below=of f] (g) {ggg};
    \node (h) at (0|-g) {hhh};
    \node [coord, right=12mm of h.north] (hilfps3){};
\end{scope}

% farbiges Markieren der Hilfspunkte
\foreach \coord/\color in {hilf/blue,hilfps/orange,hilfps2/red,hilfps3/black}
    \node[\color]at(\coord){x};

\begin{scope}[every path/.append style=free]
    \foreach \start/\end in 
        {a/d,b/e,e/f,0/h,f/g,h/g}
        \path(\start)--(\end);
    \path (c)|-(f);
    \path (d)|-(f);
    \path (hilfps2)-|(hilfps3);
    %über Kreuz
    \path (a) -- coordinate(bd-ae) (e);
    \path [jump=(b) to (d) over (bd-ae) by 6pt];
\end{scope}
\end{tikzpicture}
\end{document}
Permanenter link

beantwortet 25 Okt '16, 10:49

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

bearbeitet 25 Okt '16, 11:21

Danke für die Antwort. Das passt soweit. Jetzt versuche ich mich daran (wer hätte es gedacht...) die jump Funktion für eben diese Linie zu nutzen.

Diese soll von hilfps2 bis hilfps3 über "Eck" gehen und d,f und e,f, kreuzen. Wie kann ich das "|-" syntax-korrekt in die jump-Funktion einbauen? Oder muss ich mir dazu neue Hilfspunkte definieren?

(25 Okt '16, 12:51) SF6

@SF6 Ist das nicht eher eine neue Frage?

(25 Okt '16, 13:05) saputello

Wohl war, aber ich möchte ungern für jede "Kleinigkeit" eine neue Frage beginnen. Oder ist das hier so explizit erwünscht?

(25 Okt '16, 13:12) SF6

@SF6 Wir wollen hier möglichst eng umrissene Fragen und möglichst wenig ausufernde Diskussionen, in denen sich Fragen immer weiter entwickeln und die Antworten entsprechend angepasst werden müssen. Das wäre eher etwas für ein Diskussionsforum. Stattdessen bevorzugen wir hier eher neue Fragen mit dazu passendem Minimalbeispiel. Falls notwendig, kann ein Link auf eine frühere Frage gesetzt werden.

(25 Okt '16, 13:43) saputello
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×731
×13
×9

gestellte Frage: 25 Okt '16, 10:08

Frage wurde gesehen: 6,780 Mal

zuletzt geändert: 25 Okt '16, 13:43