Controlar el dibujo del borde del nodo en una matriz tikz

Controlar el dibujo del borde del nodo en una matriz tikz

Estoy intentando dibujar una cuadrícula de nodos de un tamaño específico. Además, estoy haciendo agujeros en esta cuadrícula intentando que las celdas y, en particular, sus bordes interiores sean blancos. Para concretar esto, considere lo siguiente:

\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}

En general, supongamos que tenemos "islas" arbitrarias de glóbulos blancos en la matriz; en este caso, solo tenemos una isla (de tamaño 5), lo que significa que las celdas blancas abarcan un subgrafo conectado de la red anfitriona, pero podría haber varias islas de este tipo.

Queremos que los bordes interiores no se dibujen, pero los bordes exteriores deben dejarse intactos. Tal como están las cosas, los bordes exteriores se dibujan mostrando solo sus bordes, lo que los hace lucir grisáceos. Consulte a continuación el resultado no deseado:

ingrese la descripción de la imagen aquí

¿Cómo podemos controlar mejor cómo se dibujan los nodos y sus aristas? yo también veoesta preguntalo que podría ayudarme a dibujarlos de una manera más agradable: estoy haciendo esto mediante programación, por lo que parece bueno poder especificar las coordenadas de la isla en forma de lista.

Respuesta1

En lugar de dibujar un borde blanco, simplemente no dibujes ningún borde. De esa manera no obtendrás líneas grises (que en realidad son blancas sobre negro).

En el siguiente código, matrix of grid nodes = <rows> x <columns>configura una matriz TikZ con el número especificado de filas y columnas donde cada celda tiene \node{};su contenido. De forma predeterminada, cada uno de estos nodos será un archivo grid node.

Al usar las claves, se pueden especificar island(s)las celdas donde se debe usar a . grid island nodeA grid island nodees simplemente path only(es decir draw = none, fill = node, …), pero podría ser cualquier cosa, tal vez solo una coordenada (pero para eso sería necesario hacer a row sepo column sepwith; between originsde lo contrario, obtendrá una fila o columna de tamaño cero si una fila o columna completa contiene islas.

En lugar de eso, \node{};podríamos colocarlo \tikzgridnodeen cada celda, lo que \node[grid node]{};normalmente hace, pero no puede poner nada en una celda si es una isla (ni siquiera una coordenada).

Código

\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}

Producción

ingrese la descripción de la imagen aquí

Respuesta2

Una solución simple, tal vez un poco tosca, es definir el estilo de las celdas sin bordes:

\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}

ingrese la descripción de la imagen aquí

Respuesta3

El siguiente comando \islandstoma 3 argumentos. El primer argumento es el número de filas, el segundo argumento es el número de columnas y el tercer argumento es una lista de celdas en el formulario (<row>,<column>).

Este comando dibuja líneas horizontales y verticales. No se dibuja una línea horizontal si las celdas de arriba y de abajo están contenidas en la lista del tercer argumento. Lo mismo ocurre con las líneas verticales.

ingrese la descripción de la imagen aquí

\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}

información relacionada