Steuern der Knotenkantenzeichnung in einer Tikz-Matrix

Steuern der Knotenkantenzeichnung in einer Tikz-Matrix

Ich versuche, ein Raster aus Knoten einer bestimmten Größe zu zeichnen. Außerdem bohre ich Löcher in dieses Raster, indem ich versuche, die Zellen und insbesondere ihre inneren Ränder weiß zu machen. Um dies zu konkretisieren, beachten Sie Folgendes:

\documentclass[tikz]{standalone}
\usetikzlibrary{fit, matrix}

\begin{document}

\begin{tikzpicture}
\matrix [
    matrix of nodes,
    inner sep=0pt,                % no padding around the cells
    row sep=-\pgflinewidth,
    column sep=-\pgflinewidth,
    nodes={
        rectangle, draw=black, minimum height=11mm, minimum width=11mm,
        anchor=center, inner sep=0pt, outer sep=0pt
    },
    nodes in empty cells,
    name=table
] {
& & & & \\
& & |[white]| & & \\
& |[white]| & |[white]| & & \\
& & |[white]| & |[white]| & \\
& & & & \\
};

\end{tikzpicture}
\end{document}

Nehmen wir allgemein an, dass wir in der Matrix beliebige „Inseln“ aus weißen Zellen haben. In diesem Fall haben wir nur eine Insel (der Größe 5), was bedeutet, dass die weißen Zellen einen verbundenen Teilgraphen des Host-Gitters überspannen, es könnte jedoch mehrere solcher Inseln geben.

Wir möchten, dass die inneren Ränder nicht gezeichnet werden, die äußeren Ränder jedoch unberührt bleiben. Tatsächlich werden die äußeren Ränder so gezeichnet, dass nur ihre Kanten sichtbar sind, was sie gräulich erscheinen lässt. Die unerwünschte Ausgabe finden Sie unten:

Bildbeschreibung hier eingeben

Wie können wir besser kontrollieren, wie die Knoten und ihre Kanten gezeichnet werden? Ich sehe auchdiese Fragewas mir helfen könnte, diese schöner zu zeichnen: Ich mache das programmgesteuert, daher scheint es nett, die Inselkoordinaten in einer listenähnlichen Weise angeben zu können.

Antwort1

Anstatt einen weißen Rand zu zeichnen, zeichnen Sie einfach keinen Rand. Auf diese Weise erhalten Sie keine grauen Linien (die eigentlich weiß auf schwarz sind).

Im folgenden Code matrix of grid nodes = <rows> x <columns>wird eine TikZ-Matrix mit der angegebenen Anzahl von Zeilen und Spalten eingerichtet, wobei jede Zelle nur enthält \node{};. Standardmäßig ist jeder dieser Knoten ein grid node.

Mithilfe der island(s)Schlüssel können die Zellen grid island nodeangegeben werden, in denen stattdessen ein verwendet werden soll. Ein grid island nodeist einfach path only(dh draw = none, fill = node, …), könnte aber alles Mögliche sein, beispielsweise nur eine Koordinate (dafür müssten Sie jedoch ein row sepoder column sepmit verwenden between origins, da Sie sonst eine Zeile oder Spalte mit der Größe Null erhalten, wenn eine ganze Zeile oder Spalte Inseln enthält).

Stattdessen könnten wir in jede Zelle etwas \node{};platzieren , was normalerweise der Fall ist. Wenn es sich jedoch um eine Insel handelt, können wir in eine Zelle auch einfach gar nichts platzieren (nicht einmal eine Koordinate).\tikzgridnode\node[grid node]{};

Code

\documentclass[tikz]{standalone}
\makeatletter
\newcommand*\utilrepeat[2]{%
  \ifnum#1=1 \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
    {#2}{#2\expandafter\utilrepeat\expandafter{\the\numexpr#1-1\relax}{#2}}}
\makeatother
\tikzset{
  grid node/.style={
    shape=rectangle, draw=black, fill=lightgray, anchor=center,
    minimum size=+11mm, inner sep=+0pt, outer sep=+0pt},
%  grid island node/.style={shape=coordinate}, % no node, just a coordinate
  grid island node/.style=path only,         % node but no output
  tight matrices/.style={every outer matrix/.append style={inner sep=+0pt}},
  matrix of grid nodes/.style args={#1x#2}{
    matrix, tight matrices, nodes=grid node,
    row sep=+-\pgflinewidth, column sep=+-\pgflinewidth,
    execute at empty cell=\node{};,
    node contents=%
      \utilrepeat{#1}{%
        \utilrepeat{\pgfinteval{#2-1}}{\pgfmatrixnextcell}\pgfmatrixendrow}},
  island/.style args={#1-#2}{
    row #1 column #2/.append style={nodes=grid island node}},
  islands/.style={island/.list={#1}}}
\begin{document}
\tikz\node[matrix of grid nodes = 5 x 5, islands = {2-3, 3-2, 3-3, 4-3, 4-4}];
\end{document}

Ausgabe

Bildbeschreibung hier eingeben

Antwort2

Eine einfache, vielleicht etwas grobe Lösung durch die Definition eines Zellenstils ohne Rahmen:

\documentclass[border=6pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}
    \begin{tikzpicture}
\newcommand\nx{|[draw=none]|}
\matrix (m) [matrix of nodes,
             row sep=-\pgflinewidth,
             column sep=-\pgflinewidth,
             nodes = {draw,
                      minimum size=11mm, anchor=center,
                      inner sep=0pt, outer sep=0pt}
             ] 
{
a & b & c & d & e\\
f & g & \nx
        h & i & j\\
k & \nx l 
      & \nx m
          & n & o\\
p & q & \nx r 
          &  \nx s 
              & t\\
u & v & w & x & y\\
};
    \end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Antwort3

Der \islandsfolgende Befehl benötigt 3 Argumente. Das erste Argument ist die Anzahl der Zeilen, das zweite Argument ist die Anzahl der Spalten und das dritte Argument ist eine Liste von Zellen in der Form (<row>,<column>).

Dieser Befehl zeichnet horizontale und vertikale Linien. Eine horizontale Linie wird nicht gezeichnet, wenn die Zelle darüber und darunter in der Liste im dritten Argument enthalten ist. Gleiches gilt für vertikale Linien.

Bildbeschreibung hier eingeben

\documentclass[border=6pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\ExplSyntaxOn
\cs_generate_variant:Nn \str_if_in:nnT { neT }
\bool_new:N \l__islands_bool
\NewDocumentCommand { \islands } { mmm }
% #1 number of rows
% #2 number of columns
% #3 list of cells in the form (<row>,<column>)
  {
    \begin { scope }
      [
        shift = { ( mymatrix-1-1.north~west ) } ,
        x = 11 mm ,
        y = -11 mm
      ]
      \int_step_inline:nnn { 0 } {#1}
        {
          \int_step_inline:nn {#2}
            {
              \bool_set_true:N \l__islands_bool
              \str_if_in:neT {#3} { ( ##1 , ####1 ) }
                {
                  \str_if_in:neT {#3} { ( \int_eval:n { ##1 + 1 } , ####1 ) }
                    {
                      \bool_set_false:N \l__islands_bool
                    }
                }
              \bool_if:NT \l__islands_bool
                { \draw ( { ####1 - 1 } , ##1 ) --++ ( 1 , 0 ) ; }
            }
        }
      \int_step_inline:nnn { 0 } {#2}
        {
          \int_step_inline:nn {#1}
            {
              \bool_set_true:N \l__islands_bool
              \str_if_in:neT {#3} { ( ####1 , ##1 ) }
                {
                  \str_if_in:neT {#3} { ( ####1 , \int_eval:n { ##1 + 1 } ) }
                    {
                      \bool_set_false:N \l__islands_bool
                    }
                }
              \bool_if:NT \l__islands_bool
                { \draw ( ##1 , { ####1 - 1 } ) --++ ( 0 , 1 ) ; }
            }
        }
    \end { scope }
  }
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
\matrix (mymatrix) [
  matrix of nodes,
  inner sep=0pt,
  row sep=-\pgflinewidth,
  column sep=-\pgflinewidth,
  nodes={
    rectangle,
    minimum height=11mm,
    minimum width=11mm,
    anchor=center,
    inner sep=0pt,
    outer sep=0pt
  }
]
  {
    a & b & c & d & e\\
    f & g & h & i & j\\
    k & l & m & n & o\\
    p & q & r & s & t\\
    u & v & w & x & y\\
  };
\islands{5}{5}{(2,3),(3,2),(3,3),(4,3),(4,4)}
\end{tikzpicture}
\end{document}

verwandte Informationen