在 TikZ 中重现 TCP/IP 协议栈

在 TikZ 中重现 TCP/IP 协议栈

我一直在尝试在 TikZ 中重现以下 TCP/IP 协议栈。 在此处输入图片描述

我已经能够使用以下 MWE 来绘制它:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usepackage{lipsum}
\title{Figure of TCP-IP Stack}
\author{}
\date{October 2022}

\begin{document}
\maketitle
\section{Introduction}
\par In this section, an attempt will be made to draw the infamous TCP/IP Protocol stack using \LaTeX's \verb|tikz| package. It will be so much fun!

\begin{figure}
    \centering
    \begin{tikzpicture}
        \draw(0,0) rectangle (4,6);
        \node [] (l5) at (2,1) {Layer 5};
        \draw (0,0) rectangle (4,1.5);
        \node [] (l4) at (2,2) {Layer 4};
        \draw (0,1.5) rectangle (4,2.5);
        \node [] (l3) at (2,3) {Layer 3};
        \draw (0,2.5) rectangle (4,3.5);
        \node [] (l2) at (2,4) {Layer 2};
        \draw (0,3.5) rectangle (4,4.5);
        \node [] (l1) at (2,5) {Layer 1};

        \node [] (t5) at (7,1) {Physical layer};
        \draw[->] (l5) -- (t5);

        \node [] (t4) at (7,2) {Data Link Layer};
        \draw[->] (l4) -- (t4) ;

        \node [] (t3) at (7,3) {Network layer};
        \draw [->] (l3) --(t3);

        \node [] (t2) at (7,4) {Transport layer};
        \draw [->] (l2)--(t2);

        \node [] (t1) at (7,5) {Application layer};
        \draw [->] (l1)--(t1);
    \end{tikzpicture}
    \caption{My caption}
    \label{fig:tcp stack}
\end{figure}
\lipsum
\end{document}

tikz 中的图像有些粗糙,因为可以通过每个已定义节点的定义来判断。我想知道如何重新绘制它,使其看起来更美观,适合期刊出版物,就像上面给出的 powerpoint 图像一样。

答案1

这是一个使用chains库的解决方案(它跟踪所使用的前一个节点on chain并以正确的方式自动引用它above=of <last chain node>)和pin自动添加另一个节点并通过边自动将其连接到其父节点的键。

我不喜欢负量shorten <,但这是将引脚边缘延伸到父节点的最简单方法。

我使用循环count中的变量来对节点进行编号。\foreach\tikzchaincount

代码

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{chains,arrows.meta}
\begin{document}
\tikz[
  start chain=going above,
  node distance=+0pt,
  every pin edge/.style={-{Triangle[angle'=45]}, shorten <=+-.5cm},
  pin position=right,
  pin distance=+1.5cm,
  every on chain/.style={% not nodes!
    minimum  width=+3cm,
    minimum height=+1cm,
    draw, outer sep=+0pt}]
\foreach \t in {Physical layer,
                Data Link layer,
                Network Layer,
                Transport layer,
                Application layer}
  \node[on chain, pin=\t] {Layer \tikzchaincount};
\end{document}

输出

在此处输入图片描述

答案2

也许有了split rectangle\foreach循环事情会变得更加优雅?

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}
\usepackage{lipsum}

\title{Figure of TCP-IP Stack}
\author{}
\date{October 2022}

\begin{document}
\maketitle
\section{Introduction}
In this section, an attempt will be made to draw the infamous TCP/IP Protocol stack using \LaTeX's \verb|tikz| package. It will be so much fun!

\begin{figure}
    \centering
    \begin{tikzpicture}
        \node[rectangle split, rectangle split parts=5, draw, minimum width=4cm, inner sep=.33cm] (box) at (2,0) {
            Layer 5
            \nodepart{two}
            Layer 4
            \nodepart{three}
            Layer 3
            \nodepart{four}
            Layer 2
            \nodepart{five}
            Layer 1
        };
        
        \foreach \n/\l in {
            text/Application Layer, 
            two/Transport Layer, 
            three/Network Layer, 
            four/Data Link Layer, 
            five/Physical Layer
        } {
            \draw[->] ([xshift=-1cm]box.\n\space east) -- ++(2,0) node[right] {\l};
        }
    \end{tikzpicture}
    \caption{My caption}
    \label{fig:tcp stack}
\end{figure}
\lipsum
\end{document}

在此处输入图片描述

答案3

另一种选择是使用两列matrix

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usepackage{lipsum}

\title{Figure of TCP-IP Stack}
\author{}
\date{October 2022}

\begin{document}
\maketitle
\section{Introduction}
In this section, an attempt will be made to draw the infamous TCP/IP Protocol stack using \LaTeX's \verb|tikz| package. It will be so much fun!

\begin{figure}
    \centering
    \begin{tikzpicture}
        \matrix[matrix of nodes, nodes={minimum width=4cm, minimum height=1cm},
            column 1/.style={nodes=draw}, row sep=-\pgflinewidth] (Layers) {
                Layer 5 & Application Layer\\
            Layer 4 & Transport Layer \\
            Layer 3 & Network Layer \\
            Layer 2 & Data Link Layer \\
            Layer 1 & Physical Layer \\
        };
        
        \foreach \i in {1,...,5} 
                \draw[->] ([xshift=-5mm]Layers-\i-1.east)--([xshift=5mm]Layers-\i-2.west);
        
    \end{tikzpicture}
    \caption{My caption}
    \label{fig:tcp stack}
\end{figure}

\end{document}

在此处输入图片描述

更新:左对齐标签

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}
\begin{figure}
    \centering
    \begin{tikzpicture}
        \matrix[matrix of nodes, nodes={anchor=center, minimum height=1cm},
            column 1/.style={nodes={draw, minimum width=3.5cm}}, 
            column 2/.style={nodes={align=left, text width=3cm}},
            row sep=-\pgflinewidth,
            column sep=5mm] (Layers) {
                Layer 5 & Application Layer\\
            Layer 4 & Transport Layer \\
            Layer 3 & Network Layer \\
            Layer 2 & Data Link Layer \\
            Layer 1 & Physical Layer \\
        };
        
        \foreach \i in {1,...,5} 
                \draw[->] ([xshift=-5mm]Layers-\i-1.east)--(Layers-\i-2.west);
        
    \end{tikzpicture}
    \caption{My caption}
    \label{fig:tcp stack}
\end{figure}

\end{document}

在此处输入图片描述

相关内容