tikz画像内のノードの配置

tikz画像内のノードの配置

次の図の「コア 1」を残りのノードと揃えようとしています。

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

しかし、何らかの理由で、Core 1 ノードは他のノードと比較してオフセットされているように見えますが、その理由はよくわかりません。これが私のコードです:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{arrows, calc, chains, positioning, shapes}

\tikzset
{
core/.style = {
    rectangle,
    rounded corners,
    draw           = black, thick,
    text width     = 5em, 
    minimum height = 3em,
    align=center,
    on chain
            },
cache/.style = {
    core,
    draw           = gray,
            }
}% end of tikzset

\begin{document}

\begin{tikzpicture}[
node distance = 4mm, 
start chain = going below ]
\node [core, minimum width=4cm,midway]           (c1)  {Core 1};
\node [cache]  (l11) {L1 data\\  32 KB}; 
\node [cache,right=of l11]  (l12) {L1 \\  32 KB}; 
%shared l2 cache
\path   let \p1 = ($(l12.east)-(l11.west)$), 
        \n1 = {veclen(\x1,\y1)} in
    node [core,minimum width = \n1,
         below=of $(l11.south)!0.5!(l12.south)$]    (l13) {L2 \\ 256 KB};
\end{tikzpicture}
\end{document}

答え1

これを修正する方法は多数ありますが、これはその 1 つです。1 つの問題がon chain鍵でした。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{calc, positioning}

\tikzset
{
core/.style = {
    rectangle,
    rounded corners,
    draw           = black, thick,
    text width     = 5em, 
    minimum height = 3em,
    align=center,
            },
cache/.style = {
    core,
    draw           = gray,
            }
}% end of tikzset

\begin{document}

\begin{tikzpicture}[node distance = 4mm]
\node [core, minimum width=4.5cm,midway]           (c1)  {Core 1};
\node [cache,below=of c1.south west,anchor=north west]  (l11) {L1 data\\  32 KB}; 
\node [cache,below=of c1.south east,anchor=north east]  (l12) {L1 \\  32 KB}; 
%shared l2 cache
\path   let \p1 = ($(l12.east)-(l11.west)$), 
        \n1 = {veclen(\x1,\y1)} in
    node [core,minimum width = \n1,
         below=of $(l11.south)!0.5!(l12.south)$]    (l13) {L2 \\ 256 KB};
\end{tikzpicture}
\end{document}

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

この場合、下位ノードの幅を計算する必要はありませんが、他の場合に関係する可能性があるため、計算は残しておいたことに注意してください。中間層のノードから始めて、この幅の計算を使用して他のノードを構築することもできます。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{calc, positioning}

\tikzset
{
core/.style = {
    rectangle,
    rounded corners,
    draw           = black, thick,
    minimum width    = 5em, 
    minimum height = 3em,
    align=center,
            },
cache/.style = {
    core,
    draw           = gray,
            }
}% end of tikzset

\begin{document}

\begin{tikzpicture}[node distance = 4mm]
\node [cache]  (l11) {L1 data\\  32 KB}; 
\node [cache,right=of l11]  (l12) {L1 \\  32 KB}; 
%shared l2 cache
\path   let \p1 = ($(l12.east)-(l11.west)$), 
        \n1 = {veclen(\x1,\y1)} in
    node [core,minimum width = \n1,
         below=of $(l11.south)!0.5!(l12.south)$]    (c2) {L2 \\ 256 KB}
    node [core,minimum width = \n1,
         above=of $(l11.north)!0.5!(l12.north)$]    (c1) {Core 1}
         ;
\end{tikzpicture}
\end{document}

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

これにより、キャッシュ ノードが広くなっても引き続き良好な結果が得られます。

答え2

他の回答の小さなバリエーション:

\documentclass[tikz,border=5mm]{standalone}
\usetikzlibrary{positioning}

\begin{document}
    \begin{tikzpicture}[
  node distance = 4mm and 0mm,
box/.style args = {#1/#2}{draw=#1, minimum width=#2,
                          rounded corners=5, minimum height=10mm,
                          align=center},
box/.default    = gray/22mm
                        ]
\node (n1) [box=black/50mm]  {L2\\256 Kb};
\node (n21)[box, above right=of n1.north west] {L1 data\\32 Kb};
\node (n22)[box, above  left=of n1.north east] {L1 \\32 Kb};
\node (n3) [box=black/50mm, above=of n1 |- n21.north] {Core 1};
    \end{tikzpicture}
\end{document}

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

答え3

以下は友人のコードです。彼のコードは短くてシンプルです (これ以上シンプルにすることはできません)。エレガントなシンプルさでコードを書くのは正しいことでしょうか?

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

\documentclass[tikz,border=5mm]{standalone}
\begin{document}
\begin{tikzpicture}
\path[every node/.style={draw,rounded corners=5,minimum height=10mm,align=center}]
(0,0) node[minimum width=5cm]{Core 1}
(-1.5,-1.5) node[minimum width=2cm,draw=gray]{L1 data\\32 Kb}
(1.5,-1.5) node[minimum width=2cm,draw=gray]{L1\\32 Kb}
(0,-3) node[minimum width=5cm]{L2\\256 Kb};
\end{tikzpicture}
\end{document}

関連情報