
Я думаю, что всепроблемызадавался мной или другими в прошлом. Но моя общая проблема в том, что я не могу объединить все эти решения в реальную картину, которую я хочу нарисовать. Обычно хорошо разделить сложную проблему на более простые и спросить. Но здесь я пытаюсь задать сложный вопрос, потому что я испытал, что решения влияют (в моем случае отрицательно) друг на друга.
Описание потребностей/проблем:
- Левые узлы (
Phase
) должны быть повернуты. Я бы предпочел решение с\rotatebox
(node contents={\rotatebox{90}{#1}}}
). - Узлы (лучше было быряды) справа центрируются по горизонтали.
- Логично, что на картинке четырерядыи узлы слева и справа должны отображать это. Это означает, что один узел (например,
right of B
) центрирован вертикальнопротивего левый узел. Пожалуйста, посмотрите, чтоPhaseC
принадлежитC1
,C2
иlong C3
, так что вертикальное выравнивание должно представлять это. (обсуждается здесь) - Я думаю, что соединение узлов стрелкой не должно быть таким уж сложным.
- Все должно быть сделано относительно. Это означает нет
cm
,mm
,pt
или что-то в этом роде. - Число узлов не фиксировано. Может быть, в строке один узлов меньше, чем в строке четыре.
Некоторые решения:
\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}
Произвести это
Пункты 2 и 5 не выполнены. И я думаю, что пункт 6 создаст проблемы в будущем.
решение1
Вот как я бы, вероятно, на самом деле это сделал. Я не утверждаю, что это очевидное решение, но код лаконичен и его можно легко подправить для всей диаграммы.
Если кто-то захочет попробовать это дома, дайте мне знать, и я предоставлю вам копию экспериментального пакета, который он использует. (Я надеюсь вскоре отправить его сестру в CTAN, а может быть, и этот, но пока его там нет.)
Это используетлесверсия 2. Не тестировалось с версией 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}
решение2
Ваш MWE компилируется без ошибок, но результат, похоже, отличается от вашего наброска... Поскольку вы уже получили ответ на свои похожие вопросы, который также решает проблемы, на которые вы обратили внимание в своем вопросе, я составил (на основе своих предыдущих ответов) следующую блок-схему:
со следующим кодом:
\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}
Код для него разработан с учетом следующих предположений:
- Самый широкий ряд в правой ветке — верхний ряд, поэтому левая ветка выровнена по ее левой стороне.
- узлы в первом ряду в правых цепях находятся в цепочке, идущей вправо
- Правая ветвь находится ниже центра первой строки. Это можно просто определить по
$(MR-1.south west)!0.5!(MR-4.south east)$
. Узлы в ней находятся в цепочке и идут ниже - в последней строке только два узла, поэтому они расположены относительно узла над ним
- синие узлы в левой ветви расположены относительно левой стороны первого ряда и расположения принадлежащих узлов в правой ветви, за исключением узла «Фаза C», который вписывается в координаты, определяемые
(ML1 |- MB-2.north)
и(ML1 |- MB-4.south)
где ML1 — координата верхнего синего узла, аMB-2
иMB-4
имена принадлежащих узлов в правой ветви. - узлы не находятся в сетке
- узлы в верхнем ряду, правая ветвь имеет собственный стиль, который отличается именем цепи
- Синие узлы также имеют собственный стиль. Поскольку текст в узлах, которые соответствуют некоторым координатам, больше не центрируется, для текста используется метка, расположенная в центре узла.
В случае, если текст в узлах в правой ветви будет содержать текст в большем количестве строк, чем вы можете добавить в стиль узла text width
и align=center
(или слева, в зависимости от того, как вы хотите выровнять).