Ich möchte ein Bild mit tikz zeichnen. Ich habe links einige nodes untereinander platziert und auf der rechten seite einen größeren, höheren node. Jetzt möchte ich, dass die Pfeile der linken nodes genau horizontal zu dem großen node rechts rüberfliegen. Bis jetzt habe ich das immer nur so auf Augenmaß hingepfuscht.

Beispiel:

\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}

\begin{document}
\begin{tikzpicture}[
    block/.style={
        draw,
        rectangle,
        minimum width=1.5cm
    }
]
    \node[block] (a) at (0,0) {Block a};
    \node[block, below=1 of a] (b) {Block b};
    \node[block, below=1 of b] (c) {Block c};
    \node[block, right=4 of b, minimum height=5cm] (d) {Block d};

    % der ist exakt
    \draw[-stealth] (b) -- (d) node[pos=0.5, above]{\emph{exakt} horizontal};
    % der ist gepfuscht
    \draw[-stealth] (c.east) -- ([yshift=-1.4cm]d.west) node[pos=0.5, above]
    {geschätzt horizontal};
    % der hier auch
    \draw[-stealth] (a.east) -- (d.116) node[pos=0.5, above]
    {geschätzt horizontal};
\end{tikzpicture}
\end{document}

Frage: Gibt es einen eleganteren Weg, tikz zu sagen "schieß die Pfeile exakt horizontal rüber, bis sie auf den nächsten Block treffen"?

Dank dem Link von Bartman hab ich schonmal eine vielversprechende Lösung entdeckt.

Aber irgendwie bin ich gerade zu doof, das umzusetzen :(

Beispielsweise würde ich jetzt Zeile 23 im Code:

\draw[-stealth] (a.east) -- (d.116) node[pos=0.5, above]{geschätzt horizontal};

ersetzen durch:

\draw[-stealth] (a.east |- d) -- (d) node[pos=0.5, above]{geschätzt horizontal};

Dann verschwindet aber der Pfeil von "Block a" zu "Block d" komplett, bzw. der rutscht runter und liegt dann genau auf dem Pfeil von "Block b" nach " Block d".

EDIT: Ich hab jetzt mal hinbekommen, das fühlt sich aber schon arg gepfuscht an: ich habe auf der rechten Seite zwei "unsichtbare" Blöcke, jeweils auf der Höhe von "Block a" und "Block c" erzeugt und anschließend die beiden mit jeweils ihrem unsichtbaren "Partner" verbunden.

Funktioniert zwar und schaut so aus, wie ich es mir erhofft hatte, aber da muss es doch eine schnellere Lösung für geben(?)

So geht es:

\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}

\begin{document}
\begin{tikzpicture}[
    block/.style={
        draw,
        rectangle,
        minimum width=1.5cm,
execute at begin node=\strut
    }
]
    \node[block] (a) at (0,0) {Block a};
    \node[block, below=1 of a] (b) {Block b};
    \node[block, below=1 of b] (c) {Block c};
    \node[block, right=4 of b, draw=white] (d) {Block d};
    % getrickst
    \node[block, above=1 of d, draw=white](astar){};
    \node[block, below=1 of d, draw=white](cstar){};
    \node[block, right=4 of b, minimum height=4cm]{};

    % der ist exakt
    \draw[-stealth] (b) -- (d) node[pos=0.5, above]{\emph{exakt} horizontal};
    % der ist gepfuscht
    \draw[-stealth] (c) -- (cstar) node[pos=0.5, above]
    {geschätzt horizontal};
    % der hier auch
    \draw[-stealth] (a) -- (astar) node[pos=0.5, above]{geschätzt 
    horizontal};
\end{tikzpicture}
\end{document}

gefragt 26 Mai '22, 08:24

AndreGismo's gravatar image

AndreGismo
596826
Akzeptiert-Rate: 72%

bearbeitet 26 Mai '22, 10:28

1

Stefans Antwort sollte auch Deine Frage beantworten können.

(26 Mai '22, 09:39) Bartman

ahh super, das schaut doch vielversprechend aus, danke für den Link! :)

(26 Mai '22, 09:45) AndreGismo

Der zweite Befehl aus Stefans Antwort muss nur geringfügig angepasst werden, um die gewünschte Ausgabe zu bekommen.

Auch der Abschnitt 13.3.1 "Intersections of Perpendicular Lines" im pgfmanual enthält lesenswertes zum Thema.

\documentclass[tikz, border=5pt]{standalone}
\usetikzlibrary{positioning,arrows.meta}

\begin{document}
\begin{tikzpicture}[
    >=Stealth,
    block/.style={
        draw,
%        rectangle,% Standardeinstellung jedes Knoten
        minimum width=1.5cm,
        execute at begin node=\strut
    }
]
    \node[block] (a) {Block a};% at (0,0) ändert hier nichts
    % Die Zuweisung von 1 oder 1cm ist die Voreinstellung von node distance.
    \node[block, below=of a] (b) {Block b};
    \node[block, below=of b] (c) {Block c};
    \node[block, right=4cm of b, minimum height=5cm] (d) {Block d};

    % Drei Befehle werden durch einen ersetzt.
    \path [->]
        (b) edge (d)
        (c) edge (c-|d.west)
        (a) edge (a-|d.west)
    ;
\end{tikzpicture}
\end{document}
Permanenter link

beantwortet 27 Mai '22, 07:44

Bartman's gravatar image

Bartman
1.6k13
Akzeptiert-Rate: 50%

bearbeitet 27 Mai '22, 08:31

ah verstehe, danke!

(30 Mai '22, 08:11) AndreGismo
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
×77
×76
×6
×4

gestellte Frage: 26 Mai '22, 08:24

Frage wurde gesehen: 2,660 Mal

zuletzt geändert: 30 Mai '22, 08:11