Estou desenhando alguns diagramas de blocos com TikZ. Às vezes, preciso combinar vários blocos para formar um grande grupo, adicionando uma borda ao redor dos blocos correspondentes. No entanto, existem algumas setas que atravessam a fronteira, como mostra esta imagem.
A seta "para loop ALC" e a seta logo abaixo parecem feias. O que eu gostaria de fazer é o seguinte (observe as pequenas lacunas ao redor das setas onde elas cruzam a borda grossa):
Como isso é possível com o TikZ? As setas são apenas setas comuns desenhadas com a \draw[->] (from) -- (to);
macro, e a borda grossa também é apenas uma linha comum.
Responder1
Usando @AboAmmar MWE, preaction
pode ser usado no caso simples:
\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}
EDITAR: no entanto, há algum problema - a ponta da seta muda a curvatura do caminho dependendo do tamanho da ponta da seta. Portanto, a ideia não é uma boa solução.
\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: No caso acima, a linha dobrada da seta preta não fica no meio da linha amarela - dependendo do tamanho da seta. Descobri que a resposta @cfr (tamanho da ponta da seta independente da largura da linha) pode ser um pouco útil aqui. O código abaixo funciona apenas quando a configuração da ponta da seta my arrow
é passada por argumento opcional.
\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}
Considerei também o uso da solução @Qrrbrbirlbel (salve um caminho e chame-o para acariciar), mas shorten
a opção não funcionou. Também solução @Paul Gaborit (seta cercada) exclui shorten
a opção (?).
Responder2
Essas lacunas nos cruzamentos de linhas podem ser obtidas com uma linha grossa de cor branca desenhada da mesma forma que a linha de cruzamento. Aqui está um exemplo:
\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}