MWE

MWE

Ich versuche, eine „Tabelle“ einzuzeichnen tikzund sie allgemeiner so auszuarbeiten, dass es einfach ist, viele davon zu schreiben.

Die matrixBibliothek erleichtert das Platzieren ausgerichteter Knoten erheblich. Der nächste Schritt wäre die Möglichkeit, vertikale und horizontale Linien zeichnen zu können.

Ich habe mehrere Ansätze ausprobiert (einige davon „nur um sicherzugehen“):

  • Verwendung von Knotenankern, wie beispielsweise in der Antwort aufdiese Frage(funktioniert nicht, wenn die Knoten eine variable Höhe oder Breite haben, siehe die blauen und roten Linien unten)
  • Verwenden von Knoten für die Spalten oder Zeilen, Verwenden der fitBibliothek wie in den Antworten aufdiese Frage(besser als das vorherige, siehe orange Linie, aber immer noch einige Probleme, wenn die Zeile (bzw. Spalte) nicht so breit (bzw. hoch) ist wie die Matrix [siehe grüne Linie].

Es ist erwähnenswert, dass horizontale Linien gezeichnet werden können \hline(es fehlt jedoch die Anpassbarkeit von Tikz-Pfaden).

Die Frage ist also: Wie kann man derartige Linien einheitlich zeichnen?

Bearbeiten (weitere Informationen nach der ersten Antwort)

Ich verstehe, dass es möglich ist, die Ausrichtung der Anker zu erzwingen, indem man die Höhe, Tiefe und Breite jeder Zelle angibt. Aber ist das nicht genau das, was pgfbeim Zeichnen der Matrix getan wurde?

Der Kern der Frage wäre also, (falls dies überhaupt möglich ist) auf diese von berechneten Informationen (die Position der Schnittpunkte des Begrenzungsrahmens der Matrix und die Grenzen der Bereiche zwischen Zeilen und Spalten) nach dem Zeichnen der pgfMatrix zuzugreifen.

MWE:

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{matrix,fit}

\begin{document}

\begin{tikzpicture}%[every node/.style={draw=black!30}]
  \node[%
  matrix of nodes,%
  every node/.append style={%
    inner xsep=5pt,
    inner ysep=5pt,
    outer sep=0pt
  },
  row sep=0pt,
  column sep=0pt
  ] (M) {
    {} & 1 & 2 \\
    1 & 1 & 2 \\
    2 & 2 & 4 \\
    3 & 3 & 6 \\
    1000000 & 1000000 & 2000000 \\
  };
  \draw[red] (M-1-2.north west) -- (M-5-1.south east);
  \draw[blue] (M-1-1.north east) -- (M-5-1.south east);

  \node[fit=(M-1-3) (M-5-3),inner sep=0pt] (C3) {};
  \draw[orange!80!black] (C3.north west) -- (C3.south west);

  \node[fit=(M-2-1) (M-2-3),inner sep=0pt] (R2) {};
  \draw[green!50!black] (R2.north west) -- (R2.north east);
\end{tikzpicture}

\end{document}

Ausgabe:

Bildbeschreibung hier eingeben

Ausgabe mit Zellrändern:

Bildbeschreibung hier eingeben

Ähnliche Fragen:

Antwort1

Da alle Knoten horizontal in den Spalten zentriert sind, können Sie die calcBibliothek laden und verwenden

\draw[blue]({$(M-1-1)!.5!(M-1-2)$} |- M.north) -- ({$(M-1-1)!.5!(M-1-2)$} |- M.south);

um die blaue Linie zwischen der ersten und der zweiten Spalte zu zeichnen.

Um die grüne Linie zu erhalten, müssen Sie verwendenalleKnoten der zweiten Zeile innerhalb der fitOption:

\node[fit=(M-2-1) (M-2-2) (M-2-3),inner sep=0pt] (R2) {};
\draw[green!50!black] (R2.north -| M.west) -- (R2.north -| M.east);

Bildbeschreibung hier eingeben

\documentclass[tikz,margin=10pt]{standalone}
\usetikzlibrary{matrix,fit,calc}

\begin{document}
\begin{tikzpicture}%
  \node[%
  matrix of nodes,%
  inner xsep=0pt,% <- code added
  every node/.append style={%
    draw=lightgray,
    inner xsep=5pt,
    inner ysep=5pt,
    outer sep=0pt,
  },
  row sep=0pt,
  column sep=0pt
  ] (M) {
    {}& 1 & 20 \\
    {}& 1 & {} \\
    2 & 2 & 4 \\
    3 & 3 & 6 \\
    1000000 & 1000000 & 2000000 \\
  };
% horizontal lines
  \draw[blue]({$(M-1-1)!.5!(M-1-2)$} |- M.north) -- ({$(M-1-1)!.5!(M-1-2)$} |- M.south);
  \draw[orange!80!black]({$(M-1-2)!.5!(M-1-3)$} |- M.north) --({$(M-1-2)!.5!(M-1-3)$} |- M.south);
% vertical lines
    \node[fit=(M-2-1) (M-2-2) (M-2-3),inner sep=0pt] (R2) {};
    \draw[green!50!black] (R2.north -| M.west) -- (R2.north -| M.east);
\end{tikzpicture}
\end{document}

Es ist möglich, Makros zu definieren:

\documentclass[tikz,margin=10pt]{standalone}
\usetikzlibrary{matrix,fit,calc}

% \mvline[<style>]{<matrix name>}{<row number on the right hand side of the line>}
\newcommand\mvline[3][]{%
  \pgfmathtruncatemacro\hc{#3-1}
  \draw[#1]({$(#2-1-#3)!.5!(#2-1-\hc)$} |- #2.north) -- ({$(#2-1-#3)!.5!(#2-1-\hc)$} |- #2.south);
}
% \mhline[<style>]{<matrix name>}{<column number below of the line>}{<number of columns in a row>}
\newcommand\mhline[4][]{%
  \node[fit=(#2-#3-1),inner sep=0pt,outer sep=0pt](R){};
  \foreach \i in {1,...,#4}\node[fit=(R) (#2-#3-\i),inner sep=0pt,outer sep=0pt](R){};
  \draw[#1] (R.north -| #2.west) -- (R.north -| #2.east);
}
\begin{document}
\begin{tikzpicture}%
  \node[%
  matrix of nodes,%
  inner xsep=0pt,% <- code added
  nodes in empty cells,% <- code added, nodes also in empty cells
  every node/.append style={%
    %draw=lightgray,
    inner xsep=5pt,
    inner ysep=5pt,
    outer sep=0pt,
  },
  row sep=0pt,
  column sep=0pt
  ] (M) {
      & 1 & 20 \\
      &   & \huge T  \\
    2 & 2 & 4 \\
    3 & 3 & 6 \\
    1000000 & 1000000 & 2000000 \\
  };
% border of the table
    \draw[purple](M.south west) rectangle (M.north east);
% horizontal lines
    \mvline[blue]{M}{2}
    \mvline[orange]{M}{3}
% vertical lines
    \foreach \r in {2,...,5} {\mhline[green!50!black]{M}{\r}{3}}
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

text heightSie können mit , text width, und erzwingen, dass alle Knoten in der Matrix die gleiche Größe haben text depth. Passen Sie dann column sepund an row sep, sodass die Knoten kompakter sind.

MWE

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{matrix,fit}
\usepackage{calc}

\begin{document}

\begin{tikzpicture}%[every node/.style={draw=black!30}]
  \node[%
  matrix of nodes,%
  every node/.append style={%
    inner xsep=5pt,
    inner ysep=5pt, 
    draw=lightgray, % just to show node borders
    text height=\heightof{0},
    text width=\widthof{2000000},
    align=center
  },
  row sep=-\pgflinewidth,
  column sep=-.5\pgflinewidth,
  ] (M) {
    {} & 1 & 2 \\
    1 & 1 & 2 \\
    2 & 2 & 4 \\
    3 & 3 & 6 \\
    1000000 & 1000000 & 2000000 \\
  };
  \draw[red] (M-1-2.north west) -- (M-5-1.south east);
  \draw[blue] (M-1-1.north east) -- (M-5-1.south east);

  % \node[fit=(M-1-3) (M-5-3),inner sep=0pt] (C3) {};
  \draw[orange!80!black] (M-1-3.north west) -- (M-5-3.south west);

  % \node[fit=(M-2-1) (M-2-3),inner sep=0pt] (R2) {};
  \draw[green!50!black] (M-2-1.north west) -- (M-2-3.north east);
\end{tikzpicture}

\end{document}

Ausgabe

Bildbeschreibung hier eingeben

verwandte Informationen