Kombinieren Sie Rechteckaufteilung mit Array

Kombinieren Sie Rechteckaufteilung mit Array

Ich möchte eine „komplizierte“ Figur zeichnen, wie unten gezeigt.

Was muss getan werden:

  1. Vergrößern Sie es, \hdashlineum es an die Lochbreite anzupassen (rot eingezeichnet).
  2. Entfernen Sie die gestrichelte Linie ( :) aus der ersten Reihe (wird von Hand ausgeführt).

MWE:

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{shapes.multipart}

\usepackage{amsmath}
\usepackage{arydshln}

\begin{document}

\begin{tikzpicture}
\node[rectangle split,rectangle split parts=2, draw, inner sep=+0pt] {
$\begin{array}{l|l|l}
n & loooooooooooooong & m\\
\end{array}$
\nodepart{two}
$\begin{array}{l@{{}={}}l:l@{{}={}}l}
a & 0  & b & 0\\
\hdashline
c & 0 & d & 0\\
\end{array}$};
\end{tikzpicture}

\end{document}

Ausgabe

Aktualisieren:

Dies sollte auch funktionieren, wenn das zweite Array mehr als zwei Zeilen enthält (z. B. 3 oder 4).

Was muss getan werden:

  1. Entfernen Sie die gestrichelte Linie ( :) aus der ersten Zeile (grünes Rechteck in der oberen Abbildung).
  2. Irgendwie haben die \draw[dashed,green]und \hlinenicht genau die gleiche y-Koordinate
  3. Irgendwie fügen die Helfer Leerzeichen hinzu
  4. Ersetzen Sie die fest codierte Zeilenbreite

Code:

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{shapes.multipart,calc}

\usepackage{amsmath}
\usepackage{arydshln}

\begin{document}

\begin{tikzpicture}
\node (n) [rectangle split,rectangle split parts=2, draw, inner sep=+0pt] {
$\begin{array}{l|l|l}
n & loooooooooooooong & m\\
\end{array}$
\nodepart{two}
$\begin{array}{l@{{}={}}l:l@{{}={}}l}
a & 0  & b & 0\\
\hline %only for position control
c & 0 & d & 0\\
c & 0 & d & 0\\
c & 0 & d & 0\\
\end{array}$};

%helper
\node[inner sep=0] (two north west) at ($(n.text split west)-(0,0.2pt)$) {}; %hardcoded
\node[inner sep=0] (two south west) at ($(n.south west)+(0,0.4pt)$) {}; %hardcoded
\node[inner sep=0] (two north east) at ($(n.text split east)-(0,0.2pt)$) {}; %hardcoded
\node[inner sep=0] (two south east) at ($(n.south east)+(0,0.4pt)$) {}; %hardcoded

\draw[dashed,green] ($(two south west)!0.75!(two north west)$) -- ($(two south east)!0.75!(two north east)$);

\end{tikzpicture}

\end{document}

Ich benutze die Helfer, weil a!0.75!b+ces so interpretiert wird (a!0.75!b)+cund ich nicht in der Lage bin, so etwas zu tun wiea!0.75!(b+c)

Antwort1

so was:

Bildbeschreibung hier eingeben

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}
\usepackage{amsmath}
\usepackage{arydshln}

\begin{document}
    \begin{tikzpicture}
\node (n) [rectangle split,rectangle split parts=2, draw,
           inner ysep=0pt] {
$    \begin{array}{ c|c|c }
n & loooooooooooooong & m\\
     \end{array}$
\nodepart{two}
$    \begin{array}{ r:l }
a = 0   & b = 0\\
c = 0   & d = 0\\
\end{array}$
    };
\draw[dashed] (n.two west) -- (n.two east); % <-- horizontal dashed line
    \end{tikzpicture}
\end{document}

Nachtrag: ich bin immer noch nicht sicher, wie Ihre Tabelle aussehen soll. Nachdem ich nun Ihre Frage bearbeitet habe, gehe ich davon aus, dass Ihre Tabelle im zweiten Teil des Knotens eine beliebige Anzahl Zeilen haben kann und Sie Gleichungen in Zeilen am Vorzeichen ausgerichtet haben möchten =. Zum Beispiel so:

Bildbeschreibung hier eingeben

in diesem Fall führt mein erster Vorschlag nicht zum gewünschten Ergebnis. Sie müssen die folgenden Änderungen vornehmen:

  • Verwenden Sie tabularxstattdessen die Umgebungarray
  • zum Ausrichten von Gleichungen bei sign˙= thetabularx` werden vier Spalten benötigt
  • Breite des Knotens definieren

    \documentclass{standalone}
    \usepackage{tikz}
    \usetikzlibrary{shapes.multipart}
    \usepackage{tabularx}
    \usepackage{arydshln}
    \newlength\tabwidth     % for defining node width
    
    \begin{document}
        \begin{tikzpicture}
    \settowidth\tabwidth{$\begin{array}{l|l|l}      % calculating node width
                            n & loooooooooooooong & m\\
                          \end{array}$}
    \node (n) [rectangle split,rectangle split parts=2, draw, inner sep=0pt] {
    $\begin{array}{l|l|l}
    n & loooooooooooooong & m\\
    \end{array}$
    \nodepart{two}
    \begin{tabularx}{\tabwidth}{@{}                 % table width is equal to node width
        >{\raggedleft\arraybackslash $}X<{$}@{$\,=\,$}
        >{\raggedright\arraybackslash$}X<{$}:
        >{\raggedleft\arraybackslash $}X<{$}@{$\,=\,$}
        >{\raggedright\arraybackslash$}X<{$}
                                 @{}}
        a & 0 & b & 1234\\
        \hdashline
      abc & 0 & d & 0\\
        \hdashline
     abcd & 0 & d & 0\\
        \hdashline
        c & 0 & d & 0\\
    \end{tabularx}
        };
        \end{tikzpicture}
    \end{document}
    

Antwort2

Dies ist eher ein Kommentar, aber für einen Kommentar ist es zu lang. Man kann die Linien ohne fest codierte Abstände zeichnen.

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{shapes.multipart,calc}

\usepackage{amsmath}
\usepackage{arydshln}

\begin{document}

\begin{tikzpicture}
\node (n) [rectangle split,rectangle split parts=2, draw, inner sep=+0pt] {
$\begin{array}{l|l|l}
n & loooooooooooooong & m\\
\end{array}$
\nodepart{two}
$\begin{array}{l@{{}={}}l:l@{{}={}}l}
a & 0  & b & 0\\
\hline %only for position control
c & 0 & d & 0\\
c & 0 & d & 0\\
c & 0 & d & 0\\
\end{array}$};
\pgfmathtruncatemacro{\NumRows}{4}
\foreach \X in {1,...,\numexpr\NumRows-1} % \numexpr trick from https://tex.stackexchange.com/a/477077/121799
{\coordinate (aux-\X) at ($(n.text split)!\X/\NumRows!(n.south)$);
\draw [blue,dashed] (aux-\X-|n.west) -- (aux-\X-|n.east);
}
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen