![编辑](https://linux22.com/image/348380/%E7%BC%96%E8%BE%91.png)
我想在 TikZ 内部制作以下软件架构:
请参阅下面的我的代码:
\documentclass[border=2px]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, arrows}
\tikzset{
green/.style = {draw, rectangle, minimum width=1cm, minimum height=1cm, text centered, text width=1.2cm, font=\footnotesize, draw=black, fill=green!30},
blue/.style = {draw, rectangle, minimum width=6cm, minimum height=1cm, text centered, text width=5.0cm, font=\footnotesize, draw=black, fill=blue!30},
yellow/.style = {draw, rectangle, minimum width=6cm, minimum height=1cm, text centered, text width=5.0cm, font=\footnotesize, draw=black, fill=yellow!30},
}
\begin{document}
\begin{tikzpicture}[node distance=1.1cm]
\node (r1c1) [green] {VC++};
\node (r1c2) [green, right of=r1c1, xshift=0.5cm] {VB.NET};
\node (r1c3) [green, right of=r1c2, xshift=0.5cm] {C\#.NET};
\node (r1c4) [green, right of=r1c3, xshift=0.5cm] {Others};
\node (r2c1) [blue, below of=r1c2, xshift=0.8cm] {COM-API Interface};
\node (r3c1) [yellow, below of=r2c1] {Autodesk Inventor Application};
\draw (r1c1);
\draw (r1c2);
\draw (r1c3);
\draw (r1c4);
\draw (r2c1);
\draw (r3c1);
\end{tikzpicture}
\end{document}
下面是生成的图表:
生成的图表中的模块未正确对齐。有什么建议吗?
答案1
只是为了好玩,正如有人提议的那样tcolorbox
......
\documentclass{article}
\usepackage[most]{tcolorbox}
\tcbset{enhanced, fontupper=\bfseries, notitle, sharp corners, halign=center, valign=center}
\begin{document}
\begin{tcbitemize}[%
raster equal height=rows,
raster columns=4,
raster equal height,
raster every box/.style={height=2cm},
raster column skip=1mm,
raster row skip=1mm,
colback=green!70!black]
\tcbitem VC++
\tcbitem VB.NET
\tcbitem C\#.NET
\tcbitem Others
\tcbitem[colback=blue!40, raster multicolumn=4]
COM-API Interface
\tcbitem[colback=yellow!50, raster multicolumn=4]
Autodesk Inventor Application
\end{tcbitemize}
\end{document}
答案2
使用 chain 的另一种解决方案:
\documentclass[border=2px]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, arrows, chains, calc}
\tikzset{
green/.style = {draw, rectangle, minimum width=2cm, minimum height=1cm, text centered, text width=1.2cm, font=\footnotesize, draw=black, fill=green!30},
blue/.style = {draw, rectangle, minimum width=8cm+3\pgflinewidth, minimum height=1cm, text centered, text width=5.0cm, font=\footnotesize, draw=black, fill=blue!30},
yellow/.style = {draw, rectangle, minimum width=8cm+3\pgflinewidth, minimum height=1cm, text centered, text width=5.0cm, font=\footnotesize, draw=black, fill=yellow!30},
}
\begin{document}
\begin{tikzpicture}[start chain=1 going right,
start chain=2 going below, node distance=1mm]
\node [name=r1c1, on chain=1, green] {VC++};
\node [name=r1c2, on chain=1, green] {VB.NET};
\node [name=r1c3, on chain=1, green] {C\#.NET};
\node [name=r1c4, on chain=1, green] {Others};
\draw let \p1=($(r1c4.east)-(r1c1.west)$), \n1 = {veclen(\x1,\y1)} in
node [name=r2c1, on chain=2, blue, anchor=north west, yshift=-1mm,
minimum width=\n1-\pgflinewidth]
at (r1c1.south west) {COM-API Interface};
\draw let \p1=($(r1c4.east)-(r1c1.west)$), \n1 = {veclen(\x1,\y1)} in
node [name=r3c1, on chain=2, yellow, minimum width=\n1-\pgflinewidth] {Autodesk Inventor Application};
\end{tikzpicture}
\end{document}
答案3
我在 TikZ 中的解决方案是:使用给定的坐标,因为您可以更好地控制它们。要使用我的坐标,我必须将中间层和底层框的最小宽度调整为 8 厘米。
编辑
正如评论中所要求的,盒子之间应该有水平间隙。
因此,我outer sep=1mm
在样式定义中添加了选项。外部分隔符适用于框的左侧和右侧尺寸。因此,第一个和最后一个框的对齐将被破坏。我通过相应地在第一个和最后一个框的 x 坐标上添加一些空间来更正此问题。请查看我的 MWE 中的评论。
给你:
\documentclass[11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, arrows}
\tikzset{
green/.style = {draw, rectangle,
minimum width=1.6cm, minimum height=1cm,
%% NEW: added outer space
outer sep=1mm,
%% continued as before
text centered, text width=1.2cm, font=\footnotesize,
draw=black, fill=green!30},
blue/.style = {draw, rectangle,
minimum width=8cm, minimum height=1cm,
text centered, text width=5.0cm, font=\footnotesize,
draw=black, fill=blue!30},
yellow/.style = {draw, rectangle,
minimum width=8cm, minimum height=1cm,
text centered, text width=5.0cm, font=\footnotesize,
draw=black, fill=yellow!30},
}
\begin{document}
\begin{tikzpicture}
%% Define the nodes of the rectangles in the top layer.
%% Corrected the x-position of the VC++ and Other box.
\node at (-0.2,3) [green] {VC++} ;
\node at (2,3) [green] {VB.net} ;
\node at (4,3) [green] {C\#} ;
\node at (6.2,3) [green] {Others} ;
%% Node of the second/middle layer
\node at (3,2) [blue] {COM-API Interface} ;
%% Node of the bottom layer
\node at (3,1) [yellow] {Autodesk Inventor Applikation} ;
\end{tikzpicture}
\end{document}
结果(也经过编辑):