
내 생각엔 모두문제과거에 나 또는 다른 사람들이 요청한 적이 있습니다. 그러나 나의 전체적인 문제는 내가 그리고 싶은 실제 그림에 이 모든 해결책을 결합할 수 없다는 것입니다. 일반적으로 복잡한 문제를 더 간단한 문제로 분리하여 질문하는 것이 좋습니다. 하지만 여기서는 솔루션이 서로 영향을 미치는(내 경우에는 부정적) 것을 경험했기 때문에 복잡한 질문을 하려고 합니다.
요구사항/문제에 대한 설명:
- 왼쪽 노드(
Phase
)는 회전되어야 합니다. 나는\rotatebox
( ) 로 해결하는 것을 선호합니다node contents={\rotatebox{90}{#1}}}
. - 노드(더 나은 것은행) 오른쪽은 수평 중앙에 위치합니다.
- 논리적인 그림에는 4개가 있습니다행왼쪽과 오른쪽의 노드는 이를 표시해야 합니다. 이는 하나의 노드(예:
right of B
)가 수직 중심에 있음 을 의미합니다.~에 맞서왼쪽 노드. 가 , 및 에PhaseC
속하므로 수직 정렬이 이를 나타내도록 하십시오. (C1
C2
long C3
여기서 논의됨) - 화살표로 노드를 연결하는 것은 그리 어렵지 않을 것 같습니다.
- 모든 것은 상대적으로 이루어져야 합니다. 이는 아니오
cm
,mm
또는pt
이와 유사한 것을 의미합니다. - 노드 수는 고정되어 있지 않습니다. 행 1의 노드 수가 행 4의 노드보다 적을 수 있습니다.
일부 솔루션:
\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)$
. 그 안에 있는 노드는 체인에 있고 아래로 이동합니다. - 마지막 행에는 두 개의 노드만 있으므로 위의 노드에 상대적으로 배치됩니다.
- 왼쪽 분기의 파란색 노드는 첫 번째 행의 왼쪽을 기준으로 배치되고 ML1이 상단 좌표인
(ML1 |- MB-2.north)
경우 에 의해 결정되는 좌표에 맞는 노드 "Phase C"를 제외하고 오른쪽 분기에 속하는 노드의 위치가 지정됩니다.(ML1 |- MB-4.south)
파란색 노드 및MB-2
오른쪽MB-4
분기에 속한 노드의 이름 - 노드가 그리드에 없습니다
- 맨 윗줄의 노드, 오른쪽 가지에는 자체 스타일이 있으며 체인 이름이 다릅니다.
- 파란색 노드에도 고유한 스타일이 있습니다. 일부 좌표에 맞는 노드의 텍스트가 더 이상 중앙에 있지 않기 때문에 텍스트의 경우 노드 중앙에 위치한 레이블이 활용됩니다.
경우에 따라 오른쪽 가지에 있는 노드의 해당 텍스트에는 노드 스타일에 추가할 수 있는 것보다 더 많은 줄에 텍스트가 포함됩니다 text width
( align=center
또는 왼쪽은 정렬하려는 항목에 따라 다름).