Gostaria de alterar o código abaixo para usar o método de junção de cadeias em vez de colocar um nó no meio. alguma ideia para implementá-lo?
\documentclass[border=10mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.arrows, calc,chains}
\tikzset{
myarr/.style args={#1 -- #2}{
insert path={let \p1=($(#1)-(#2)$) in},
single arrow, draw=black, minimum width=20mm, minimum height={veclen(\x1,\y1)},
inner sep=0mm, single arrow head extend=1pt,
},
every join/.style={->},
}
\begin{document}
\begin{tikzpicture}[start chain=going right,node distance= 2cm and 2cm]
\def\data{
A,
B,
C,
D%
}
\foreach \p [count=\i from 1] in \data {
\node[draw,on chain,join,minimum width=2cm,minimum height=4cm] (P\i) {\p};
}
% move below logic to use join method
\path (P1) -- (P2) node[midway,->,myarr={P1.east -- P2.west},single arrow] {};
\path (P2) -- (P3) node[midway,->,myarr={P2.east -- P3.west},single arrow] {};
\path (P3) -- (P4) node[midway,->,myarr={P3.east -- P4.west},single arrow] {};
\end{tikzpicture}
\end{document}
Responder1
Você pode colocar um nó por meio de uma junção em uma cadeia simplesmente configurando um to path
que faz exatamente isso: colocar um nó.
Dentro de a to path
, você tem acesso a \tikztostart
e \tikztotarget
– assim como, \tikztonodes
mas vamos ignorar isso aqui… ou você precisa de texto em algum lugar?
A diferença pode então ser calculada como antes, assim como a sua veclen
e, adicionalmente, também a sua direção/ângulo através de atan2
. Os resultados podem então ser usados com um node
como antes, que agora é a única saída (visual) do arquivo to path
.
Tudo isso é feito no myarr with anchors
estilo:
\tikzset{
myarr with anchors/.style 2 args={
to path={
let \p0=($(\tikztotarget.#2)-(\tikztostart.#1)$) in
node[myarr node,
minimum height={veclen(\x0,\y0)},
shape border rotate={atan2(\y0,\x0)}] at (\tikztostart.#1) {}}}}
Para cadeias simples, é tão fácil quanto
\tikz[
start chain=going right, node distance=2cm and 2cm,
every join/.style={myarr with anchors={east}{west}},
every on chain/.append style={draw, minimum width=2cm, minimum height=4cm}]
\node foreach \t in {A, ..., D} [on chain, join]{\t};
Eu gosto de abordagens mais automáticas, nas quais ele encontrará sozinho os pontos da fronteira.
Para isso, forneço o myarr
estilo que utiliza an edge
para encontrar os pontos na borda e depois os utiliza no mesmo cálculo de antes.
Opcionalmente, ele também aceita dois argumentos que estão vazios (abordagem automática ou não é um nó) ou contêm uma especificação de âncora (com .
).
Referência:Podemos usar `let` (de `TikZ`) dentro da definição de estilo de um nó?.
Código
\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.arrows, calc, chains}
\tikzset{
myarr node/.style={
shape=single arrow, draw=black, minimum width=20mm, anchor=tail,
shape border uses incircle, single arrow head extend=+1pt,
inner sep=+0pt, outer sep=+0pt},
%
myarr with anchors/.style 2 args={
to path={
let \p0=($(\tikztotarget.#2)-(\tikztostart.#1)$) in
node[myarr node,
minimum height={veclen(\x0,\y0)},
shape border rotate={atan2(\y0,\x0)}] at (\tikztostart.#1) {}}},
%
myarr/.default={}{},
myarr/.style 2 args={
to path={
\expanded{
(\tikztostart#1) edge[path only, overlay, line to]
coordinate[at start] (@start)
coordinate[at end] (@end) (\tikztotarget#2)}
let \p0=($(@end)-(@start)$) in
node[myarr node,
minimum height={veclen(\x0,\y0)},
shape border rotate={atan2(\y0,\x0)}] at (@start) {}}}}
\begin{document}
\pgfmathsetseed{872607}
\tikz[
start chain=going right, node distance=2cm and 2cm,
every join/.style={myarr with anchors={east}{west}},
every on chain/.append style={draw, minimum width=2cm, minimum height=4cm}]
\node foreach \t in {A, ..., D} [on chain, join]{\t};
\tikz[
start chain=going right, node distance=2cm and 2cm,
every join/.style=myarr,
every on chain/.append style={draw, minimum width=2cm, minimum height=4cm}]
\node foreach \t in {A, ..., D} [on chain, join]{\t};
\tikz[
start chain=going above right, node distance=.4cm and 2cm,
every join/.style=myarr,
every on chain/.append style={draw, circle, minimum size=2cm}]
\node foreach \t in {A, ..., D} [on chain, join, shift={(3*rand, 3*rand)}]{\t};
\tikz[
start chain=going above right, node distance=.4cm and 2cm,
every join/.style={myarr={.north east}{.south west}},
every on chain/.append style={draw, minimum width=2cm, minimum height=1cm}]
\node foreach \t in {A, ..., D} [on chain, join]{\t};
\end{document}
Saída
Responder2
Não tenho certeza do que você está tentando fazer, mas possivelmente você quer algo como o seguinte?
\documentclass[border=10mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.arrows, calc,chains}
\tikzset{
myarr/.style args={#1 -- #2}{
insert path={let \p1=($(#1)-(#2)$) in},
single arrow, draw=black, minimum width=20mm, minimum height={veclen(\x1,\y1)},
inner sep=0mm, single arrow head extend=1pt,
},
my arr/.style={
insert path={let \p1=(20mm,0pt) in},
single arrow, draw=black, minimum width=20mm, minimum height={veclen(\x1,\y1)},
inner sep=0mm, single arrow head extend=1pt,
},
}
\begin{document}
\begin{tikzpicture}[start chain=going right,node distance=2cm and 0cm]
\def\data{
A,
B,
C,
D%
}
\foreach \p [count=\i from 1,remember=\i as \ilast] in \data {
\edef\tempa{1}\edef\tempb{\i}%
\ifx\tempa\tempb\relax
\else \node (A-\ilast-\i) [draw,on chain,my arr] {};
\fi
\node[draw,on chain,join,minimum width=2cm,minimum height=4cm] (P\i) {\p};
}
\end{tikzpicture}
\end{document}
Responder3
Uma pequena variação da boa resposta do @cfr.
- A junção de macro destina-se (ao que parece) apenas a desenhar setas (de qualquer tipo) entre nós, mas não é capaz de inserir nós entre eles.
- Devido ao acima mencionado você não pode inserir nós com
single arrow
forma entre nós principais em cadeia por macrojoin
. Eles podem ser inseridos apenas como nós normais na cadeia. - Esse
single arrow
nó pode caber perfeitamente entre dois nós principais em cadeia, você precisa definir seu estilo de acordo (veja MWE abaixo). - MWE:
\documentclass[margin=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc, chains,
shapes.arrows}
\begin{document}
\begin{tikzpicture}[
node distance = 0mm,
start chain = going right,
SA/.style = {% single arrow
single arrow, single arrow head extend=3mm,
draw, minimum width=20mm, minimum height=20mm,
inner sep=0mm,
node contents=\vphantom{A},
on chain
},
N/.style = {draw, semithick, on chain,
minimum width=2cm, minimum height=4cm}
]
\def\data{A, B, C, D}
\foreach \i [count=\j] in \data
{
\node[N] {\i};
\ifnum\j<4
\node[SA];
\fi
}
\end{tikzpicture}
\end{document}