Zeichnen Sie eine Hash-Tabelle horizontal

Zeichnen Sie eine Hash-Tabelle horizontal

Wie erstelle ich dieses Design?

Bildbeschreibung hier eingeben

Es ist möglich mit forest?

Antwort1

Eine Lösung mit tikz:

Bildbeschreibung hier eingeben

\documentclass{article}
\usepackage{tikz}
\usepackage{expl3}
\usepackage{xparse}

\begin{document}

\newlength{\cellsize}
\setlength{\cellsize}{6mm}

\tikzset{
  cell/.style = {
    draw,
    anchor=west,
    minimum width=\cellsize,
    minimum height=\cellsize,
    text width=\cellsize,
    inner sep=0pt,
    outer sep=0pt,
    line width=1pt,
    execute at begin node = {\small\centering}
  }
}

% current x coord
\newlength{\xcoord}
% current y coord
\newlength{\ycoord}

\ExplSyntaxOn
\tl_new:N \l_template_tl
\tl_set:Nn \l_template_tl {
  \node[cell,*1] at (*2) {*3};
}

\DeclareDocumentCommand{\drawnode}{O{}m}{
  % load template
  \tl_set_eq:NN \l_tmpb_tl \l_template_tl
  % fill node parameters
  \tl_set:Nn \l_tmpa_tl {#1}
  \regex_replace_once:nnN {*1} {\u{l_tmpa_tl}} \l_tmpb_tl
  
  % increment x coord
  \dim_add:Nn \xcoord {\cellsize}
  % fill node location
  \tl_set:Nx \l_tmpa_tl {\dim_use:N \xcoord, \dim_use:N \ycoord}
  \regex_replace_once:nnN {*2} {\u{l_tmpa_tl}} \l_tmpb_tl
  
  % fill node text
  \tl_set:Nn \l_tmpa_tl {#2}
  \regex_replace_once:nnN {*3} {\u{l_tmpa_tl}} \l_tmpb_tl
  
  % use node
  \tl_use:N \l_tmpb_tl
}
\ExplSyntaxOff

\begin{tikzpicture}
% initialize x, y coords before drawing
\setlength{\xcoord}{0mm}
\setlength{\ycoord}{0mm}

\drawnode[fill]{}
\drawnode{1}
\drawnode{2}
\drawnode{3}
\drawnode[draw=green]{4}
\drawnode[draw=green]{5}
\drawnode[draw=green]{6}

% draw another table
% initialize x, y coords before drawing
\setlength{\xcoord}{0mm}
\setlength{\ycoord}{-2cm}

\drawnode[draw=orange,fill=orange]{}
\drawnode{1}
\drawnode{2}
\drawnode{3}
\drawnode[draw=red]{4}
\drawnode[draw=blue]{5}
\drawnode[draw=green]{6}
\drawnode{7}
\end{tikzpicture}

\end{document}

Zusätzliche Informationen hinzufügen

Verwenden Sie die markierte Version von\drawnode

Bildbeschreibung hier eingeben

\documentclass{article}
\usepackage{tikz}
\usepackage{expl3}
\usepackage{xparse}

\begin{document}

\newlength{\cellsize}
\setlength{\cellsize}{6mm}

\tikzset{
  cell/.style = {
    draw,
    anchor=west,
    minimum width=\cellsize,
    minimum height=\cellsize,
    text width=\cellsize,
    inner sep=0pt,
    outer sep=0pt,
    line width=1pt,
    execute at begin node = {\small\centering}
  }
}

% current x coord
\newlength{\xcoord}
% current y coord
\newlength{\ycoord}

\ExplSyntaxOn
\tl_new:N \l_template_tl
\tl_set:Nn \l_template_tl {
  \node[cell,*1] at (*2) {*3};
}

\DeclareDocumentCommand{\drawnode}{sO{}m}{
  % load template
  \tl_set_eq:NN \l_tmpb_tl \l_template_tl
  % fill node parameters
  \tl_set:Nn \l_tmpa_tl {#2}
  \regex_replace_once:nnN {*1} {\u{l_tmpa_tl}} \l_tmpb_tl
  
  % increment x coord if it is not starred
  \IfBooleanF{#1}{\dim_add:Nn \xcoord {\cellsize}}
  % fill node location
  \tl_set:Nx \l_tmpa_tl {\dim_use:N \xcoord, \dim_use:N \ycoord}
  \regex_replace_once:nnN {*2} {\u{l_tmpa_tl}} \l_tmpb_tl
  
  % fill node text
  \tl_set:Nn \l_tmpa_tl {#3}
  \regex_replace_once:nnN {*3} {\u{l_tmpa_tl}} \l_tmpb_tl
  
  % use node
  \tl_use:N \l_tmpb_tl
}


\ExplSyntaxOff

\begin{tikzpicture}
% initialize x, y coords before drawing
\setlength{\xcoord}{0mm}
\setlength{\ycoord}{0mm}

\drawnode[fill]{}
\drawnode{1}
% starred command will not increment x coord
\drawnode*[draw=none,yshift=5mm]{\tiny id1}
\drawnode*[draw=none,yshift=8mm]{\tiny id2}
\drawnode{2}
\drawnode{3}
\drawnode[draw=green]{4}
\drawnode[draw=green]{5}
\drawnode[draw=green]{6}
\end{tikzpicture}

\end{document}

Antwort2

Wie ich in einem Kommentar erwähnt habe, kann dies mit einer einfachen Tabelle, xcolor und hhline durchgeführt werden:

\documentclass{article}
\usepackage{hhline, array}
\usepackage[table, svgnames]{xcolor}
\usepackage{bigstrut} 


\begin{document}

\sffamily\setlength{\bigstrutjot}{1ex}\setlength{\arrayrulewidth}{1pt}
\begin{tabular}{*{4}{!{\color{black}\vrule width 1pt}wc{3.2mm}}*{3}{|wc{3.2mm}}|}
\hhline{>{\arrayrulecolor{black}}---->{\arrayrulecolor{SeaGreen!60}}|---|<{\arrayrulecolor{black}} }
\cellcolor{black}\bigstrut & 1 & 2 & 3 & 4 & 5 & 6 \\
\hhline{>{\arrayrulecolor{black}}---->{\arrayrulecolor{SeaGreen!60}}|---|}
\end{tabular}

\end{document} 

Bildbeschreibung hier eingeben

Antwort3

Auch die Verwendung von „forest“ hierfür wäre nicht mein erster Gedanke, aber da der OP ausdrücklich nach „forest“ gefragt hat …

Wir verwenden einen Phantomknoten als Wurzel; alle anderen Knoten sind untergeordnete Knoten der Wurzel. Der Effekt überlappender Ränder wird durch Festlegen der TikZ-Option erreicht outer xsep=0. (Und die Knoten werden gezeichnet thick.)

\documentclass{article}
\usepackage{forest}

\begin{document}    
\begin{forest}
  [,phantom,s sep=0,for descendants={draw,thick,outer xsep=0}
    [\phantom{0},fill]
    [1]
    [2]
    [3]
    [4,for current and following siblings=green]
    [5]
    [6]
  ]
\end{forest}
\end{document}

Das Ergebnis für die ursprüngliche Anfrage

Die Z-Reihenfolge der Knoten kann mithilfe von gesteuert werden draw tree processing order. Dies ist der Nodewalk-Stil, der forest mitteilt, in welcher Reihenfolge Knoten gezeichnet werden sollen, siehe Abschnitt 3.4.3 des Handbuchs.

Am einfachsten lässt sich ein Nodewalk mit dem .nodewalk styleHandler definieren, siehe Abschnitt 3.8.8 des Handbuchs. Um das verrückt aussehende zu erhalten c1b7b4b5b6b2b3, schreiben Sie die Reihenfolge auf, in der Sie die Knoten zeichnen möchten ( 1745623; jede Zahl bedeutet „zum N-ten Kind gehen“; die Knoten werden in diesem Beispiel neu nummeriert, damit sie mit den Kindnummern übereinstimmen), trennen Sie die Zahlen durch b(zurückgehen (mit einem falschen Schritt)) und stellen Sie dem Ganzen c(aktuell; da die Wurzel ein Phantomknoten ist, bewirkt dies eigentlich nichts, aber es gibt uns einen Knoten, zu dem wir per zurückkehren können b). In diesem speziellen Fall, in dem sich jeder backzum Elternteil bewegt ( u), 1u7u4u5u6u2u3würde dies genauso gut funktionieren.

\documentclass{article}
\usepackage{forest}

\begin{document}
\begin{forest}
  draw tree processing order/.nodewalk style=c1b7b4b5b6b2b3,
  [,phantom,s sep=0,for descendants={draw,thick,outer xsep=0}
    [1,fill,text=white]
    [2,red]
    [3,green]
    [4,orange]
    [5,blue]
    [6,yellow]
    [7,brown]
  ]
\end{forest}
\end{document}

Steuern der Z-Reihenfolge von Knoten

verwandte Informationen