Tikz の概念/ライブラリを組み合わせて、相対的な位置合わせ/距離を持つ複雑な絵を描く

Tikz の概念/ライブラリを組み合わせて、相対的な位置合わせ/距離を持つ複雑な絵を描く

私はすべての問題過去に私や他の人から尋ねられたことがあります。しかし、私の全体的な問題は、これらすべての解決策を組み合わせて、私が描きたい本当の絵を描くことができないことです。通常、複雑な問題をより単純な問題に分割して質問するのは良いことです。しかし、ここでは、解決策が互いに影響し合う(私の場合は否定的)ことを経験したため、複雑な質問をしようとしています。

ここに画像の説明を入力してください

ニーズ/問題の説明:

  1. 左のノード ( ) を回転する必要があります。 ( )Phaseを使用したソリューションを希望します。\rotateboxnode contents={\rotatebox{90}{#1}}}
  2. ノード(より良いのは)は、右側の中央揃えで水平に配置されます。
  3. 論理的には4つの画像があります左右のノードはそれを表示する必要があります。つまり、1つのノード(例right of B)は垂直方向に中央揃えされます。に対してその左のノード。 が、、PhaseCに属していることを確認してください。垂直方向の配置はそれを表すはずです。(C1C2long C3ここで議論された
  4. 矢印でノードを接続するのはそれほど難しくないと思います。
  5. すべては相対的に行う必要があります。つまりcm、、、mmまたはptそれに類するものは使用しないということです。
  6. ノードの数は固定ではありません。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)$。その中のノードはチェーン状になっており、下に向かっています。
  • 最後の行には2つのノードしかないため、その上のノードに対して相対的に配置されます。
  • 左の枝の青いノードは、最初の行の左側と右の枝に属するノードの位置を基準に配置されます。ただし、ノード「フェーズ C」は、によって決定される座標に適合します。ここで(ML1 |- MB-2.north)(ML1 |- MB-4.south)ML1 は、一番上の青いノードの座標であり、MB-2MB-4の枝に属するノードの名前です。
  • ノードがグリッド内にありません
  • 上段のノード、右のブランチは独自のスタイルを持ち、チェーン名が異なります
  • 青いノードにも独自のスタイルがあります。座標に合うノード内のテキストは中央に配置されないため、テキストにはノードの中央に配置されたラベルが使用されます。

右側のブランチのノード内のテキストには、ノード スタイルに追加できる行数よりも多くのテキストが含まれることになります(text widthまたはalign=center、配置方法に応じて左側に追加できる行数よりも多くなります)。

関連情報