
creo que todos losproblemasLo he preguntado yo u otras personas en el pasado. Pero mi problema general es que no puedo combinar todas estas soluciones con la imagen real que quiero dibujar. Normalmente es bueno separar un problema complejo en otros más simples y preguntar. Pero aquí trato de plantear la pregunta compleja porque experimenté que las soluciones se influyen (en mi caso negativamente) entre sí.
Descripción de las necesidades/problemas:
- Los nodos de la izquierda (
Phase
) deben rotarse. Preferiría una solución con\rotatebox
(node contents={\rotatebox{90}{#1}}}
). - Los nodos (mejor seríafilas) a la derecha están centrados horizontalmente.
- Lógico que la imagen tenga cuatro.filasy los nodos de la izquierda y la derecha deben mostrar eso. Esto significa que un nodo (por ejemplo
right of B
) está centrado verticalmente.contrasu nodo izquierdo. Por favor, vea quePhaseC
pertenece aC1
yC2
,long C3
para que la alineación vertical lo represente. (discutido aquí) - Creo que conectar los nodos con la flecha no debería ser tan difícil.
- Todo debe hacerse de forma relativa. Eso significa que no ,
cm
o algo así.mm
pt
- El número de nodos no es fijo. Podría ser que en la fila uno haya menos nodos que en la fila cuatro.
Algunas soluciones:
\documentclass[tikz]{standalone}
\usepackage{xltxtra}
\usepackage{polyglossia}
\setdefaultlanguage[spelling=new]{german}
\usepackage{tikz}
\usetikzlibrary{scopes,matrix,positioning,chains}
\begin{document}
\begin{tikzpicture}
[
items/.style = {
draw,
align=center},
phase/.style = {
items,
fill=red!20,
node contents={\rotatebox{90}{#1}}}
]
{[
start chain=P going below
]
\node [on chain,phase=PhaseA];
{[
start branch=A going right,
every on chain/.append style=items,
every node/.style=on chain
]
\node {One};
\node {Two};
\node {Three};
\node {Four};
}
\node [on chain,phase=PhaseB];
\node [on chain,phase=PhaseC];
\node [on chain,phase=PhaseD];
{[
start branch=D going right,
every on chain/.append style=items,
every node/.style=on chain
]
\node {D1};
\node {D2};
}
}
% B
\node [right=of P-2,items] {right of B};
% C
\matrix (C) [
matrix of nodes,
row sep=5pt, %2\textheight doesn't work here, maybe a \nodeheight exists?
every node/.append style=items,
right=of P-3]
{
C1 \\
C2 \\
long C3\\
};
\end{tikzpicture}
\end{document}
producir esto
Los números 2 y 5 no están cumplidos. Y creo que el número 6 causaría problemas en el futuro.
Respuesta1
Así es como probablemente haría esto. No sugiero que esta sea una solución obvia, pero el código es conciso y se puede modificar fácilmente para todo el diagrama.
Si alguien desea probar esto en casa, hágamelo saber y le daré una copia del paquete experimental que utiliza. (Espero llevar su hermana a CTAN en breve, y tal vez ésta también, pero aún no ha llegado).
Esto usabosqueversión 2. No está probado con la versión 1.
\documentclass[tikz, border=10pt, multi]{standalone}
\usepackage{justtrees}% version 0.07; forest version 2
\begin{document}
\forestset{%
grouped/.style={
!u.l sep=2.5pt,
l=2.5pt,
no edge
}
}
\begin{justtree}
{
for tree={
draw,
text height=1.5ex,
l+=10mm,
edge={->, thick},
thick,
font=\sffamily
},
just format={fill=red!20, rotate=90, anchor=south, yshift=2.5mm, xshift=.75ex, font=\sffamily}
}
[one, left just=PhaseA]
[two]
[
[right of B, left just=PhaseB, no edge, tikz+={\foreach \i in {1,2,4,5} \draw [<-, thick] (.child anchor) -- (!uu\i.parent anchor); }
[C1
[C2, left just=PhaseC, grouped
[long C3, grouped
[D1, left just=PhaseD]
[D2]
]
]
]
]
]
[three]
[four]
\end{justtree}
\end{document}
Respuesta2
Su compilación MWE sin errores, pero el resultado parece ser diferente de su boceto... Como ya obtuvo respuestas a preguntas similares, cuyas respuestas también resuelven los problemas que enfatizó en la pregunta, hice (basado en mis respuestas anteriores) el siguiente diagrama de flujo :
con el siguiente código:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,calc,chains,fit,positioning,scopes}
%%%% for show flowchart only
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{3mm}
\begin{document}
%---------------------------------------------------------------%
% forth example %
%---------------------------------------------------------------%
\begin{tikzpicture}
%---------------------------------------------------------------%
suspend join/.code={\def\tikz@after@path{}},
node distance = 7mm and 5mm,
start chain = MR going right,
start chain = MB going below,
base/.style = {% common parameters
draw, minimum size=4ex, inner sep=1mm},
MR/.style = {% My Row nodes
base, on chain=MR},
MB/.style = {% My right Branch nodes
base, on chain=MB},
ML/.style = {% My Left branch nodes
draw=cyan!60!black, rounded corners, fill=cyan!30,
minimum size=4ex,
label=center:\rotatebox{90}{#1},
node contents={\rotatebox{90}{\phantom{#1}}}},
arrow/.style = {thick,-{Triangle[]}},
}
%---------------------------------------------------------------%
% FIRST ROW, names MR-1 ... MR-4
\node [MR] {one};
\node [MR] {two};
\node [MR] {tree};
\node [MR] {four};
% RIGHT BRANCH, names MB-1 ... MB-4
% start point is below of middle of the first row
\begin{scope}[every node/.style={MB,join=by arrow}]
\node[below=15mm of $(MR-1.south west)!0.5!(MR-4.south east)$]
{belong to Phase B}; % name=MB-1,
\node {belong to Phase C};
\node {belong to Phase C};
\node {also belong to Phase C};% name=MB-4,
\end{scope}
% LAST ROW, names MR-5 ... MR-6
\node[MR,below left=of MB-4.south] {D1};% name=MR-5,
\node[MR,below right=of MB-4.south] {D2};
% LEFT BRANCH,
\node (ML1) [ML=Phase A,left=of MR-1.west];
\node (ML2) [ML=Phase B,left=of MR-1.west |- MB-1];
\node (ML3) [ML=Phase C, inner ysep=0pt,
fit=(ML1 |- MB-2.north) (ML1 |- MB-4.south)];
\node (ML4) [ML=Phase D,left=of MR-1.west |- MR-5];
% ARROWS NOT DETERMINED BY "JOIN" MACRO
\foreach \i in {1,2,3,4}
\draw[arrow] (MR-\i) -- (MB-1);
\draw[arrow] (MB-4) -- (MR-5);
\draw[arrow] (MB-4) -- (MR-6);
\end{tikzpicture}
\end{document}
El código para ello está diseñado con los siguientes supuestos:
- la fila más ancha en la rama derecha es la fila superior, por lo que la rama izquierda está alineada con su lado izquierdo
- los nodos en la primera fila en las cadenas de la derecha están en la cadena que va hacia la derecha
- La rama derecha está debajo del centro de la primera fila. Puede determinarse simplemente por
$(MR-1.south west)!0.5!(MR-4.south east)$
. Los nodos en él están en cadena y van hacia abajo. - en la última fila hay solo dos nodos, por lo que están ubicados en relación con el nodo que está encima de ella
- Los nodos azules en la rama izquierda se ubican con respecto al lado izquierdo de la primera fila y el posicionamiento de los nodos pertenecientes en la rama derecha con excepción del nodo "Fase C", que se ajusta a las coordenadas determinadas por
(ML1 |- MB-2.north)
y(ML1 |- MB-4.south)
donde ML1 es la coordenada de la parte superior. nodo azul yMB-2
nombresMB-4
de nodos pertenecientes en la rama derecha - los nodos no están en la cuadrícula
- Los nodos en la fila superior, rama derecha, tienen estilo propio, que difieren en el nombre de la cadena.
- Los nodos azules también tienen estilo propio. Dado que el texto en los nodos, que se ajustan a algunas coordenadas, ya no está centrado, se explota la etiqueta colocada en el centro del nodo.
En caso de que el texto en los nodos en la rama derecha tenga texto en más líneas de las que puede agregar al estilo del nodo text width
y align=center
(o a la izquierda, depende de lo que desee que esté alineado).