Hallo zusammen,

ich würde gerne einer abgeknickten Linie eine Beschriftung hinzufügen. Die Beschriftung soll jedoch genau über dem Zentrum des waagerechten Teils der Linie liegen. In meinem Minimalbeispiel habe ich das ganze über xshift und yshift entsprechend hinbekommen (siehe rot markierter "Satz"). Sobald sich jedoch die Proportionen in der Abbildung ändern, sind natürlich die über xshift und yshift eingefügten Abstände falsch. Daher wüsste ich gerne, ob man das ganze auch automatisch setzen lassen kann. Hier das MB:

\documentclass{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[ngerman]{babel}

% TikZ Beginn Adjustments -----------------------------------------------------------------------------------------------------------------------------
    \usepackage{tikz}
    \usetikzlibrary{intersections,positioning,arrows,calc,patterns,shapes.multipart,fit,backgrounds,decorations.pathreplacing}
    \tikzset{
        pfeil/.style={semithick,->,>=stealth,shorten >=5pt,shorten <=5pt,color=black},
    }
    \newenvironment{tikzschriftgroesse}{\begin{small}}{\end{small}}
% TikZ Ende Adjustments -----------------------------------------------------------------------------------------------------------------------------

\begin{document}
\begin{figure}
\begin{tikzschriftgroesse}
\begin{tikzpicture}[
rechteck/.style={rectangle,draw,minimum width=1.6cm,minimum height=3cm,align=center,inner sep=0cm}
]
% Grid
%   \draw [step=0.5cm,very thin,gray] (0,0) grid(14.5,20);

\matrix(meinematrix)[column sep=1cm,matrix anchor=center,anchor=north,inner sep=0mm] {
    % Erste Zeile
    \node [rechteck](rechteck2){ebenso\\ein\\Tester};   &
                                                        \\
    % Zweite Zeile
                                                        &
    \node [rechteck](rechteck5){ebenso\\ein\\Tester};                                                       \\
    };

\draw [pfeil] (rechteck2.east) -- (rechteck2.east-|rechteck5.north)--(rechteck5.north) node [above,yshift=1.6cm,xshift=-0.8cm] {\textcolor{red}{Satz}};
\draw [pfeil] (rechteck2.south) -- (rechteck2.south|-rechteck5.west)--(rechteck5.west) node [above,yshift=0cm,xshift=-0.95cm] {\textcolor{red}{Satz}};

\end{tikzpicture}
\end{tikzschriftgroesse}
\end{figure}

\end{document}

Vielen Dank für die Hilfe.

gefragt 18 Okt '13, 12:17

josephine's gravatar image

josephine
944253035
Akzeptiert-Rate: 0%

bearbeitet 18 Okt '13, 12:24

cgnieder's gravatar image

cgnieder
22.1k253463


Nimm die Beschriftung direkt an dem waagerechten Teilstück der Linie vor. Wenn die Beschriftung in der Mitte der gezeichneten Linienstücke erfolgen soll, muss dabei deren Verkürzung durch die shorten Optionen berücksichtigt werden:

\documentclass[margin=5mm]{standalone}
    \usepackage{tikz}
    \tikzset{
        pfeil/.style={semithick,->,>=stealth,shorten >=5pt,shorten <=5pt,color=black},
        % Berücksichtgung von shorten bei der Linienbeschriftung:
        lverkuerzt/.style={xshift=2.5pt},rverkuerzt/.style={xshift=-2.5pt},
        tikzschrift/.style={font=\small}
    }

\begin{document}
\begin{tikzpicture}[tikzschrift,
    rechteck/.style={rectangle,draw,minimum width=1.6cm,minimum height=3cm,align=center,inner sep=0cm}
]

\matrix(meinematrix)[column sep=1cm,matrix anchor=center,anchor=north,inner sep=0mm] {
    % Erste Zeile
    \node [rechteck](rechteck2){ebenso\\ein\\Tester};&\\
    % Zweite Zeile
    &\node [rechteck](rechteck5){ebenso\\ein\\Tester};\\
    };

\draw [pfeil] (rechteck2) -- node[lverkuerzt,above,text=red]{Satz}(rechteck2-|rechteck5)--(rechteck5);
\draw [pfeil] (rechteck2) -- (rechteck2|-rechteck5)--node[rverkuerzt,above,text=red]{Satz}(rechteck5);
\end{tikzpicture}
\end{document}

alt text

Permanenter link

beantwortet 18 Okt '13, 13:04

esdd's gravatar image

esdd
17.7k274256
Akzeptiert-Rate: 62%

bearbeitet 18 Okt '13, 14:41

Genau für diesen Zweck gibt es die Keys outer xsep und outer ysep, die standardmäßig auf .5\pgflinewidth gesetzt sind, so dass die Anchors auf dem Rand der Pfade der Node liegen und nicht mitten drin. Auf TeX.sx gibt es dazu bereits eine verwandte Frage unter dem Namen Properly aligning drawn lines between the corners of 2 rectangular nodes in TikZ? Es ist nicht das gleiche Problem, aber zeigt die Sachlage, wie ich finde, ganz deutlich.

Setzt man die outer seps dementsprechend auf .5\pgflinewidth + 5pt, kann man die Linien wie ganz gewöhnlich zeichnen, und auch der Timer für die Nodes (das ist das Dingen, was die pos-Angabe, die auch hinter midway und near start steckt, in die eigentliche Koordinate entlang des Pfades verwandelt) funktioniert wie erwartet.

\documentclass[tikz]{standalone}
\tikzset{
  hv path/.style={to path={-| (\tikztotarget) \tikztonodes}},
  vh path/.style={to path={|- (\tikztotarget) \tikztonodes}}}
\begin{document}
\begin{tikzpicture}[rechteck/.style={
    rectangle, draw, minimum width=+1.6cm, minimum height=+3cm,
    align=center, inner sep=+0pt, outer sep=.5\pgflinewidth+5pt}]
\node [rechteck]             (rechteck2) {ebenso\\ein\\Tester};
\node [rechteck] at (2.6,-3) (rechteck5) {ebenso\\ein\\Tester};
\path[-stealth] (rechteck2) edge[hv path] node[near start, above, red] {Satz} (rechteck5)
                            edge          node[midway, sloped, above]  {Oh!} (rechteck5)
                            edge[vh path] node[near end, above, red]   {Satz} (rechteck5);
\end{tikzpicture}
\end{document}

Diese Lösung hat einen Nachteil: Die Einstellung, dieser Abstand, ist node-gebunden, und kann nachträglich nicht mehr geändert werden. Da die shorten-Optionen pfadgebunden sind, kann man sie auch für jede Verbindung neu setzen.
(Man könnte theoretisch marginal unterschiedlich benannte unsichtbare Duplikate der Nodes mit unterschiedlichen outer seps erstellen und diese dann verwenden, das erzeugt aber viel Müll und macht das ganze fast eher komplizierter.)

Eine etwas aufwändigere Option könnte man mithilfe der calc-Library einführen (man kann selbstverständlich das Ganze auch mit PGF-Mitteln anstellen, calc macht es nur etwas kürzer (aber wie ich finde, schwerer lesbar)).

Nachteil dieser Lösung ist, dass für jede mögliche Verbindung, die Berechnung angepasst werden muss (für einfache Pfade wie -- und -|/|- ist es aber noch sehr einfach). Man beachte, dass der ---Pfad hier im Vergleich zur anderen Lösung länger ist. (Die 5pt sind oben orthogonal zum Nodepfad berechnet, hier entlang des Verbindungspfades.)

\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\tikzset{
  Shorten >/.initial=+5pt, Shorten </.initial=+5pt,
  @Shorten path/.style={to path={
    \pgfextra\pgfinterruptpath
      \path (\tikztostart) #1 coordinate[at start] (s@start)
                              coordinate[midway]   (s@mid)
                              coordinate[at end]   (s@target) (\tikztotarget);
    \endpgfinterruptpath\endpgfextra
       ($(s@start)! \pgfkeysvalueof{/tikz/Shorten <}!(s@mid)$)
    #1 ($(s@target)!\pgfkeysvalueof{/tikz/Shorten >}!(s@mid)$) \tikztonodes}},
  straight path/.style={@Shorten path=--},
  hv path/.style={@Shorten path=-|},
  vh path/.style={@Shorten path=|-}}
\begin{document}
\begin{tikzpicture}[rechteck/.style={
    rectangle, draw, minimum width=+1.6cm, minimum height=+3cm,
    align=center, inner sep=+0pt}]
\node [rechteck]             (rechteck2) {ebenso\\ein\\Tester};
\node [rechteck] at (2.6,-3) (rechteck5) {ebenso\\ein\\Tester};
\path[-stealth] (rechteck2) edge[hv path]       node[near start, above, red] {Satz} (rechteck5)
                            edge[straight path] node[midway, sloped, above]  {Oh!} (rechteck5)
                            edge[vh path]       node[near end, above, red]   {Satz} (rechteck5);
\end{tikzpicture}
\end{document}

Output

alt textalt text

Permanenter link

beantwortet 19 Okt '13, 06:05

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k3815
Akzeptiert-Rate: 53%

Hi Qrrbrbirbel,

danke auch für deine Antwort. Ich hab mich für die Antwort von esdd entschieden, aber nur, weil Sie für meine Zwecke vollkommen ausreichend war. Danke trotzdem für deinen super ausführlichen Vorschlag und deine Zeit.

(21 Okt '13, 11:47) josephine
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:

×730
×50
×35

gestellte Frage: 18 Okt '13, 12:17

Frage wurde gesehen: 14,546 Mal

zuletzt geändert: 21 Okt '13, 11:47