Vermeidung von Linienkreuzungen

Vermeidung von Linienkreuzungen

ich möchte so etwas machen:Nicht-kreuzende Linien im Klassendiagramm

damit: http://www.texample.net/tikz/examples/oxidation-and-reduction/

Es wird ungefähr so ​​aussehen:

https://i.stack.imgur.com/4fLoS.png

Antwort1

Hier ist eine Möglichkeit mit der intersectionsBibliothek vonTikZ:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}

\newcommand\tikzmark[1]{%
  \tikz[remember picture,overlay]\node[inner xsep=0pt,inner ysep=10pt,outer sep=0pt] (#1) {};}

\begin{document}

\[
\tikzmark{c}2:\tikzmark{a}3 + 5:\tikzmark{d}3+\tikzmark{b}2:3+5:3
\]

\begin{tikzpicture}[remember picture,overlay]
\draw[name path=line1,red,->] ([xshift=2pt]a.north east) -- +(0pt,10pt) -| ([xshift=2pt]b.north east);
\path[name path=line2] ([xshift=2pt]c.north east) -- +(0pt,23pt) -| ([xshift=2pt]d.north east);
\draw[name intersections={of=line1 and line2,by={int}},draw,->,red] 
  ([xshift=2pt]c.north east) -- +(0pt,23pt) -| ([yshift=3pt]int) arc(90:-90:2.5pt) -- ([xshift=2pt]d.north east);
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

Die Idee besteht darin, mithilfe der Allgegenwärtigkeit \tikzmarkMarkierungen für die Pfade zu setzen, dann den Schnittpunkt beider Pfade zu finden und anschließend an diesem Schnittpunkt einen Bogen zu zeichnen.

Die erste Ausführung des obigen Codes führt zu einem Fehler:

! Package pgf Error: No shape named intersection-1 is known.

See the pgf package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.19 ...{of=line1 and line2,by={int}},draw,->,red]

da die Koordinaten der Markierungen noch nicht bekannt sind, schlägt die Berechnung der Schnittpunkte der Pfade fehl. Ein Abbruch der Kompilierung und eine erneute Kompilierung sollten das gewünschte Ergebnis bringen.

Im Chat,David Carlisleschlug folgende Änderung vor:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}

\newcommand\tikzmark[1]{%
  \tikz[remember picture,overlay]\node[inner xsep=0pt,inner ysep=10pt,outer sep=0pt] (#1) {};%
}

\begin{document}

\[
\tikzmark{c}2:\tikzmark{a}3 + 5:\tikzmark{d}3+\tikzmark{b}2:3+5:3
\]

\expandafter \ifx\csname pgf@sys@pdf@mark@pos@pgfid\the \csname
pgf@picture@serial@count\endcsname\endcsname\relax
\typeout{no}%
\else
\typeout{yes}%
\begin{tikzpicture}[remember picture,overlay]
\draw[name path=line1,red,->] ([xshift=2pt]a.north east) -- +(0pt,10pt) -| ([xshift=2pt]b.north east);
\path[name path=line2] ([xshift=2pt]c.north east) -- +(0pt,23pt) -| ([xshift=2pt]d.north east);
\draw[name intersections={of=line1 and line2,by={int}},draw,->,red] 
  ([xshift=2pt]c.north east) -- +(0pt,23pt) -| ([yshift=3pt]int) arc(90:-90:2.5pt) -- ([xshift=2pt]d.north east);
\end{tikzpicture}
\fi

\end{document}

das erzeugt keine Fehler. Das Dokument muss dreimal ausgeführt werden.

JetztSchlagzeughat diese Alternative bereitgestellt:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}

\newcommand\tikzmark[1]{%
  \tikz[remember picture,overlay]\node[inner xsep=0pt,inner ysep=10pt,outer sep=0pt] (#1) {};}

\begin{document}

\[
\tikzmark{c}2:\tikzmark{a}3 + 5:\tikzmark{d}3+\tikzmark{b}2:3+5:3
\]

\begin{tikzpicture}[remember picture,overlay]
\draw[name path=line1,red,->] ([xshift=2pt]a.north east) -- +(0pt,10pt) -| ([xshift=2pt]b.north east);
\path[name path=line2] ([xshift=2pt]c.north east) -- +(0pt,23pt) -| ([xshift=2pt]d.north east);
\path[name intersections={of=line1 and line2,total=\totinter}] \pgfextra{\xdef\totinter{\totinter}};
\ifnum\totinter=0\relax%
\else
\path[name intersections={of=line1 and line2,by={int}}];
  \draw[,draw,->,red] ([xshift=2pt]c.north east) -- +(0pt,23pt) -| ([yshift=3pt]int) arc(90:-90:2.5pt) -- ([xshift=2pt]d.north east);
\fi
\end{tikzpicture}


\end{document}

verwandte Informationen