Я рисую несколько блок-схем с помощью TikZ. Иногда мне нужно объединить несколько блоков вместе, чтобы сформировать одну большую группу, добавив границу вокруг соответствующих блоков. Однако есть несколько стрелок, которые пересекают границу, как показано на этой картинке.
Стрелка "к петле ALC" и стрелка чуть ниже выглядят уродливо. Я бы хотел сделать следующее (обратите внимание на небольшие зазоры вокруг стрелок, где они пересекают толстую границу):
Как это возможно с TikZ? Стрелки — это обычные стрелки, нарисованные макросом \draw[->] (from) -- (to);
, а толстая граница — это тоже обычная линия.
решение1
Использование @AboAmmar MWE preaction
можно использовать в простом случае:
\documentclass[border=2pt]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[> = latex]
\node [draw, thick, minimum size=5em] (rec) {};
\node [draw] (div) {$\div$};
\draw [preaction={draw, line width=3pt, white}][<->] (div) -- ++(5em,0);
\end{tikzpicture}
\end{document}
EDIT: тем не менее есть некоторая проблема - наконечник стрелы меняет изгиб траектории в зависимости от размера этого наконечника стрелы. Так что эта идея не является хорошим решением.
\documentclass[border=2pt]{standalone}
\usepackage{tikz}
\tikzset{
outlined arrow/.style={
preaction={{}-{},draw,line width=3pt,yellow}
}
}
\begin{document}
\begin{tikzpicture}[> = latex]
\node [draw,thick,minimum size=5em] (rec) {};
\node [draw] (div) {$\div$};
\draw [outlined arrow][<->] (div) -- ++(5em,0);
\draw [outlined arrow][<->,shorten <=2pt] (div) .. controls +(-90:15mm) and +(180:15mm) .. ++(5em,-5em);
\end{tikzpicture}
\end{document}
EDIT 2: В приведенном выше случае черная изогнутая линия стрелки не проходит посередине желтой линии - в зависимости от размера стрелки. Я обнаружил, что ответ @cfr (размер наконечника стрелки не зависит от ширины линии) может быть немного полезен здесь. Код ниже работает только тогда, когда настройка наконечника стрелки my arrow
передается через необязательный аргумент.
\documentclass[border=2pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{tikzpicture}[
outlined arrow/.style={preaction={double=yellow,double distance=2pt,draw=red}},
my arrow/.style={>={LaTeX[length=2mm]}},
yscale=0.6
]
\node [draw,thick,minimum size=5em] (rec) {};
\node [draw] (div) {$\div$};
\draw [outlined arrow][<->,my arrow] (div) -- ++(5em,0);
\draw [outlined arrow][<->,shorten <=2pt,my arrow]
(div) .. controls +(-90:15mm) and +(180:15mm) .. ++(5em,-5em);
\end{tikzpicture}
\end{document}
Я также рассмотрел возможность использования решения @Qrrbrbirlbel (сохранить путь и вызвать его для поглаживания), ноshorten
вариант не сработал. Также решение @Paul Gaborit (окруженная стрелка) исключает shorten
вариант (?).
решение2
Эти зазоры на пересечениях линий можно получить с помощью толстой белой линии, нарисованной так же, как ваша линия пересечения. Вот пример:
\documentclass[border=2pt]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[> = latex]
\node [draw, thick, minimum size=5em] (rec) {};
\node [draw] (div) {$\div$};
\draw [<->, line width=3pt, white](div) -- ++(5em,0);
\draw [<->] (div) -- ++(5em,0);
\end{tikzpicture}
\end{document}